728x90
반응형
SMALL
인터페이스 분리 원칙
Interface Segregation Principle, ISP
“클라이언트는 자신이 사용하지 않는 메서드에 의존 관계를 맺으면 안 된다.” - 로버트 C. 마틴
'특정 클라이언트를 위한 인터페이스 여러개가 범용 인터페이스 하나보다 낫다'
클라이언트가 필요하지 않는 기능을 가진 인터페이스에 의존해서는 안되고 최대한 인터페이스를 작게 유지해야 합니다.
인터페이스 분리 원칙을 위반한 계산기
원칙 위반 증상
필요하지 않은 기능을 강제로 구현해야하는 상황이 발생합니다.필요하지 않은 혹은 사용 못 하는 기능이 강제로 구현되어 사용하지 못하도록 예외처리를 해야하는 상황이 발생할 수 있습니다.
public class Calculator {
public int calculate(AbstractOperation operation, int firstNumber, int secondNumber){
return operation.operate(firstNumber, secondNumber);
}
}
public class Client {
public static void main(String[] args) throws Exception {
int firNum = 140;
int secNum = 60;
// 연산 결과만 출력
DisplayTypeA displayTypeA = new DisplayTypeA();
displayTypeA.displayResult(new AddOperation(), firNum, secNum);
// displayTypeA.displayResultWithOperator(new AddOperation(), firNum, secNum); // Error 발생
// 연산 과정까지 출력
DisplayTypeB displayTypeB = new DisplayTypeB();
displayTypeB.displayResultWithOperator(new AddOperation(), firNum, secNum);
// displayTypeB.displayResult(new AddOperation(), firNum, secNum); // Error 발생
}
}
public abstract class AbstractOperation {
public abstract int operate(int firstNumber, int secondNumber);
public abstract String getOperator();
}
public interface Display {
public abstract void displayResult(AbstractOperation operation, int firstNumber, int secondNumber) throws Exception;
public abstract void displayResultWithOperator(AbstractOperation operation, int firstNumber, int secondNumber) throws Exception;
}
// 연산 결과만 출력
public class DisplayTypeA extends Calculator implements Display {
@Override
public void displayResult(AbstractOperation operation, int firstNumber, int secondNumber) {
int answer = operation.operate(firstNumber, secondNumber);
System.out.println(answer);
}
@Override
public void displayResultWithOperator(AbstractOperation operation, int firstNumber, int secondNumber) throws Exception {
throw new Exception("동작 불가");
}
}
// 연산 과정을 포함한 출력
public class DisplayTypeB extends Calculator implements Display {
@Override
public void displayResult(AbstractOperation operation, int firstNumber, int secondNumber) throws Exception {
throw new Exception("동작 불가");
}
@Override
public void displayResultWithOperator(AbstractOperation operation, int firstNumber, int secondNumber) {
int answer = operation.operate(firstNumber, secondNumber);
String operator = operation.getOperator();
System.out.println(firstNumber + " " + operator + " " + secondNumber + " = " + answer);
}
}
public class AddOperation extends AbstractOperation {
@Override
public int operate(int firstNumber, int secondNumber) {
return firstNumber + secondNumber;
}
@Override
public String getOperator() {
return "+";
}
}
public class SubstractOperation extends AbstractOperation {
@Override
public int operate(int firstNumber, int secondNumber) {
return firstNumber - secondNumber;
}
@Override
public String getOperator() {
return "-";
}
}
public class MultiplyOperation extends AbstractOperation {
@Override
public int operate(int firstNumber, int secondNumber) {
return firstNumber * secondNumber;
}
@Override
public String getOperator() {
return "*";
}
}
public class DivideOperation extends AbstractOperation {
@Override
public int operate(int firstNumber, int secondNumber) {
return firstNumber / secondNumber;
}
@Override
public String getOperator() {
return "/";
}
}
필요하지 않은 기능을 강제로 구현하고 있습니다.
사용하지 못하도록 예외처리를 구현하고 있습니다.
원칙 적용 방법
필요하지 않은 기능을 강제로 구현하지 않도록 인터페이스를 분리합니다.
연산 결과를 보여주는 방법마다 인터페이스를 구현합니다.
DisplayResult : 인터페이스, 연산결과만 출력
displayResult : 추상 메서드
DisplayWithOperator : 인터페이스, 연산과정 포함 출력displayResultWithOperator : 추상 메서드
728x90
반응형
LIST
'개발 > JAVA' 카테고리의 다른 글
생성자와 세터의 차이 (0) | 2023.02.10 |
---|---|
의존성 역전 원칙 (0) | 2023.01.27 |
리스코프 치환 원칙 (0) | 2023.01.27 |
개방-폐쇄 원칙 (0) | 2023.01.27 |
단일 책임 원칙 (0) | 2023.01.27 |