etc

Interface Separation Principle

ISP (인터페이스 분리 원칙)

ISP(Interface Separation Principle)는 SOLID 원칙의 I를 맡고 있는 원칙으로 Wikipedia에서는 아래와 같이 설명한다.

1
2
3
4
5
6
인터페이스 분리 원칙은 클라이언트가 자신이 이용하지 않는 메서드에 의존하지 않아야 한다는 원칙이다.
인터페이스 분리 원칙은 큰 덩어리의 인터페이스들을 구체적이고 작은 단위들로 분리시킴으로써
클라이언트들이 꼭 필요한 메서드들만 이용할 수 있게 한다. 이와 같은 작은 단위들을
역할 인터페이스라고도 부른다. 인터페이스 분리 원칙을 통해 시스템의 내부 의존성을 약화시켜
리팩토링, 수정, 재배포를 쉽게 할 수 있다. 인터페이스 분리 원칙은 SOLID 5원칙의 하나이며,
GRASP의 밀착 원칙과 비슷하다.

SOLID 원칙 하나하나가 그렇듯 표면적인 설명을 보면 무슨 말인지 당장 이해가 되질 않는다.
하지만 이 역시 다른 원칙과 같이 예제를 통해 보면 이해하기 쉬운 원칙 중 하나이다.

위의 설명을 쉽게 풀어서 설명하자면 인터페이스 분리 원칙은 하나의 인터페이스에 여러 역할을 몰아넣는 것이 아니라, 인터페이스를 역할에 맞게 분리하라는 것이다.

예제를 통해 좀 더 자세하게 살펴보자.


다음과 같이 Person 인터페이스가 있다.

1
2
3
4
5
interface Person {
void eat();

void work();
}

그리고 이를 상속받은 DeveloperHighSchooler 라는 두 클래스가 있다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class Developer implements Person {
@Override
public void eat() {
System.out.println("I'm eating 구내식당 food");
}

@Override
public void work() {
System.out.println("I'm developing");
}
}

class HighSchooler implements Person {
@Override
public void eat() {
System.out.println("I'm eating 급식");
}

@Override
public void work() {
System.out.println("Umm... What should I do..??");
}
}

여기에서 HighSchoolerPerson 인터페이스를 상속 받기 때문에 필요하지 않은 기능인 work에도 의존성을 갖게된다. Person 인터페이스의 역할이 필요 이상으로 크기 때문에 생긴 일이다.
그렇기 때문에 Person 인터페이스는 분리될 필요가 있다.

1
2
3
4
5
6
7
interface Person {
void eat();
}

interface Worker extends Person {
void work();
}

그래서 위에 DeveloperHighSchooler를 다시 구현한다면 아래와 같다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class Developer implements Worker {
@Override
public void eat() {
System.out.println("I'm eating 구내식당 food");
}

@Override
public void work() {
System.out.println("I'm developing");
}
}

class HighSchooler implements Person {
@Override
public void eat() {
System.out.println("I'm eating 급식");
}
}

이렇게 예제를 통해 살펴본 것과 같이 인터페이스의 역할을 너무 크게 잡아 이를 상속하는 클라이언트가 필요로하지 않는 기능에 의존을 갖지 않아야한다는 것이 인터페이스 분리 원칙이다.


참고:

Share