ISP(Interface Segregation Principle)
인터페이스 분리 원칙이란 클라이언트가 자신이 사용하지 않는 메서드에 의존하지 않아야 한다는 것을 말한다. 인터페이스 분리 원칙은 큰 덩어리의 인터페이스들을 구체적이고 작은 단위들로 분리시킴으로써 클라이언트들이 꼭 필요한 메서드들만 사용할 수 있게 한다. 이와 같은 작은 단위들을 역할 인터페이스라고 부른다. 인터페이스 분리 원칙을 통해 시스템의 내부 의존성을 약화시켜 리팩토링, 수정, 재배포를 쉽게 할 수 있다.
ISP의 예시를 살펴보자.
public interface Phone {
void call();
void camera();
void sms();
}
public class BasicPhone implements Phone {
@Override
public void call() {
System.out.println("Calling...");
}
@Override
public void camera() {
// Unsupported
throw new UnsupportedOperationException();
}
@Override
public void sms() {
// Unsupported
throw new UnsupportedOperationException();
}
}
public class SmartPhone implements Phone {
@Override
public void call() {
System.out.println("Calling...");
}
@Override
public void camera() {
System.out.println("Taking...");
}
@Override
public void sms() {
System.out.println("Sending...");
}
}
위 코드에서 BasicPhone 클래스는 카메라와 SMS 기능이 없는데도 불구하고 메서드를 정의하고 있다. 이는 ISP에 어긋나므로 다음과 같이 기능별로 인터페이스를 분리해서 필요한 기능만 구현하는 것이 바람직해 보인다.
public interface Call {
void call();
void dial();
}
public interface Camera {
void takePhoto();
void takeVideo();
}
public interface Sms {
void sendText();
}
public class BasicPhone implements Call {
@Override
public void call() {
System.out.println("Calling...");
}
@Override
public void dial() {
System.out.println("Dial");
}
}
public class SmartPhone implements Call, Camera, Sms {
@Override
public void call() {
System.out.println("Calling...");
}
@Override
public void dial() {
System.out.println("Dial");
}
@Override
public void takePhoto() {
System.out.println("Take Photo...");
}
@Override
public void takeVideo() {
System.out.println("Take Video...");
}
@Override
public void sendText() {
System.out.println("Send Text...");
}
}
public class Main {
public static void main(String[] args) {
Call basicPhone = new BasicPhone();
basicPhone.call();
}
}
Reference
'객체지향' 카테고리의 다른 글
| [객체지향] 디자인 패턴 (0) | 2022.04.29 |
|---|---|
| [객체지향] SOLID(5) - DIP(의존관계 역전 원칙) (0) | 2022.03.01 |
| [객체지향] SOLID(3) - LSP(리스코프 치환 원칙) (0) | 2022.03.01 |
| [객체지향] SOLID(2) - OCP(개방-폐쇄 원칙) (0) | 2022.03.01 |
| [객체지향] SOLID(1) - SRP(단일 책임 원칙) (0) | 2022.03.01 |