- 추상클래스
- 하나 이상의 추상 메소드를 포함하는 클래스
- 추상 메소드(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)로 변경시 용이
- 다중상속(구현)을 가능하게 하기 위함