본문 바로가기

Solid

(4)
인터페이스 분리 원칙 - ISP (Interface Segregation Principal) 인터페이스 분리 원칙이란 클라이언트가 자신이 이용하지 않는 메서드에 의존하지 않아야 한다는 원칙이다. 이 원칙은 큰 덩어리의 인터페이스들은 구체적이고 작은 단위들로 분리 시킴으로써 클라이언트들이 꼭 필요한 메서드들만 이용할 수 있게 한다. 이와 같은 작은 단위들을 역할 인터페이스라고 부른다. 인터페이스 분리 원칙을 통해 시스템의 내부 의존성을 약화시켜 리팩토링, 수정, 재배포를 쉽게 할 수 있다. 단일 책임 원칙(SRP)과 인터페이스 분할 원칙(ISP)의 관계를 생각해보자. 여러 책임을 갖는 클래스가 있다. 이 클래스를 역할에 맞게 책임을 인터페이스 단위로 분리하였다. 이 경우 ISP에 만족 한다고 할 수 있다. 하지만 SRP에 만족하면 ISP 또한 만족되는가? 다음과 같은 경우를 생각해보자 리모컨 기능..
의존 역전 원칙 - DIP (Dependency Inversion Principle) 의존 역전 원칙이란 의존 관계를 맺을 때 변화하기 쉬운 것 보다 변화하기 어려운 것에 의존하라는 원칙을 의미한다. DIP를 만족하는 설계는 변화에 유연한 시스템이 된다. 변하기 쉬운 것과 변하기 어려운 것은 어떻게 구분 할 수 있을까? 정책, 전략과 같은 어떤 큰 흐름이나 개념같은 추상적인 것은 변하기 어려운 것이고, 구체적인 방식, 사물 등과 같은 것은 변하기 쉬운 것으로 구분한다. 위 클래스 다이어그램을 보면 Weapon은 변하기 어려운 것이고, Sword, Axe, Spear는 변하기 쉬운 것이다. 인터페이스 = 변하지 않는 것 구체 클래스 = 변하기 쉬운 것 DIP를 만족하면 여러가지 타입의 클래스를 인터페이스를 통해 쉽게 저장이 가능하다. public class Person { private W..
단일 책임의 원칙 - SRP(Single Responsibility Principle) 단일 책임의 원칙이란 객체는 단 하나의 책임을 가져야한다는 원칙을 말한다. 객체지향적으로 설계 할 때는 응집도를 높게, 결합도는 낮게 설계하는 것이 좋다. SRP에 만족하는 설계를 하면 응집도를 높게, 결합도는 낮게 설계 할 수 있다. 한 객체에 책임이 많아질수록 클래스 내부에서 서로 다른 역할을 수행하는 코드끼리 강하게 결합될 가능성이 높아진다. 즉, 객체마다 책임을 나누지 않는다면 시스템은 매우 복잡해진다. 그리고 시스템에 수정이 생기면, 수정과 관련 없는 기능에 영향이 생길 수 있고, 모두 테스트 해주어야 한다. 단일 책임의 원칙, 하나의 객체에 하나의 책임을 갖게 설계하면, 위와 같은 문제점에서 벗어날 수 있고, 소스의 재사용 및 가독성이 좋아진다. 하지만 각 객체마다 책임을 적절히 분배하는 것은..
개방 폐쇄 원칙 - OCP(Open Close Principal) 개방폐쇄원칙이란 확장에 대해 개방되어 있고, 수정에 대해 폐쇄되어 있는 원칙을 의미한다. OCP에 만족되는 설계를 하려면 변경되는 소스를 파악하고, 수정 시 영향 받지 않게 해야한다. 이를 만족하기 위해서는 인터페이스를 이용해 기능의 추상화가 이루어져야한다. 다음 소스는 OCP를 위배하는 잘못된 예이다. public class Sword { public void attack() { System.out.println("검으로 휘두르다."); } } public class Person { private Sword sword; public void setSword(Sword sword) { this.sword = sword; } public void attack() { sword.attack(); } } pu..