LenKIM / everyone-is-effective-java-study

다우기술 연구소 스터디 저장소
8 stars 1 forks source link

Abstract class와 Interface 차이 #17

Open LenKIM opened 4 years ago

LenKIM commented 4 years ago

자바8 이상의 추상클래스와 인터페이스의 기능만 보면 두 종류의 차이를 느끼기 어렵다.

아래 코드를 보면 더욱 그렇다.

public interface Flyable {

    String interfaceConstant = "Test";

    default void interfaceTest(){
        int a = 10;
        System.out.println(a);
    };

    static void staticTest(){
        int a = 15;
        System.out.println(a);
    }

//    public abstract void test3();

}

public abstract class Fly {

    final String abstractConstant = "Test";

    final void abstractFinalTest(){
        System.out.println("abstractFinalTest");
    };

    public void abstractPublicTest(){
        System.out.println("abstractPublicTest");
    };

//    abstract void abstractTest();
}

public class JpaMain extends Fly implements Flyable {

    public void temp(){

        //Abstract
        abstractFinalTest();
        abstractPublicTest();
        System.out.println(abstractConstant);

        //Interface
        interfaceTest();
        Flyable.staticTest();
        System.out.println(interfaceConstant);
    }

//abstractFinalTest
//abstractPublicTest
//Test
//10
//15
//Test
}

그렇다면, 추상클래스와 인터페이스은 언제 써야 되는 걸까?

차이점은 주로 데이타 멤버와 메소드들에 대한 접근성.

추상클래스는 non-static 과 non-final 필드 및 public, private, protected 메소드를 사용 할 수 있다. 인터페이스는 public, static, final 을 상속할 수 있고 모든 상속 가능한 메소드는 public 이다.

모 출판사의 편집자도 읽었다는 명저 Effective C++ (3판)의 32번과 38번 항목은 이렇다.

항목 32: public 상속 모형은 반드시 "is-a(...는 ...의 일종이다)"를 따르도록 만들자
항목 38: "has-a(...는 ...를 가짐)" 혹은 "is-implemented-in-terms-of(...는 ...를 써서 구현됨)"를 모형화할 때는 객체 합성을 사용하자

추상클래스

인터페이스

[참고자료]