SOLID : 객체 지향 설계의 5가지 원칙

dakcoh·2024년 10월 3일


안녕하세요.
이번 게시글에서는 SOLID : 객체 지향 설계의 5가지 원칙에 대해서 공부해보려고 합니다.

객체지향 프로그래밍(OOP)은 복잡한 소프트웨어 시스템을 효과적으로 설계하고 관리하기 위한 강력한 패러다임입니다.
하지만 규모가 커지고 요구사항이 변화함에 따라, 코드의 유지보수성과 확장성을 보장하는 것이 점점 어려워집니다.

이런 문제를 해결하기 위해 등장한 것이 바로 SOLID 원칙입니다.


SOLID란?

SOLID는 다섯 가지 객체지향 설계 원칙의 앞 글자를 딴 용어입니다.

이 원칙들은
코드의 가독성을 높이고,
재사용성확장성을 극대화하며,
유지보수를 용이하게 하기 위한 지침을 제공합니다.

각 원칙은 다음과 같습니다.

S: Single Responsibility Principle (단일 책임 원칙)
한 클래스나 모듈은 하나의 책임만 가져야 하며, 변경의 이유도 오직 하나여야 합니다.
O: Open/Closed Principle (개방-폐쇄 원칙)
소프트웨어 구성 요소는 확장에는 열려 있어야 하고, 수정에는 닫혀 있어야 합니다.
L: Liskov Substitution Principle (리스코프 치환 원칙)
상위 타입의 객체 대신 하위 타입의 객체를 사용해도 시스템이 정상적으로 작동해야 합니다.
I: Interface Segregation Principle (인터페이스 분리 원칙)
클라이언트는 사용하지 않는 메서드에 의존하지 않아야 하며, 인터페이스는 구체적이고 작은 단위로 분리해야 합니다.
D: Dependency Inversion Principle (의존 역전 원칙)
상위 모듈이 하위 모듈에 의존하지 않고, 둘 다 추상화(인터페이스나 추상 클래스)에 의존해야 합니다.


SRP(Single Responsibility Principle)

단일 책임 원칙은 한 클래스나 모듈이 오직 하나의 책임만 가져야 한다는 개념입니다.

핵심 특징

(1) 책임의 분리
한 클래스가 여러 역할을 동시에 수행하면, 하나의 역할에 변경이 생겼을 때 다른 역할에도 영향을 미칠 수 있습니다.
(2) 유지보수 용이성
각 클래스가 단일한 역할만 담당하면, 특정 기능을 수정하거나 확장할 때 해당 클래스만 집중적으로 수정하면 됩니다.
(3) 가독성 향상
클래스의 역할이 명확해지므로, 코드를 읽는 사람이 해당 클래스의 목적과 기능을 빠르게 파악할 수 있습니다.

SRP를 따르면, 시스템 내 각 요소가 명확한 책임을 가지게 되어 변화가 생길 때 영향을 받는 부분이 최소화되고, 코드의 구조가 단순해집니다.


OCP(Open/Closed Principle)

개방-폐쇄 원칙은 소프트웨어 구성 요소는 확장에는 열려 있으면서, 수정에는 닫혀 있어야 한다는 원칙입니다.

핵심 특징

(1) 기존 기능 보호
새로운 기능을 추가할 때, 이미 안정적으로 동작하는 기존 코드를 변경하지 않아도 됩니다.
(2) 확장성
새로운 요구사항이나 기능이 추가되어도 기존 모듈의 내부 구현에 영향을 주지 않고 기능을 덧붙일 수 있습니다.
(3) 추상화 활용
인터페이스나 추상 클래스를 통해 기능을 정의하고, 구체적인 구현은 별도로 관리하여 시스템의 유연성을 높입니다.

OCP를 준수하면, 시스템의 안정성을 보존하면서도 변화하는 요구사항에 유연하게 대응할 수 있습니다.


LSP(Liskov Substitution Principle)

리스코프 치환 원칙은 상위 타입의 객체를 하위 타입의 객체로 교체해도 시스템의 동작이 동일해야 한다는 원칙입니다.

핵심 특징

(1) 일관된 행위 보장
상위 클래스나 인터페이스에 정의된 동작을 하위 클래스도 그대로 수행하여, 어떤 타입의 객체를 사용하더라도 동일한 결과를 기대할 수 있습니다.
(2) 안정성과 재사용성
하위 클래스가 상위 클래스의 계약을 완벽하게 이행하면, 기존 코드를 수정하지 않고 새로운 기능을 추가할 수 있습니다.
(3) 설계의 신뢰성
올바른 상속 구조와 다형성은 코드의 확장과 유지보수를 보다 안정적으로 만들어 줍니다.

LSP를 올바르게 구현하면, 상속을 통한 기능 확장이 안전해지고, 예기치 못한 오류를 예방할 수 있습니다.


ISP(Interface Segregation Principle)

인터페이스 분리 원칙은 클라이언트가 필요하지 않은 기능에 의존하지 않아야 한다는 원칙입니다.

핵심 특징

(1) 구체적 인터페이스 구성
하나의 큰 인터페이스 대신, 각 클라이언트가 실제로 사용하는 기능별로 작고 구체적인 인터페이스를 제공함으로써 불필요한 의존성을 제거합니다.
(2) 코드 단순화
클라이언트는 자신에게 필요한 기능만 구현하면 되므로, 코드가 간결해지고 이해하기 쉬워집니다.
(3) 독립적 테스트 가능
작고 분리된 인터페이스는 각각 독립적으로 테스트하고 개선하기 용이합니다.

ISP를 적용하면, 시스템 전반의 모듈 간 결합도가 낮아져서, 변화에 따른 영향을 최소화할 수 있습니다.


DIP(Dependency Inversion Principle)

의존 역전 원칙은 상위 모듈이 하위 모듈에 직접 의존하지 않고, 둘 다 추상화에 의존해야 한다는 원칙입니다.

핵심 특징

(1) 추상화에 의존
구체적인 구현체가 아닌, 인터페이스나 추상 클래스를 통해 의존성을 관리함으로써, 시스템 구성 요소들을 쉽게 교체하거나 확장할 수 있습니다.
(2) 결합도 감소
구체적인 클래스에 의존하지 않기 때문에, 한 모듈의 변경이 다른 모듈에 미치는 영향을 크게 줄일 수 있습니다.
(3) 테스트 용이성
추상화 덕분에 모의 객체(mock)를 활용한 단위 테스트가 쉬워지며, 테스트 주도 개발(TDD)에 유리한 구조를 만듭니다.

DIP를 준수하면, 전체 시스템이 보다 유연해지고, 새로운 기술이나 구현체를 쉽게 통합할 수 있는 기반을 마련할 수 있습니다.


마무리

SOLID 원칙은 단순히 이론적인 개념이 아니라, 실제 소프트웨어 개발에서 유지보수성과 확장성을 높이기 위한 실질적인 설계 지침입니다.
각 원칙은 서로 보완적이며, 함께 적용할 때 코드의 가독성, 재사용성, 그리고 시스템의 유연성을 극대화할 수 있습니다.

저와 같은 주니어 개발자들은 특히 SOLID 원칙의 핵심 개념을 이해하고 이를 프로젝트에 조금씩 적용을 해보는게 좋을 것 같습니다.
이러한 설계 지침을 통해 보다 안정적이고 효율적인 코드를 작성하는 데 큰 도움이 되기를 바랍니다.

감사합니다.

profile
포기하기 금지

0개의 댓글