객체지향 (OOP)/객체 지향 설계 5원칙

[ISP] 객체지향 설계 5 원칙 (4)

고인돌개발자 2021. 5. 21. 17:29

학습목표 : 인터페이스 분리 원칙 (Interface segregation principle)을 이해하고, 예제로 설명할 수 있다.
           


 

ISP[Interface segregation principle] 인터페이스 분리 원칙

  - "클라이언트는 자신이 사용하지 않는 메서드에 의존 관계를 맺으면 안된다." - 로버트 C. 마틴

 

 단일 책임 원칙(SRP) 와 인터페이스 분할 원칙(ISP)은 같은 문제에 대한 두가지 다른 해석   
 <특별한 경우가 아니면, 아래 구조에서는 SRP 원칙을 적용하는 것을 권장함>

<SRP 설명>
<ISP 설명>
<ISP 최소주의>


인터페이스 최소주의 원칙 - 인터페이스를 통해 메서드를 외부에 제공할 때는 최소한의 메서드만 제공

 

예제) 못된 예제

package book.oopforsprings.lec05.solid;

public class ISP남자_NO {

	public static void main(String[] args) {
		
		/* 돌아는 간다 */
		아들_남편 아남 = new 남자2();
		 아남.기념일챙기기();
		 아남.효도하기();
	}

}

/* 아들 과 남편의 상관없는 interface 생성 */
interface 아들_남편{
	void 효도하기();
	void 기념일챙기기();
}

/* 아빠 와 친구의 상관없는 interface 생성 */
interface 아빠_친구{
	void 용돈주기();
	void 운동하기();
}

/* 의미가 명확치 않은 인터페이스 상속 */
class 남자2 implements 아들_남편, 아빠_친구{

	@Override
	public void 용돈주기() {
		System.out.println("애들에게 용돈을");	
	}

	@Override
	public void 운동하기() {
		System.out.println("친구들과 운동을");		
	}

	@Override
	public void 효도하기() {
		System.out.println("엄마에게 효도를");		
	}

	@Override
	public void 기념일챙기기() {
		System.out.println("아내와의 기념일 챙기기");
		
	}
	
}

예제) 잘된 예제

package book.oopforsprings.lec05.solid;

public class ISP남자_OK {

	public static void main(String[] args) {
		
		I남편 i남편 = new 남자3();
		  i남편.기념일챙기기();
 		
		I아들 i아들 = new 남자3();
		 i아들.효도하기();
	}

}

/* 각각의 최소단위의 인터페이스로 분리 interface 생성 */
interface I아들{ 	void 효도하기(); }
interface I남편{  void 기념일챙기기(); }
interface I아빠{ 	void 용돈주기(); }
interface I친구{  void 운동하기(); }


/* 의미가 명확치 않은 인터페이스 상속 */
class 남자3 implements I남편,I아들,I아빠,I친구{

	@Override
	public void 용돈주기() {
		System.out.println("애들에게 용돈을");	
	}

	@Override
	public void 운동하기() {
		System.out.println("친구들과 운동을");		
	}

	@Override
	public void 효도하기() {
		System.out.println("엄마에게 효도를");		
	}

	@Override
	public void 기념일챙기기() {
		System.out.println("아내와의 기념일 챙기기");
		
	}
	
}

덧붙이는 말.

 인터페이스는 각 성격에 맞게 최소단위로 분리하는게 원칙이다.

 이는 또한 SRP(Single responsibility principle, 단일책임원칙) 원칙을 위배하지 않게 된다.

 

 

 

참고도서 : 스프링 입문을 위한 자바 객체 지향의 원리와 이해 (위키북스)