추상 클래스
- 미완성 설계도. 템플릿.
- 자바는 변수 추상화 x.
- 추상 메서드를 포함하고 있는!
- 인스턴스 생성 불가.
abstract class 이름 {}
- 추상메서드를 포함한다는 점 외에는 일반 클래스와 다름 없음.
추상 메서드
abstract 리턴타입 이름();
추상
- 공통추출
- 덜 구체적. 디테일 버리기.
추상클래스 안에 추상 메서드 작성 이유
- 자손 클래스에서 추상 메서드 구현을 강요하기 위해서.
- 만약 추상메서드가 아닌 그저 {}비어있는 메서드를 구현하면 자손 클래스에서 해당 메서드를 구현하는 것이 필수가 아니기 때문.
- 이미 구현됐다 치고 호출이 가능함.
인터페이스
- 얼굴 사이. 두 대상 사이.
- 기본 설계도.
- 다중 상속 가능
- 추상 메서드와 상수만을 멤버로 가질 수 있음.
- 인스턴스 생성 불가.
interface 이름 {
public static final 타입 상수이름 = 값;
public abstract 메서드이름(매개변수들);
}
인터페이스 구현
- 인터페이스 구현은 implements
- 구현할 때 메서드 전부 구현해야 함.
- 만약 일부만 구현한다면, 해당 클래스에 abstract을 붙여 추상클래스로 만들어야 함.
인터페이스를 이용한 다형성
Fightable f = (Fightable)new Fighter();
or
Fightable f = new Fighter();
void attack(Fightable f){ ... }
* 단 Fightable은 구현한 클래스의 인스턴스만 가능.
- 인터페이스 타입의 매개변수 - 해당 인터페이스를 구한 클래스의 객체를 제공
- 인터페이스 타입의 반환타입 - 해당 인터페이스를 구현한 클래스의 객체를 반환
인터페이스의 장점
- 표준화가 가능
- 서로 관계 없는 클래스들에게 관계를 맺어줄 수 있음.
- 독립적인 개발 가능
- 개발 시간 단축
두 클래스 사이에 인터페이스를 두면 변경에 영향을 받지 않는다.
- 만약 A클래스가 B클래스의 인스턴스를 생성하고 호출한다면, 둘은 서로 직접적인 관계가 있음. A - B
- 이 경우, A를 작성하려면 B가 이미 작성되어 있어야 함.
- B가 변경되면 A도 영향을 받음.
- → 인터페이스를 사용! A - I - B 간접적 관계.
- 서로 영향을 받지 않음.
추상 클래스 vs 인터페이스
- 인터페이스는 iv가 없음
- 인터페이스가 추상화 정도가 더 높음
인터페이스 변경
- 인터페이스는 추상메서드 집합. 따라서 인터페이스 변경은?
디폴트 메서드와 static 메서드
인터페이스에 메서드를 추가하게 되면 해당 인터페이스를 구현한 자손들이 모두 그 메서드를 구현해야함,,
→ 몸통이 있는 디폴트 메서드 추가가 가능해짐.
interface hi{
void method();
default void newMethod(){}
}
문제) 기존의 메서드와 이름이 중복되어 충돌할 수 있음.
해결 규칙
- 여러 인터페이스의 디폴트 메서드 간의 충돌
- 인터페이스를 구현한 클래스에서 디폴트 메서드를 오버라이딩.
- 디폴트 메서드와 조상 클래스의 메서드 간의 출돌
- 조상 클래스의 메서드가 상속되고, 디폴트 메서드는 무시됨.