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