🫷들어가기전
저번 포스팅에서 객체 지향 프로그래밍이 무엇인지 알아보고 OOP의 핵심 키워드와 주요 특징 4가지를 알아봤었다. 이번 포스팅에서는 객체 지향 프로그래밍의 특징과 장점들을 최대한으로 끌어올리기 위해 프로그램을 어떻게 설계해야하는지에 대해서 알아볼거다.
📚 SOLID 원칙이란?
SOLID 원칙은 SRP(Single Responsibility), OCP(Open-Closed), LSP(Liskov Substitution), ISP(Interface Segregation), DIP(Dependency Inversion) 원칙들을 합친 원칙이다.
1. SRP(Single Responsibility) 단일 책임 원칙
- 클래스는 단 한개의 책임을 가져야한다.
- 클래스를 변경하는 이유는 단 하나이어야한다.
위와 같은 사항들을 지키지 못할 경우엔 다른 책임과 관련된 코드에 영향을 미칠 수 있다. 즉, 유지보수가 매우 불안하다.
SRP에서 말하는 책임이란 기능이라고 생각해도 좋다. 만약 한 클래스가 수행할 수 있는 기능 (책임) 이 여러 개라면, 클래스 내부의 함수끼리 강한 결합을 발생할 가능성이 높아진다. 응집도는 높고 결합도는 낮은 프로그램을 설계하는 것이 비로소 객체지향 설계의 핵심인데, 이것이 위반되는 것이다.
예를 들어 어떤 클래스내에 A 라는 메소드가 있고, 이 A 메소드는 A 메소드의 결과를 기반으로 B 메소드를 호출하며, B 메소드는 B 메소드의 결과를 기반으로 C 메소드를 호출하도록 구현이 되어있다고 해보자. 이 때 만약 A 메소드의 동작이 일부 수정된다고 할 때, B 와 C 메소드를 전부 바꿔야 할 상황이 발생할 수 있다. 유지보수가 매우 비효율적인 것이다. 따라서 이들을 모두 분리할 필요가 있다.
2. OCP(Open-Closed) 개방-폐쇄 원칙
- 확장에는 열려있어야하고, 변경에는 닫혀있어야 한다.
- 기존의 코드를 변경하지 않고 기능을 수정하거나 추가할 수 있도록 설계해야 함
어떤 모듈의 기능을 하나 수정할 때, 그 모듈을 이용하는 다른 모듈들 역시 줄줄이 고쳐야 한다면 유지보수가 복잡할 것이다. 따라서 개방 폐쇄 원칙을 잘 적용하여 기존 코드를 변경하지 않아도 기능을 새롭게 만들거나 변경할 수 있도록 해야 한다.
그렇지 않으면 객체지향 프로그래밍의 가장 큰 장점인 유연성, 재사용성, 유지보수성 등을 모두 잃어버리는 셈이고, OOP를 사용하는 의미가 사라지게 된다.
3. LSP(Liskov Substitution) 리스코프 치환 원칙
- 하위 타입 객체는 상위 타입 객체에서 가능한 행위를 수행할 수 있어야 함(상위 타입 객체를 하위 타입 객체로 치환해도 정상적으로 동작해야 함)
- 상속관계에서는 꼭 일반화 관계 (IS-A) 가 성립해야 한다는 의미 (일관성 있는 관계인지)
- 상속관계가 아닌 클래스들을 상속관계로 설정하면, 이 원칙이 위배됨 (재사용 목적으로 사용하는 경우)
리스코프 치환 원칙을 지키지 않으면 개방 폐쇄 원칙을 위반하게 되는 것이다. 기능 확장을 위해 기존의 코드를 여러 번 수정해야 할 것이다.
4. ISP(Interface Segregation) 인터페이스 분리 원칙
- 클라이언트는 자신이 사용하는 메소드에만 의존해야 한다는 원칙
- 한 클래스는 자신이 사용하지 않는 인터페이스는 구현하지 않아야 함(하나의 통상적인 인터페이스보다는 차라리 여러 개의 세부적인 (구체적인) 인터페이스가 나음)
- 인터페이스는 해당 인터페이스를 사용하는 클라이언트를 기준으로 잘게 분리되어야 함
각 클라이언트가 필요로 하는 인터페이스들을 분리함으로써, 클라이언트가 사용하지 않는 인터페이스에 변경이 발생하더라도 영향을 받지 않도록 만들어야 하는 것이 핵심이다.
5. DIP(Dependency Inversion) 의존 역전 원칙
- 의존 관계를 맺을 때, 변하기 쉬운 것 (구체적인 것) 보다는 변하기 어려운 것 (추상적인 것)에 의존해야 함(구체화된 클래스에 의존하기 보다는 추상 클래스나 인터페이스에 의존해야 한다)
- 고수준 모듈은 저수준 모듈의 구현에 의존해서는 안 됨
- 저수준 모듈이 고수준 모듈에서 정의한 추상 타입에 의존해야 함
- 저수준 모듈이 변경되어도 고수준 모듈은 변경이 필요없는 형태가 이상적
잘못된 부분이나 부족한 부분이 있을 수 있습니다. 댓글로 남겨주시면 감사하겠습니다. 😊
'Kotlin' 카테고리의 다른 글
[Kotlin] 스코프 함수(Scope Function) (0) | 2024.12.06 |
---|---|
[Kotlin] Sealed Class란? (0) | 2024.12.05 |
[Kotlin] 싱글톤 패턴(Singleton Pattern), @JvmStatic, Object Class (0) | 2024.12.05 |
[Kotlin] 초기화(initialize), get() / set(), 열거형 클래스(Enum Class) (0) | 2024.12.04 |
[Kotlin] 클래스(Class), 데이터 클래스(Data Class) (4) | 2024.12.04 |