본문은 Effective Java를 읽고 정리한 내용을 기반으로 작성된 글입니다.
추상 클래스 >인터페이스 >인터페이스+추상 골격 구현 클래스
[인터페이스와 추상 클래스]
☑️ 추상 클래스
- 단일 상속만 가능
- 구현 → 추상 클래스의 하위 클래스가 된다.
- 기존 클래스 위에 새로운 추상 클래스를 끼워넣기는 어렵다.
☑️ 인터페이스
- 다중 상속 가능
- 구현 → 같은 타입으로 취급된다.
- 기존 클래스에도 손쉽게 새로운 인터페이스를 구현해넣을 수 있다. → 믹스인 정의에 안성맞춤
☑️ 계층구조가 없는 타입 프레임워크
ex) 다음 코드는 아무런 문제가 되지 않는다.
public interface Singer {
AudioClip sing(Song song);
}
public interface SongWriter{
Song compose(int chartPosition);
}
interface SingerSongWriter extends Singer, SongWriter{
AudioClip strum();
void actSensitive();
}
+) 필요에 의해 새로운 메서드까지 추가하여 새로운 인터페이스로 정의할 수도 있다.
하지만 이걸 클래스로 구현하려면?
가능한 조합 전부를 각각의 클래스로 정의한 고도비만 계층구조가 만들어지게 된다.
- 속성이 n개라면 지원해야 할 조합의 수는 2^n개 → 조합 폭발 🌋
☑️ 인터페이스의 제한
- 인스턴스 필드를 가질 수 없다
- public이 아닌 정적 멤버를 가질 수 없다
- private 정적 메서드는 예외
- 내가 만들지 않은 인터페이스에는 디폴트 메서드를 추가할 수 없다
: 인터페이스가 오로지 메서드 시그니처를 정의함으로서 일관성 있는 동작을 보장하기 위한 제한
..
[템플릿 메서드 패턴]
: 인터페이스와 추상 골격 구현(skeletal implementation) 클래스를 함께 제공 → 인터페이스와 추상 클래스의 장점을 모두 취하는 방법
- 인터페이스로 타입을 정의, 디폴트 메서드 제공
- 골격 구현 클래스는 나머지 메서드들까지 구현
- Interface(인터페이스) → AbstractInterface(골격 구현 클래스)
ex)
// 템플릿 메서드 패턴을 사용한 인터페이스 정의
public interface MyTemplateInterface {
// 기반 메서드
default void baseMethod() {
System.out.println("기반 메서드 실행");
}
// 템플릿 메서드
default void templateMethod() {
baseMethod(); // 기반 메서드 호출
specificMethod(); // 구체적인 메서드 호출
}
// 구체적인 메서드 - 구현 클래스에서 구현해야 함
void specificMethod();
}
- 인터페이스 내에서 다른 메서드들의 구현에 사용되는 기반 메서드 선정
- 기반 메서드를 사용하여 직접 구현할 수 있는 메서드를 모두 디폴트 메서드로 제공
// 인터페이스 구현하는 클래스
public class MyClass implements MyTemplateInterface {
@Override
public void specificMethod() {
System.out.println("구체적인 메서드 실행");
}
}
// 사용 예시
public class Main {
public static void main(String[] args) {
MyClass obj = new MyClass();
obj.templateMethod(); // 템플릿 메서드 호출
}
}
→ 인터페이스를 통해 공통적인 동작을 정의하고, 구현 클래스에서는 특화된 동작을 제공할 수 있다.
☑️ 골격 구현 클래스는
- 추상 클래스처럼 구현을 도와주는 동시에
- 추상 클래스로 타입을 정의할 때의 심각한 제약에서는 자유롭다.
[핵심 정리]
- 일반적으로 다중 구현용 타입으로는 인터페이스가 적합하다.
- 복잡한 인터페이스라면 구현하는 수고를 덜어주는 골격 구현을 함께 제공하는 방법을 고려하자.
- 하지만 ‘최대한’ 인터페이스의 디폴트 메서드로 제공하는게 좋다.
어려워
참고
https://velog.io/@gale4739/Spring-Boot-Interface-골격-구현-클래스-클래스-구조-변경Feat.-Composition
'Book > 이펙티브 자바' 카테고리의 다른 글
[Effective Java] item 21+22. 인터페이스는 구현하는 쪽을 생각해 설계하라, 인터페이스는 타입을 정의하는 용도로만 사용하라 (0) | 2023.12.22 |
---|---|
[Effective Java] item 19. 상속을 고려해 설계하고 문서화하라. 그러지 않았다면 상속을 금지하라 (0) | 2023.12.18 |
[Effective Java] item 18. 상속보다는 컴포지션을 사용하라 * (1) | 2023.10.06 |