SOLID - 객체 지향적으로 코드 짜기
SOLID
- 객체 지향 설계의 기초
SOLID : 객체 지향 설계의 첫 걸음
SOLID 원칙은 객체 지향 프로그래밍에서, 설계의 핵심 목표는 이것이다 하는 것으로 정신을 차리고 나아가면 모듈의 설계를 분산시키고 해낼 수 있다는 그런 원칙을 말하는 것이다.
- 단일 책임 원칙
- 객체는 하나의 책임을 가져야 한다.
- 개방 폐쇄 원칙
- 기능의 확장, 수정에 코드의 변경이 수반되지 않아야 한다.
- 리스코프 치환 원칙
- 부모와 자식 사이에는 행위의 일관성이 있어야 한다.
- 인터페이스 분리 원칙
- 클라이언트 기준으로 인터페이스를 분리하여야 한다.
- 의존 역전 원칙
- 고수준 모듈이 상세 구현에 의존하지 않아야 한다.
단일 책임 원칙
어떤 객체의 수정 이유는 단 하나여야 한다.
- 객체의 책임-관심사-을 하나로 제한하는 원칙
책임
- 객체의 책임은 즉 객체의 관심
- 객체가 담당하여 처리하는 데이터, 또는 작업 등
하나의 책임
- 한 클래스가 여러 책임을 가지지 않는 것
- 한 책임이 여러 클래스로 분산되지 않는 것
- 이는 다른 클래스에서 여러 책임을 가지게 되는 원인
단일 책임 원칙의 도입
- 클래스 내의 서로 다른 책임을 가지는 코드들이 강하게 결합할 가능성 제거
- 클래스의 수정이 다른 클래스에 미치는 영향을 최소화
- 클래스의 수정으로 다른 어떤 클래스가 영향을 받을지 특정 가능
개방 폐쇄 원칙
확장에는 개방, 변경에는 폐쇄.
개방과 폐쇄, 열림과 닫힘
- 개방과 열림 : 확장 에 대한 원칙
- 확장 : 기존 기능을 변경하거나, 추가적인 기능을 덧붙이는 것
- 폐쇄와 닫힘 : 수정 에 대한 원칙
- 수정 : 기존 소스를 확인하여 고치는 것
개방 폐쇄 원칙의 도입
- 기능의 추가, 변경시 기존 코드를 수정하지 않을 수 있음
- 독립된 컴파일 가능
- 기존 코드를 수정하며 발생 가능한 휴먼 에러 예방
- 동일한 코드를 수정하며 발생하는 불일치 / 누락 등
리스코프 치환 원칙
상위 객체를 하위 객체로 대체하여도, 전체 프로그램은 문제없이 동작하여야 한다.
상속과 인터페이스
- 상속 관계는
is a
관계- 서브클래스는 슈퍼클래스와 같음
- = 같은 기능 / 동작 / 데이터 를 제공
- 서브클래스는 슈퍼클래스와 같음
- 객체의 상속은 상위 클래스의 세부적인 계약을 가져오는 것
- 상위 클래스에서 제공하는 기능을 똑같이 제공 받을 수 있을 것이라는 믿음
- 인터페이스의 구현은 동작에 대한 계약이 존재하지 않음
- 추상화된 기능에 대한 세부적 구현은 다를 수 있음
리스코프 치환 원칙의 필요성
- 상속이 필요한 시점과 대상 클래스에 대한 기준 발견
- 상속 관계에 있는 클래스들은 일관적 기능을 제공해야 함
- 하위 클래스는 상위 클래스의 기능에서 오직 확장만 하여야 함
- 위 경우를 만족하지 못할 경우, 인터페이스나 추상 클래스를 고려하여야 함
인터페이스 분리 원칙
클라이언트가 사용하는 메서드만을 인터페이스로 제공한다.
인터페이스 / 클라이언트
- 인터페이스 : 추상적 기능의 모임
- 클라이언트 : 특정 객체/인터페이스에 의존하는 객체
- 사용하는 객체
- 인터페이스가 가지는 메서드는 클라이언트에서 사용하는 것으로 한정하여야 함
인터페이스 분리 원칙의 필요성
- 클라이언트 기준 설계 가능
- 소스 변경의 여파를 연관된 클라이언트로 한정 가능
단일 책임 원칙과의 유사성
- 객체가 단일 책임 원칙을 만족시켜도, 인터페이스 분리 원칙을 만족하지 않을 수 있음
- 인터페이스 분리 원칙이 조금 더 세부적 원칙에 해당
의존 역전 원칙
저수준 모듈이 고수준 모듈의 명세를 따라가야 한다.
모듈의 수준
- 고수준 모듈 : 전략을 사용하는 모듈
- 비즈니스 로직에 해당함
- 저수준 모듈 : 전략 그 자체
- 세부 구현에 해당함
의존 역전 원칙의 이점
- 개방 폐쇄 원칙과 유사
- 유연한 설계와 구현 가능
- 전략 수정에서 코드 수정이 최소화
요약
모듈화 / 추상화
- 추상화
- 변경 가능하고 유연한 설계
- 모듈화
- 변경의 영향을 최소화
- 변경 범위를 특정
각 원칙의 독립성
- 단일 책임 원칙과 인터페이스 분리 원칙 간에 유사한 면 존재
- 개방-폐쇄 원칙과 의존 역전 원칙 간의 유사점
- = 각 원칙은 완전히 독립되어 있지 않음
구조의 깔끔함 / 유지보수의 안정성
- SOLID 원칙은 개발자에게 고통을 주려는 것이 아님
- 원칙을 잘 따를 경우 개발-유지보수 기간에서 얻을 수 있는 이익이 다대함
- 이익의 예시
- 한 객체를 수정하고 모든 소스파일을 수정한 후 두려움에 떨지 않아도 됨
- 컴파일이나 테스트에 드는 비용 저하
- 등등