계발자 블로그
[객체지향] SOLID 원칙 본문
SOLID 원칙이란?
SOLID 원칙이란 객체지향 프로그래밍(OOP)에서 지켜야 할 5개의 설계 원칙을 의미합니다.
SRP (Single Responsibility Principle): 단일 책임 원칙
OCP (Open Closed Principle): 개방 폐쇄 원칙
LSP (Liskov SubSitution Principle): 리스코프 치환 원칙
ISP (Interface Segregation Principle): 인터페이스 분리 원칙
DIP (Dependency Inversion Principle): 의존성 역전 원칙
SOLID의 목표
유지보수정: 변경에 유연해야 한다
가독성: 이해하기 쉬워야 한다.
낮은 결합도(Loose couple), 높은 응집도(strong cohesion):
여러 소프트웨어 시스템에 사용될 수 있는 큰 컴포넌트의 기반이 되어야 합니다.
하나의 모듈 안에서는 높은 응집도를 갖고잇어야 됩니다.
그안에서 필요한 구현들 중요한 책임들은 그안에서 해결이 되어야 합니다 (높은 응집도)
그렇다고 해서 클래스에서 하고 있는 중요한 일들을 위해서 다른 클래스의 일들이 필요하다고 하면
높은 결합도를 가지고 있는 것(낮은 결합도 위반)
단일책임원칙 - SRP (Single Responsibility Principle)
응집도에 대한 기준을 얘기하는 원칙입니다.
Clean Code의 저자 로버트 C 마틴은 각 소프트웨어 모듈은 변경의 이유가 단 하나여야 한다고 말했습니다.
클래스가 여러개의 책임을 갖게 되면 각 책임마다 클래스를 변경 할 이유가 생기기 때문에
책임을 단 한개만 가지도록 설계 해야 합니다. 객체가 갖는 책임이 많아 질수록 기능변경은 점점 어려워 집니다.
즉, 클래스나 모듈의 변경 이뉴는 오직 하나의 책임을 가져야 합니다.
유의해야할 부분은 하나의 클래스가 하나의 일을 해야 된다라는 의미가 아닙니다
SRP의 핵심은 클래스나 모듈이 변경되어야 하는 이유가 하나만 있어야 한다는 것입니다.
이것은 클래스가 단 하나의 기능만 수행해야 한다는 의미가 아니라,
클래스의 변화의 이유가 여러 가지로 분산되지 않도록 해야 한다는 것을 의미합니다.
개방 폐쇄 원칙 - OCP (Open Closed Principle)
기존 코드를 수정하지 않고도 기능을 확장할 수 있게 설계 해야 하는 원칙입니다.
모든 소프트웨어 개체는(모듈, 클래스, 함수 등) 확장에 대해서는 열려있어야 하고 변경에 대해서는 닫혀 있어야 합니다.
열려 있다는 것은 데이터 구조에 필드를 추가하거나, 함수에 새로운 요소를 추가하는 것이 가능해야하고
닫혀 있다는 것은 내부 코드를 변경해도 이를 사용하는 외부 모듈에는 영향을 미치지 않아야합니다.
리스코프 치환 원칙 - LSP (Liskov SubSitution Principle)
상위 타입 객체가 하위 타입 객체로 변환되어도 상위 타입을 사용하는 프로그램은 정상적으로 동작해야함
위반하는것은 하위탑이 상위 타입의 명세를 제대로 지키지 않고 있다는 것
하위 타입을 새로 만들때마다 상위 타입의 코드를 수정해야하기 때문에 ocp가 깨지고 기능확장이 어려워짐
인터페이스 분리 원칙 - ISP (Interface Segregation Principle)
구현할 필요가 없는 메소드를 가진 인터페이스를 객체의 사용하지 말아야 합니다.
클라이언트의 입장에서 사용하는 기능만 제공하도록 인터페이스를 분리하는것이 ISP의 의도입니다.
각 소프트웨어 모듈은 자신이 사용하지 않는 것에 의존하지 않아야 한다.
의존성 역전 원칙 - DIP(Dependency Inversion Principle)
객체 A가 객체 B를 생성 하거나 객체 B의 메서드를 호출할 때 A는 B에 의존한다 혹은 A가 의존성 B를 갖는다고 표현합니다.
상위 레벨 모듈이 하위 레벨 모듈에 의존해선 안되고 추상화에 의존해야 합니다.
의존성 역전 원칙의 핵심은 의존하는 하위레벨의 모듈이 변하더라도 상위레벨의 모듈은 변하면 안됩니다.
DIP는 OCP의 실현을 돕는 원칙입니다.
DIP는 OCP를 실현하기 위해 추상화를 통한 의존성 주입을 촉진합니다.
상위 레벨 모듈이 저수준 모듈에 직접 의존하게 되면, 하위 레벨 모듈의 변경이 상위 레벨 모듈에 영향을 미칠 수 있어
OCP를 위반하게 됩니다. 반면 DIP를 따르면 상위 레벨 모듈과 하위 레벨 모듈 모두 추상화에 의존하게 되므로
하위 레벨 모듈의 구현이 변경되더라도 상위 레벨 모듈의 변경 없이도 새로운 구현을 쉽게 적용할 수 있습니다.
참고: 인프런 냉동코더의 알기 쉬운 Modern Android Development 입문
패스트캠퍼스 The RED: 강사룡의 앱 안성성 및 확장성 강화를 위한 Android 아키텍처
'Computer Science' 카테고리의 다른 글
디자인 패턴 (0) | 2023.04.09 |
---|