YJ/관련 이론
[SOLID] ISP_인터페이스 분리 원칙
Team DAON
2022. 9. 25. 01:17
[ISP]
- "하나의 일반적인 인터페이스보다는 여러 개의 구체적인 인터페이스가 낫다"
- 목적과 관심이 다른 클라이언트들은 각각의 인터페이스를 통해 분리
- 하나의 인터페이스는 하나의 역할에 대한 기능만 수행
- 타기능 완전 삭제 or 별도의 인터페이스 생성
- 클라이언트의 목적과 용도에 필요한 인터페이스만 제공
- 기능을 더 작은 기능들의 집합으로 쪼개서 필요한 기능만 수행
- 어떤 클래스가 다른 클래스에 종속될 때는 가능한 최소한의 인터페이스만 사용
- 자신이 사용하지 않는 인터페이스는 구현하지 않아야 함
- SRP(단일 책임 원칙)과 유사한 목표
- SRP → 클래스 관련
- ISP → 인터페이스 관련
[Example]
- Bad Example
- 원하는 않는 기능까지 모두 overriding해야 구현 가능
// ISP Bad Example
// 원하지 않은 함수까지 모두 overriding
interface DogCare{
String wash();
String eat();
String walk();
}
class AllCare implements DogCare{
@Override
public String wash(){
return "Wash";
}
@Override
public String eat(){
return "Eat";
}
@Override
public String walk(){
return "Walk";
}
}
public class MyClass {
public static void main(String args[]) {
AllCare dubucare = new AllCare();
System.out.println("Today's care : " + dubucare.wash());
System.out.println("Today's care : " + dubucare.eat());
System.out.println("Today's care : " + dubucare.walk());
}
}
- Good Example
- 필요한 interface만 implements해 구현 가능
// ISP Good Example
// 필요한 함수만 overriding 가능
interface DogWash{
String wash();
}
interface DogEat{
String eat();
}
interface DogWalk{
String walk();
}
class RainyCare implements DogWash, DogEat{
@Override
public String wash(){
return "Wash";
}
@Override
public String eat(){
return "Eat";
}
}
class SunnyCare implements DogWash, DogEat, DogWalk{
@Override
public String wash(){
return "Wash";
}
@Override
public String eat(){
return "Eat";
}
@Override
public String walk(){
return "Walk";
}
}
public class MyClass {
public static void main(String args[]) {
RainyCare rainycare = new RainyCare();
SunnyCare sunnycare = new SunnyCare();
System.out.println("Rainy Day care : " + rainycare.wash());
System.out.println("Rainy Day care : " + rainycare.eat());
System.out.println("Sunny Day care : " + sunnycare.wash());
System.out.println("Sunny Day care : " + sunnycare.eat());
System.out.println("Sunny Day care : " + sunnycare.walk());
}
}