🛠️ Pattern / Paradigm
SOLID 원칙
date
Mar 23, 2023
slug
oop-solid
author
status
Public
tags
OOP
SOLID
summary
로버트 마틴이 제안한 SOLID 원칙에 대한 설명입니다.
type
Post
thumbnail
category
🛠️ Pattern / Paradigm
updatedAt
Mar 23, 2023 11:31 AM
유지 보수와 확장이 쉬운 시스템을 구현하고자 할 때 로버트 마틴이 제안한 5가지 원칙이다.
주로 자바에서 객체지향 프로그래밍을 할 때 이 원칙을 지킨다.
SRP (Single Responsiblity Principle)
SRP라는 말은 단일 책임 원칙을 의미한다. 하나의 객체가 하나의 책임만을 져야 한다는 말이다.
하나의 객체가 여러가지의 책임을 가지면 추후에 유지보수할 때 그 객체가 가진 책임을 전부 파악해야 하고 변경한 부분이 다른 책임에 영향을 끼칠 가능성이 있기 때문에 유지 보수가 어렵다.
따라서 하나의 객체는 하나의 책임을 가지는 것이 좋다.
책임의 기준이 모호하지만 보통 객체를 다른 객체로 변경할 때 사이드 이펙트가 적을수록 하나의 책임을 잘 지고 있는 것이다.
OCP (Open-Closed Principle)
OCP라는 말은 개방-폐쇄 원칙을 의미하는데 기능을 쉽게 추가(Open)할 수 있어야 하지만 기존의 코드를 변경하지 않는(Closed) 원칙을 의미한다.
예를 들어 객체 A가 내부 인스턴스로 객체 B, C를 사용해 동작을 수행한다고 한다면 객체 B, C가 비슷한 기능을 하는 B’, C’ 로 쉽게 변경될 수 있어야 하며 변경할 때 A의 코드를 변경하면 안된다.
java에서 객체 B, C를 객체 B’, C’ 로 변경해도 동작하게 하는 것은 주로 다형성 (인터페이스와 구체클래스)를 이용하며 A의 코드를 변경하지 않고 내부 객체를 변경할 수 있도록 하는것은 의존성 주입을 이용한다.
참고로 객체 A, B, C가 단일 책임을 잘 수행한다면 B, C를 다른 객체로 교체할 때 객체 A의 내부 동작 원리는 알 필요가 없다.
LSP (Liskov Substitution Priciple)
바바라 리스코프라는 사람의 이름을 따온 원칙이다.
원칙의 의미론적 이야기는 복잡한데 쉽게 말하면 객체 상속 관계에서 자식 객체가 부모 객체의 기능을 함부로 바꾸면 안된다는 말이다. 메소드를 오버라이딩하거나 필드를 수정하면 LSP를 위반하게 된다.
DIP (Dependency Inversion Principle)
의존 역전 원칙이라는 말이다. 프로그램을 만들다보면 상호 객체 간 의존성이 생기게 되는데 의존 관계를 최대한 역전시키라는 말이다.
예를 들면 USB를 지원하는 컴퓨터는 USB의 프로토콜을 지원하는 것이지 USB에 꽃히는 메모리나 핸드폰 등 각각의 객체에 대해 의존성을 가지는 것이 아니다. 그래서 특정 부분을 추상화하여 의존관계가 역전되도록 해야 한다.
상위 모듈이 하위 모듈에 의존성이 생기면 안된다. 두 모듈 다 추상화에 의존하게 해야 한다. 자바에서는 상위 모듈에서 하위 모듈을 가져다 쓸때 구체 클래스를 가져다 쓰는 것이 아니라 인터페이스를 가져다 쓰게 해야 한다. 구체 클래스를 가져다 쓰면 DIP 위반이다.
또 추상화는 세부 사항에 의존해서는 안되며 세부 사항이 추상화에 의존해야 한다.
ISP (Interface Segregation Principle)
인터페이스 분리 법칙이라는 말이다. 특정 클라이언트를 위한 인터페이스 여러개가 범용 인터페이스 하나보다 낫다 라는 의미이며 클라이언트에 특화된 인터페이스를 만들어야 하는 말이다.