- ISP(Interface Segregation Principle) : 인터페이스 분리 원칙
인터페이스 분리 원칙은 클라이언트가 사용하지 않는 메서드에 의존하지 않아야 한다는 원칙이다. 단일 책임 원칙(SRP)과 밀접한 관련이 있으며, 인터페이스를 작은 단위로 분리함으로써 단일 책임 원칙을 달성할 수 있다.
아래는 인터페이스 분리 원칙에 위배된 코드이다.
public interface Machine {
void print();
void scan();
void fax();
}
public class AllInOneMachine implements Machine {
public void print() {
System.out.println("Printing...");
}
public void scan() {
System.out.println("Scanning...");
}
public void fax() {
System.out.println("Faxing...");
}
}
public class PrintOnlyMachine implements Machine {
public void print() {
System.out.println("Printing...");
}
public void scan() {
throw new UnsupportedOperationException("This machine cannot scan.");
}
public void fax() {
throw new UnsupportedOperationException("This machine cannot fax.");
}
}
위의 코드에서는 Machine 인터페이스를 정의하고, AllInOne~ 와 PrintOnly~ 클래스가 구현한다.
AllInOneMachine 클래스는 모든 메서드를 구현하며, PrintOnlyMachine 클래스는 print() 메서드만 구현하고 나머지 두 메서드는 UnsupportedOperationException을 발생시키는데, 이렇게 하면 PrintOnlyMachine 클래스를 사용하는 클라이언트는 불필요한 메서드에 의존하게 된다.
아래는 인터페이스 분리 원칙이 적용된 코드이다.
public interface Printer {
void print();
}
public interface Scanner {
void scan();
}
public interface Faxer {
void fax();
}
public class AllInOneMachine implements Printer, Scanner, Faxer {
public void print() {
System.out.println("Printing...");
}
public void scan() {
System.out.println("Scanning...");
}
public void fax() {
System.out.println("Faxing...");
}
}
public class PrintOnlyMachine implements Printer {
public void print() {
System.out.println("Printing...");
}
}
위의 예시에서는 Printer, Scanner, Faxer 인터페이스를 정의하고, AllInOneMachine와 PrintOnlyMachine 클래스가 필요한 인터페이스를 구현한다.
이렇게 인터페이스를 분리함으로써, 클라이언트는 자신이 필요로 하는 인터페이스만 사용하게 된다.