티스토리 뷰

1. 추상 클래스(Abstract Class)란?

💡 추상 메소드
: 메소드의 기능이 없고 메소드의 헤더부만 존재하는 불완전한 메소드
💡 추상 메소드를 0개 이상 포함하는 클래스로 스스로 자신의 생성자를 활용한 인스턴스 생성이 불가능.
따라서 추상 클래스는 불완전한 클래스라고 볼 수 있다.
상속을 활용해 하위 클래스 타입의 인스턴스를 이용해서 인스턴스를 생성해야 한다.
추상 메소드를 하나라도 포함하면 불완전하다고 볼 수 있는 클래스이므로 반드시 추상 클래스가 되어야 한다.

2. 추상 클래스를 사용하는 이유

💡 스스로 인스터는 만들지 못하지만 다형성 적용을 위한 부모 타입 역할을 해낼 수 있다.
추상 메소드를 포함한 추상 클래스는 추상 메소드를 통해 자식 클래스에 오버라이딩에 대한 강제성을 부여할 수 있다.
(추상 클래스를 상속받는 자식 클래스는 반드시 추상 메소드를 오버라이딩 해야 한다.)
이는 필수 기능을 정의해 일관된 인터페이스(동일 기능)를 제공함에 있어 도움이 된다.

 

package com.ohgiraffers.section02.abstractclass;

public class Application {
    public static void main(String[] args) {

        /* 수업목표. 추상클래스와 추상메소드에 대해 이해할 수 있다. */
        /* 필기.
        *   추상클래스와 추상메소드
        *    < 추상클래스 >
        *    추상메소드를 0개 이상 포함하는 클래스를 추상클래스라고 한다.
        *    쉽게 말해 불완전한 클래스라고 생각할 수 있다.
        *    불완전한 클래스는 별도로 생성자를 통해 객체를 생성하지 못한다.
        *    (단, 자식 클래스의 객체가 생성될 때는 내부적으로 생성될 수 있다.)
        *
        * 필기.
        *  < 추상메소드 >
        *  메소드의 헤드(head)부만 있고 바디(body)부가 없는 메소드를 추상메소드라고 한다.
        *  쉽게 말해 불완전한 메소드라고 생각할 수 있다.
        *  불완전한 메소드를 하나라도 가진 클래스는 반드시 추상클래스가 되어야 한다.
        *  ex) public abstract void method();
        * */
        // 개념만 알자! 개발할 때는 사용 많이 안한다!
        // 추상 = 불완전한
//        Product product = new Product();        // 추상클래스는 객체 생성 X

        /* 설명. abstract 메소드를 구현한 온전한 자식 클래스는 인스턴스(객체)를 생성할 수 있다. */
        SmartPhone smartPhone = new SmartPhone();
        Product smartPhone2 = new SmartPhone();         // 추상클래스도 다형성 적용 됨(타입은 물려준다.)
        smartPhone.abstractMethod();
        smartPhone2.abstractMethod();                   // 동적바인딩에 의한 자식클래스의 오버라이딩 메소드 실행
    }
}

// 실행 결과
Product 클래스로부터 물려받은 abstractMethod를 오버라이딩한 메소드 호출됨...
Product 클래스로부터 물려받은 abstractMethod를 오버라이딩한 메소드 호출됨...
package com.ohgiraffers.section02.abstractclass;

public abstract class Product {     // 객체를 생성하지 못해서 오류 발생, 객체를 만들 필요가 없는 클래스

    private int nonStaticField;
    private static int staticField;

    public Product() {
    }

    public void nonStaticMethod() {

    }

    public static void staticMethod() {

    }

    /* 설명. 추상메소드가 하나 이상 존재하면 해당 클래스는 반드시 추상클래스가 된다. */
    public abstract void abstractMethod();          // 규약? 자식이 재정의해서 바디부를 만든다.
}
package com.ohgiraffers.section02.abstractclass;

public class SmartPhone extends Product{            // 오류가 규약! -> 오버라이드해라!

    public SmartPhone() {

        /* 설명. 추상클래스라도 자식 객체를 위해서는 객체가 생성된다. */
        super();
    }

    /* 설명. 추상메소드를 물려받은 자식 클래스(온전한)는 반드시 오버라이딩 해야한다.(강제성 부여, 규약) */
    @Override
    public void abstractMethod() {
        System.out.println("Product 클래스로부터 물려받은 abstractMethod를 오버라이딩한 메소드 호출됨...");
    }

    /* 설명. 추가적인 메소드도 작성할 수 있다. */
    public void printSmartPhone() {
        System.out.println("SmartPhone 클래스의 printSmartPhone 메소드 호출함...");
    }
}

3. 추상 클래스와 인터페이스의 공통점과 차이점

3-1. 추상 클래스와 인터페이스의 차이점

구분 추상 클래스 인터페이스
상속 가능 범위 단일 상속 다중 상속
키워드 extends 사용 implements 사용
추상 메소드 갯수 abstract 메소드 0개 이상 모든 메소드는 abstract
abstract 키워드 명시 명시적 사용 묵시적으로 abstract

3-2. 추상 클래스와 인터페이스의 공통점

구분 추상 클래스 인터페이스
자체 인스턴스 생성 생성 불가 생성 불가
다형성 적용 시 상위 타입
활용 가능 유무
가능 가능

 

규약이 점점 강해진다. 강제성이 높아진다.

 

'한화시스템 > 백엔드' 카테고리의 다른 글

[BE] JAVA_API_Object  (0) 2024.07.19
[BE] JAVA_인터페이스  (0) 2024.07.18
[BE] JAVA_다형성  (0) 2024.07.17
[BE] JAVA_상속_오버라이딩  (0) 2024.07.17
[BE] JAVA_상속_superkeyword  (0) 2024.07.17
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/10   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
글 보관함