Open LenKIM opened 4 years ago
아래 코드를 보면 더욱 그렇다.
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(...는 ...를 써서 구현됨)"를 모형화할 때는 객체 합성을 사용하자
추상클래스
인터페이스
[참고자료]
자바8 이상의 추상클래스와 인터페이스의 기능만 보면 두 종류의 차이를 느끼기 어렵다.
아래 코드를 보면 더욱 그렇다.
그렇다면, 추상클래스와 인터페이스은 언제 써야 되는 걸까?
차이점은 주로 데이타 멤버와 메소드들에 대한 접근성.
추상클래스는 non-static 과 non-final 필드 및 public, private, protected 메소드를 사용 할 수 있다. 인터페이스는 public, static, final 을 상속할 수 있고 모든 상속 가능한 메소드는 public 이다.
추상클래스
인터페이스
[참고자료]
18