설계 5대 원칙 SOLID
- 단일 책임 원칙 ( Single Responsibility Principle ; SRP )
- 개방-폐쇄 원칙 ( Open-Closed Principle; OCP )
- 리스코프 치환 원칙 ( Liskov Substitution Principle; LSP )
- 인터페이스 분리 원칙 ( Interface Segregation Principle; ISP )
- 의존 역전 원칙 (Dependency inversion Principle; DIP )
1. 단일 책임 원칙 ( Single Responsibility principle )
- 클래스는 단 한 개의 책임을 가져야 한다.
클래스가 여러 책임을 갖게 되면 그 클래스는 각 책임마다 변경되는 이유가 발생하기 떄문에,클래스가 한 개의 이유로만 변경되려면 클래스는 한 개의 책임만을 가져야 한다.
이런 이유로 이 원칙은 다른 말로 "클래스를 변경하는 이유는 단 한 개여야한다." 고도 표현한다.
객체에게 책임을 할당하는 것이 객체설계의 기본인만큼, 단일 책임 원칙은 가장 중요한 원칙중의 하나이다.
단인 책임 원칙은 가장 중요하고 가장 어려운 원칙이기도 하다.
2. 개방 폐쇄 원칙 ( Open - Closed Principle )
- 개방 폐쇄 원칙은 다음과 같다.
- 기능을 변경하거나 확장 할 수 있으면서 ( 상속 )- 그 기능을 사용하는 코드는 수정하지 않는다.
- 개방 폐쇄 원칙이 꺠질떄의 주요 증상
- 다운캐스팅을 한다.InstanceOf 같은 타입 확인 연산자가 사용된다면 해당 코드는 개방 폐쇄 원칙을 지키지 않을 가능성이 높다.
개방 폐쇄 원칙은 변경의 유연함과 관련된 원칙이다.만약 기존 기능을 확장하기 위해 기존 코드를 수정해주어야 한다면,
새로운 기능을 추가하는것이 점점 힘들어진다.
3. 리스코프 치환 원칙 ( Liskov Substitvtion Principle )
앞서 개방 폐쇄 원칙은 추상화와 다형성(상속) 을 이용해서 구현했는데리스코프 치환 원칙은 개방 폐쇄 원칙을 받쳐주는 다형성에 관한 원칙을 제공
- 상위 타입의 객체를 하위 타입의 객체로 치환해도 상위 타입을 사용하는 프로그램은 정상적으로 동작해야한다.
리스코프 치환 원칙은 계약과 확장에 대한것.리스코프 치환 원칙은 기능의 명세(또는 계약) 에 대한 내용이다.
- 기능실행의 계약과 관련해서 흔히 발생하는 위반 사례
1. 명시된 명세에서 벗어난 값을 리턴한다.2. 명시된 명세에서 벗어난 익셉션
3. 명시된 명세에서 벗어난 기능을 수행한다.
리턴 값은 0이나 또는 그 이상을 리턴하도록 정의되어 있는데,
하위 타입에서 음수 값을 리턴한다거나 ,
IOException 만 발생시킨다고 정의했는데 IllegalArgumentException을 발생시킨다는가 식이다.
하위 타입이 이렇게 명세에서 벗어난 동작을 하게 되면,
하위타입은 상위타입에서 정의한 명세를 벗어나지 않는 범위에서 구현해야한다.
또한 , 리스코프 치환 원칙은 확장에 대한것이다.
리스코프 치환 원칙을 어기면 개발 폐쇄 원칙을 어길 가능성이 높아진다.
4. 인터페이스 분리 원칙 (ISP)
- 인터페이스는 그 인터페이스를 사용하는 클라이언트를 기준으로 분리해야한다.
(클라이언트는 자신이 사용하는 메서드에만 의존해야한다. )
인터페이스 분리 원칙은 c나 c++와 같은 컴파일과 링크를 직접해주는 언어를 사용할떄 장점이 잘들어난다.
내용 보충 필요
5. 의존 역전 원칙 (DIP)
- 고수준 모듈은 저수준 모듈의 구현에 의존해서는 안된다.
저수준 모듈이 고수준 모듈에서 정의한 추상 타입에 의존해야한다.
- 고수준 모듈 :
바이트 데이터를 읽어와 암호화 하고 결과 바이트 데이트를 쓴다 .
- 저수준 모듈:
파일에서 바이트 데이터를 읽어온다.
AES 알고리즘으로 암호화 한다.
파일에 바이트 데이터를 쓴다.
SOLID 정리
지금 까지 객체지향 설계의 주요원칙인 SOLID원칙에 대해서 살펴보앗다.SOLID 원칙을 한마디로 정의하면 변화에 유연하게 대처할수있는 설계원칙이다.
단일 책임 원칙과 인터페이스 분리 원칙은 객체가 커지지 않도록 막아준다.
리스코프 치환 원칙과 의존 역전 원칙은 개방 폐쇄 원칙을 지원한다.
SOLID 원칙은 사용자 관점에서의 설계를 지향 하고 있다.
'java' 카테고리의 다른 글
jvm 버그 테스트 하는방법! (java heap memory) (0) | 2016.10.17 |
---|---|
jps 사용법 (0) | 2016.10.14 |
몇가지 유용한 getProperty (0) | 2016.09.19 |
generate java JNI Header (0) | 2016.08.18 |
hashtable vs concurrenthashmap (1) | 2016.08.16 |