객체 지향 설계 원칙 (SOLID / DRY / YAGNI / KISS)
객체 지향 설계 원칙 (SOLID)
객체 지향 프로그래밍에서 소프트웨어를 효율적으로 설계하고 유지보수 하기 위해 따르는 기본 지침
대표적으로 SOLID 원칙이 존재
단일 책임 원칙 (Single Responsibility Principle, SRP)
클래스는 하나의 책임만 가져야 하며 그 책임은 하나의 이유로 변경되어야 한다
변경이 있을 때 파급효과가 적어야 한다
- 풀이
SRP에서 이야기하는 책임이란 기능을 의미. 하나의 클래스가 수행할 수 있는 기능이 여러 개가 되면 객체 지향이 설계의 핵심인 높은 응집도와 낮은 결합도를 지키지 못하게 된다
- 응집도
모듈의 독립성을 의미하는 개념으로 모듈 내부 구성요소 간 연관 정도
응집도가 높을 수록 하나의 모듈은 하나의 기능을 수행하는 형태
- 결합도
소프트웨어 구조에서 모듈 간의 관련성을 측정하는 척도
모듈 내부가 아닌 외부의 모듈과의 연관도 또는 모듈 간의 상호 의존성을 의미
개방-폐쇄 원칙 (Open-Closed Principle, OCP)
소프트웨어의 요소는 확장에 열려 있어야 하고 수정에는 닫혀있어야 한다
새로운 기능을 추가할 때 기존 코드를 수정하지 않고, 기존 코드를 기반으로 확장할 수 있도록 설계해야한다
- 풀이
상속(다형성)과 추상화(인터페이스)를 활용하여 자주 변경되는 부분을 추상화하여 기존 코드를 수정하지 않고 기능을 확장할 수 있도록 하여 유연성을 살려야한다
리스코프 치환 원칙 (Liskov Substitution Principle)
서브 타입은 언제나 자신의 기반 타입으로 교체할 수 있어야 한다
상속 구조에서 부모 클래스의 역할을 자식 클래스가 정상적으로 수행할 수 있도록 하여 코드의 일관성을 유지해야한다
- 풀이
다형성 원리를 이용하기 위한 원칙
다형성에서 하위 클래스는 인터페이스의 규약을 모두 지켜야 한다
부모 클래스의 메서드를 오버라이드 할 때 원래 메서드의 동작을 웨손하지 않도록 설계해야함
- 오버라이드
부모 클래스의 메서드를 자식 클래스에서 똑같이 가져와 사용하는 것
인터페이스 분리 원칙 (Interface Segregation Principle, ISP)
클라이언트는 자신이 사용하는 메서드에만 의존해야한다
클라이언트의 목적과 용도에 적합한 인터페이스만을 제공해야한다
- 풀이
인터페이스를 각각 사용에 맞게 끔 잘게 분리해야한다는 설계 원칙
SRP 원칙이 클래스의 단일 책임을 강조한다면, ISP는 인터페이스의 단일 책임을 강조
인터페이스는 한 번 구성하였으면 웬만해서는 변경하면 안된다는 개념
의존 역전 원칙 (Dependency Inversion Principle, DIP)
고수준 모듈은 저수준 모듈에 의존해서는 안되며, 둘 다 추상화에 의존해야한다
- 풀이
DIP 원칙은 어떤 클래스를 참조해야 하는 상황이 생기면 그 클래스를 직접 참조하는 것이 아니라 클래스의 상위 요소 (추상 클래스 / 인터페이스)를 참조하라는 원칙
쉽게 말해서 구현체에 의존하지 말고 인터페이스에 의존하라는 뜻
- 인터페이스
클래스가 어떤 메서드를 제공하는지 알려주는 명세
DRY (Don't Repeat Yourself)
중복을 피하고 코드를 재사용 할 수 있도록 설계하라
YAGNI (You Aren't Gonna Need It)
현재 필요하지 않은 기능을 미리 설계하지 마라
KISS (Keep It Simple Stupid)
가능한 간단하고 직관적으로 설계하라
멍청해 보이는 설계가 좋은 설계일 수 있다
Reference
💠 객체 지향 설계의 5가지 원칙 - S.O.L.I.D
객체 지향 설계의 5원칙 S.O.L.I.D 모든 코드에서 LSP를 지키기에는 어려움. 리스코프 치환 원칙에 따르면 자식 클래스의 인스턴스가 부모 클래스의 인스턴스를 대신하더라도 의도에 맞게 작동되어
inpa.tistory.com
✏️ SOLID, 좋은 객체지향 설계의 5가지 원칙
SOLID라는 좋은 객체지향의 설계의 5가지 원칙이 존재한다. SOLID는 SRP(단일 책임 원칙), OCP(개방-폐쇄 원칙), LSP(리스코프 치환 원칙), ISP(인터페이스 분리 원칙), DIP(의존 역전 원칙)의 앞글자를 따
velog.io
결합도(Coupling)와 응집도(Cohesion)의 개념과 특징, 유형
결합도(Coupling) 결합도는 모듈 내부가 아닌 외부의 모듈과의 연관도 또는 모듈 간의 상호의존성을 나타내는 정도 결합도는 소프트웨어 구조에서 모듈 간의 관련성을 측정하는 척도 결합도의 특
computer-science-student.tistory.com