개발은 재밌어야 한다
article thumbnail
반응형

https://blog.kakaocdn.net/dn/Qn8cY/btrsSv6Bud4/HsS9ku1012FY6IMKIxXw71/img.png

객체 지향 프로그래밍설계에서 5가지 기본원칙(SRP, OCP, LSP, ISP, DIP)의 네번째 원칙인 ISP(Interface Segregation Principle)에 대해 알아보겠습니다.

 

 

 

https://viblo.asia/p/the-solid-principles-maGK7JVB5j2


ISP(인터페이스 분리 원칙)은 클라이언트가 자신이 이용하지 않는 메서드에 의존하지 않아야 한다는 원칙이다.

- 위키백과-

 

우선 여기서 말하는 인터페이스의 개념에 대해 잠깐 알아보자

 

인터페이스란?

동일한 목적 하에 동일한 기능을 수행하게끔 강제하는 것이 인터페이스의 역할이자 개념이다.

어떤 클래스가 있고 그 클래스가 특정한 인터페이스를 사용하여 구현된다면 그 클래스는 반드시 그 인터페이스에 포함되어 있는 메소드를 구현하도록 강제하는 것이다.

즉, 자바의 다형성을 극대화하여 개발 코드 수정을 줄이고 프로그램 유지보수성을 높이기 위해서 인터페이스를 사용한다.

 

간단한 예시를 들어보면

interface MultifunctinPrinter {
    public void copy();

    public void print();

    public void fax();
}

복합기에 대한 인터페이스가 있다고 가정해보겠습니다.

이 복합기를 팩스 클래스가 구현체로써 구현을 해보겠다고 가정해보겠습니다.

public class Fax implements MultifunctinPrinter{

    @Override
    public void copy() {
        // TODO Auto-generated method stub

    }

    @Override
    public void print() {
        // TODO Auto-generated method stub

    }

    @Override
    public void fax() {
        // TODO Auto-generated method stub

    }

}

Fax클래스는 복합기의 인터페이스를 구현하겠다고 implements를 지정하였기 때문에 copy(), print(), fax() 메소드에 대해서 Override하여 메소드를 구현하게끔 한다.

 

Override

(메소드 오버라이딩, 은 객체 지향 프로그래밍에서 서브클래스 또는 자식 클래스가 자신의 슈퍼클래스들 또는 부모 클래스들 중 하나에 의해 이미 제공된 메소드를 특정한 형태로 구현하는 것을 제공하는 언어의 특징이다. 위키백과)

 

 

위의 복합기를 ISP 관점에서 다시 생각해보겠습니다.

복합기의 기능을 제공하는 클래스는 매우 비대해질 가능성이 큽니다.

하지만 이 모든 메소드를 사용하는 클라이언트가 동시에 사용하는 경우는 거의 없습니다.

클라이언트의 필요에 따라 프린터 기능만 이용하던지, 팩스 기능만 이용하던지, 복사기 기능만 이용할 수 있다.

클라이언트의 필요에 따라 프린터 기능만 이용하는 클라이언트가 팩스 기능의 변경으로 인해 발생하는 문제에 영향을 받지 않도록 해야한다.

 

클라이언트와 무관하게 발생하는 변화로 클라이언트 자신이 영향을 받지 않으려면, 범용의 인터페이스보다는 클라이언트에 특화된 인터페이스를 사용하도록 분리시켜 사용하는것이 좋다.

 

즉, ISP는 인터페이스를 클라이언트에 특화되도록 분리시키라는 설계원칙이라고 할 수 있습니다.

복합기 클래스를 ISP 원칙에 따라 인터페이스를 분리해보면 아래와 같이 분리할 수 있습니다.

프린터 클라이언트는 프린터 인터페이스

복사 클라이언트는 복사기 인터페이스

팩스 클라이언트는 팩스 인터페이스를 각각 자신이 관심을 갖는 메서드들만 있는 각각의 인터페이스로 정의하여 사용하도록 한다.

이렇게 설계하면 인터페이스가 일종에 방화벽 역할을 수행하여 클라이언트는 자신이 사용하지 않는 메서드에 생긴 변화로 인한 영향을 받지 않게 된다.

반응형
profile

개발은 재밌어야 한다

@ghyeong

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!