- SOLID는 무엇인가
- 객체지향 개발 5대 원리
2.
SOLID의 내용
- 정의
- There should never be more than one reason for a class to change
- 클래스는 프로그램에서 제공하는 기능의 단 한 부분(책임)만을 가져야 한다.
- 해당 책임은 클래스 내부에 캡슐화 되어야 한다.
- 클래스가 제공하는 모든 서비스는 그 하나의 책임을 수행하는데 집중되어 있어야 한다.
- " A class should have only one reason to change"
- 단일 책임의 원칙은 Object에만 한정되는것이 아니라 method, Field , variable 도 해당된다.
- 적용 방법
- 클래스는 자신의 이름이 나타내는 일을 해야 한다. 올바른 클래스 이름은 해당 클래스의 책임을 나타낼 수 있는 가장 좋은 방법이다.
- 클래스 내부에서 변경이 일어나는 필드와 그렇지 않은 필드를 각각의 클래스로 분리한다.
1.SRP(단일 책임의 원칙: Single Responsibility Principle)
2.OCP(개방 폐쇄 원칙 : Open Close Principle)
- 정의
- 변경을 위한 비용은 가능한 줄이고 확장을 위한 비용은 가능한 극대화해야한다는 원칙
- 요구사항의 변경이나 추가사항이 발생하더라도, 기존 구성 요소는 수정이 일어나지 말아야 하며(캡슐화를 통해 내부내용을 감춘다), 기존 구성요소를 쉽게 확장해서 재사용할 수 있어야 한다.
- 관리 가능하고 재사용 가능한 코드를 만드는 기반 원칙
- 적용 방법
- 추상화, 다형성 -> 상속 , interface
- 변경될것과 변경되지 않을것을 엄격히 구분
- 이 두 부분의 접점에 인터페이스를 정의
- 인터페이스에 의존하도록 코드 작성
3.LSP(리스코프 치환의 법칙: Liskov Substitution Principle)
- 정의
- 서브타입은 언제나 기반 타임으로 교체할 수 있어야 한다
- 사용자는 파생클래스에 대해 알 필요가 없다.
- 상속을 할때 지켜야할 규칙
- 상속은 코드의 재사용을 위해서가 아니라 명확한 가족 관계가 있을때 사용
- 가족관계 - 부모, 형제들의 형질과 관련없는 능력을 가진 파생이 없는 관계
- 부모와 파생된 객체들이 존재할때 가능한 모두 동일한 메소드이름과 갯수를 가지게 한다.
4.ISP(인터페이스 분리의 원칙 : Interface Segregation Pirnciple)
- 정의
- 클래스는 자신이 사용하지 않는 인터페이스는 구현하지 말아야 한다.
- 하나의 일반적인 인터페이스보다는 여러개의 구체적인 인터페이스가 낫다.
- 인터페이스의 단일책임
5.DIP(의존성 역전의 원칙 : Dependency Inversion Principle)
- 정의
- 제어의 역전(IoC) :
- 의존 관계란?
- 의존이란 has 관계를 말한다. A has a B , A depend on B 의 의미이다. ( aggregation , composition 이런것들이 의존이다. )
- => 하이 레벨 모듈은 로우레벨 모듈에 의존해서는 안된다. 둘다 추상에 의존해야 한다.
- => 하이 레벨 모듈,로우 레벨 모듈이란 단어가 사람을 헷갈리게 만든다.
- => 하이 레벨은 정책 모듈(객체), 로우 레벨 모듈은 세부 구현 모듈(객체)이라고 생각하면 된다.
- => 정책 모듈은 어떤것들이 들어오던지 간에 그 녀석에 맞게 처리할거야라는 룰만 가지고 있는 녀석이다.
- => 세부 구현 모듈은 실제 처리를 하는 녀석들을 말한다.
- => 추상은 상세를 의존해서는 안된다. 상세는 추상을 의존해야 한다.
결론!
OOP 와 OOD는 다른 개념이다.
OOP는 객체를 어떻게 만들껀지에 대한 이야기라면 OOD는 그 객체들의 관계를 어떻게 만들지 설계하는 방법이다.
그렇기 때문에 OOP를 잘 모르면 OOD도 이해하기 어렵다.
위에 포스팅한 내용들 흔한 이야기들이다. 지금 적으면서도 많이 부족하고 너무 추상적이 이야기들만 적었다는것을 필자는 안다.
나중에 하나씩 깨닫게 되면 하나씩 수정하겠다. SOLID는 결코 쉬운 개념이 아니다.