• 추상클래스
    • 하나 이상의 추상 메소드를 포함하는 클래스
    • 추상 메소드(abstract method)
      • 추상 메소드는 선언부만이 존재
      • 문법
        • abstract 반환타입 메소드이름(매개변수);
    • 추상클래스의 문법
      • abstract class 클래스이름 { abstract 반환타입 메소드이름(); ... }
    • 자식 클래스에서 추상클래스를 상속받으려면 abstract 메서드를 반드시 오버라이딩
    • 그러나, 추상메서드가 아닌 메서드는 구현없이 그대로 사용가능
    • 추상 클래스는 동작이 정의되지 않은 추상 메소드가 있어, 별도 인스턴스 생성 불가
  • 인터페이스
    • 인터페이스는 구현된 것이 없고, 선언만 있는 메소드로 구성. 즉, 실제 로직이 없는 abstract 메소드로만 구성.
    • 인터페이스의 생성
      • 접근제어자 interface 인터페이스이름 { int CONSTANT_VAR = 100; void display(); }
    • 자식클래스의 부모 인터페이스의 구현
      • class 클래스이름 implements 인터페이스이름 { ... }
    • 자식클래스가 인터페이스를 구현(상속)하려면 반드시 부모 인터페이스의 모든 메서드를 overring
      • 추상클래스와는 다르게 인터페이스는 모든 메서드가 abstract이므로
    • 인터페이스와 추상클래스의 차이
      • 추상클래스와는 다르게 오로지 추상메소드와 상수만을 포함
        • 추상클래스는 일반클래스와 마찬가지로, 생성자, 필드, 일반 메소드도 포함
      • 인터페이스는 다중상속을 지원
        • 추상클래스인 부모클래스를 다중상속받았을때, 메소드 사용 및 호출시 모호성 발생
          • 추상클래스는 모든 메서드가 abstract는 아님
          • 그에 따라 모든 메소드의 overring을 강제하는 것은 아님
          • 그러므로 다중상속시 중복과 모호성이 발생할수 있는 메소드 존재
        • 인터페이스를 사용할 경우, 반드시 모든 메서드를 구현(오버라이딩)해야하므로 다중상속의 모호성 해소
    • 인터페이스의 사용 이유
      • 미리 구현해야할 메서드를 지정함으로서 대규모 프로젝트 개발 시 일관되고 정형화된 개발을 위한 표준화
        • 클래스의 작성과 인터페이스의 구현을 동시에 진행할 수 있으므로, 개발 시간을 단축
        • 예시)List인터페이스를 표준으로 한쪽에서는 ArrayList관련한 클래스 개발, 다른 한쪽에서는 LinkedList 클래스 개발 가능
      • 하나의 부모타입으로 여러 자식객체를 다루는 다형성 구현 가능
        • 예시)
          • List<Integer> myList = new ArrayList<>();
          • List<Integer> myList = new LinkedList<>();
        • 부모클래스타입으로 자식클래스 객체를 참조
          • 자식은 항상 부모클래스의 멤버를 갖고 있으므로 가능
          • 자식 타입의 변수로는 부모 인스턴스를 참조할 수 없음
        • 다형성 설계를 통해 기존의 구현체(ex-ArrayList)를 다른 구현체(ex-LinkedList)로 변경시 용이
      • 다중상속(구현)을 가능하게 하기 위함