■ ISP
- 인터페이스를 각각 사용에 맞게 분리해야한다는 원칙
- SRP 원칙은 클래스의 단일 책임을 강조한다면, ISP는 인터페이스의 단일 책임을 강조
- 인터페이스를 사용하는 클라이언트를 기준으로 분리함으로써 클라이언트의 목적과 용도에 적합한 인터페이스 만 제공
■ ISP 적용 전
// 너무 많은 책임을 지는 인터페이스
public interface Worker {
void work();
void eat();
void sleep();
}
// 로봇도 이 인터페이스를 구현해야 함
public class Robot implements Worker {
@Override
public void work() {
System.out.println("로봇이 작업 중...");
}
@Override
public void eat() {
// 로봇은 먹지 않음 → 의미 없는 코드
throw new UnsupportedOperationException("로봇은 먹지 않아요");
}
@Override
public void sleep() {
// 로봇은 자지 않음 → 의미 없는 코드
throw new UnsupportedOperationException("로봇은 자지 않아요");
}
}
- 로봇처럼 일부 기능이 필요 없는 객체도 쓸데없는 메서드를 구현했기 때문에 ISP 위반
■ ISP 적용 후
// 인터페이스를 역할별로 분리
public interface Workable {
void work();
}
public interface Eatable {
void eat();
}
public interface Sleepable {
void sleep();
}
// 사람은 모든 기능을 사용
public class Human implements Workable, Eatable, Sleepable {
@Override
public void work() {
System.out.println("사람이 일합니다");
}
@Override
public void eat() {
System.out.println("사람이 식사합니다");
}
@Override
public void sleep() {
System.out.println("사람이 잠을 잡니다");
}
}
// 로봇은 일만 함
public class Robot implements Workable {
@Override
public void work() {
System.out.println("로봇이 일합니다");
}
}
- Robot 클래스는 자신에게 필요한 인터페이스만 구현하기 때문에, 메서드를 구현하지 않아도 된다.
정리)
- 인터페이스는 꼭 필요한 기능만 나누어 정의해야한다.
- 객체가 필요하지 않은 기능을 강제로 구현하지 않아야한다.
- 큰 인터페이스보다 작은 역할 단위의 인터페이스 분할이 유지보수성과 유연성을 높인다.
'JAVA' 카테고리의 다른 글
[JAVA] DIP (의존 관계 역전 원칙) (0) | 2025.04.12 |
---|---|
[JAVA] LSP (리스코프 치환 원칙) (0) | 2025.04.07 |
[JAVA] SRP (단일 책임 원칙) (0) | 2025.04.06 |
[JAVA] OCP (개방 폐쇄 원칙) (0) | 2025.04.06 |
[JAVA] 다형성(2) - abstract, 인터페이스 (0) | 2025.03.30 |