SOLID원칙의 I에 해당하는 원칙인 Interface Segregation Principle(ISP)은 다음과 같이 정의하고 있다.

클라이언트는 사용하지 않는 인터페이스에 강제로 의존해서는 안된다. - 로버트 C.마틴

인터페이스를 사용하는 클라이언트에 맞게끔 만들어야 한다는 의미다. 즉, 인터페이스에 구상클래스를 구현하는 데 필요없는 메소드가 있다면 분리를 고려해봐야 한다는 의미이다. 분리 관점의 설계 원칙이다.

코드

{
  interface Pet {
    bark: () => void;
    getName: () => string;
  }

  const Dog = class implements Pet {
    name: string;
    constructor(name: string) {
      this.name = name;
    }
    bark: () => void = () => console.log("bark");
    getName = () => {
      return this.name;
    };
  };

  const Cat = class implements Pet {
    name: string;
    constructor(name: string) {
      this.name = name;
    }
    bark = () => {
      throw "no bark";
    };
    getName = () => {
      return this.name;
    };
  };

  const dog = new Dog('바둑이');
  const cat = new Cat('냐옹이');

  dog.bark();  // bark
  cat.bark();  // 에러
}

위 코드에서 Pet 인터페이스는 bark()메소드와 getName()메소드를 정의하였다. 이를 구현하는 구상클래스 Dog클래스와 Cat클래스는 bark()메소드와 getName()메소드를 구현해야 한다. 하지만 Cat클래스는 bark()메소드는 필요 없다. 이는 ISP를 위반했다. Cat클래스는 Pet인터페이스가 아닌 다른 인터페이스를 구현하도록 바꿔야 한다.

주의점

개체지향에서는 인터페이스라는 추상화된 요소를 통해 개체간에 메세지를 주고 받으며 통신한다. 인터페이스에 의존하고 있는 개체들이 많기 때문에 인터페이스는 한번 정하면 수정하기 어렵게 된다. ISP를 만족시키기 위해 잦은 인터페이스 분리는 어려울 수 있으니 한번만 하는 것이 좋다.

참조