본문 바로가기
프로그래밍

객체지향 설계 5대 원칙(SOLID)

by 테크 가디언 2024. 5. 21.

객체지향 설계 원칙 중에서도 SOLID 원칙은 소프트웨어 개발에서 유지보수성과 확장성을 높이기 위해 고안된 다섯 가지 기본 원칙을 의미합니다. SOLID는 다음 다섯 가지 원칙의 첫 글자를 따서 만든 약어입니다

 

단일 책임 원칙 (Single Responsibility Principle, SRP)

개방-폐쇄 원칙 (Open/Closed Principle, OCP)

리스코프 치환 원칙 (Liskov Substitution Principle, LSP)

인터페이스 분리 원칙 (Interface Segregation Principle, ISP)

의존 역전 원칙 (Dependency Inversion Principle, DIP)

 

1. 단일 책임 원칙 (Single Responsibility Principle, SRP)

정의

클래스는 단 하나의 책임만 가져야 하며, 클래스가 변경되는 이유는 하나뿐이어야 한다.

설명

하나의 클래스는 하나의 기능만 가지며, 해당 기능과 관련된 변경 사항만 영향을 받아야 합니다. 이는 클래스의 응집도를 높이고, 변화에 쉽게 적응할 수 있도록 합니다.

예시

Invoice 클래스가 인보이스 데이터를 처리하는 기능과 인쇄하는 기능을 모두 가지고 있다면, 인쇄 관련 코드가 변경될 때 인보이스 처리 코드에도 영향을 미칠 수 있습니다. 이를 분리하여 Invoice 클래스는 인보이스 데이터를 처리하고, InvoicePrinter 클래스는 인보이스를 인쇄하도록 합니다.

 

2. 개방-폐쇄 원칙 (Open/Closed Principle, OCP)

정의

소프트웨어 구성 요소(클래스, 모듈, 함수 등)는 확장에는 열려 있어야 하고, 수정에는 닫혀 있어야 한다.

설명

새로운 기능을 추가할 때 기존 코드를 수정하지 않고, 기존 코드를 확장하여 새로운 기능을 구현할 수 있어야 합니다. 이를 통해 시스템의 안정성을 유지할 수 있습니다.

예시

새로운 할인 정책을 추가할 때 기존 Discount 클래스의 코드를 수정하지 않고, Discount 인터페이스를 구현하는 새로운 클래스를 만들어서 처리할 수 있습니다.

 

3. 리스코프 치환 원칙 (Liskov Substitution Principle, LSP)

정의

서브 타입은 언제나 자신의 기반 타입으로 교체할 수 있어야 한다.

설명

자식 클래스는 부모 클래스의 기능을 확장할 수 있지만, 부모 클래스의 기능을 변경하거나 약화시켜서는 안 됩니다. 이를 통해 객체의 치환 가능성을 보장할 수 있습니다.

예시

Rectangle 클래스와 이를 상속받은 Square 클래스가 있을 때, Square 클래스가 Rectangle 클래스의 동작을 일관성 있게 유지해야 합니다. 만약 Square 클래스가 Rectangle 클래스의 동작을 깨뜨린다면 LSP를 위반한 것입니다.

 

4. 인터페이스 분리 원칙 (Interface Segregation Principle, ISP)

정의

특정 클라이언트를 위한 인터페이스 여러 개가 범용 인터페이스 하나보다 낫다.

설명

클라이언트는 자신이 사용하지 않는 메서드에 의존하지 않아야 합니다. 큰 인터페이스를 작은 인터페이스로 분리하여 필요한 기능만 제공함으로써 클라이언트의 불필요한 의존성을 줄일 수 있습니다.

예시

Worker 인터페이스가 work()와 eat() 메서드를 가지고 있다면, Robot 클래스는 eat() 메서드를 사용하지 않을 것입니다. 이를 분리하여 Workable 인터페이스와 Eatable 인터페이스로 나누면 Robot 클래스는 Workable 인터페이스만 구현하면 됩니다.

 

5. 의존 역전 원칙 (Dependency Inversion Principle, DIP)

정의

고수준 모듈은 저수준 모듈에 의존해서는 안 되며, 둘 다 추상화에 의존해야 한다. 추상화는 구체적인 사항에 의존해서는 안 된다.

설명

구체적인 클래스보다 인터페이스나 추상 클래스에 의존함으로써 유연성을 높일 수 있습니다. 이는 모듈 간의 결합도를 낮추고, 변경에 더 잘 적응할 수 있게 합니다.

예시

PaymentProcessor 클래스가 CreditCard 클래스에 직접 의존하면 결합도가 높아집니다. 이를 PaymentMethod 인터페이스로 추상화하여 CreditCard, Paypal 등의 구체적인 결제 수단들이 PaymentMethod 인터페이스를 구현하도록 하면 결합도가 낮아집니다.

 

SOLID 원칙을 잘 준수하면 객체지향 설계의 유연성과 유지보수성이 크게 향상됩니다. 이러한 원칙들은 서로 연관되어 있으며, 함께 적용될 때 강력한 시너지를 발휘합니다.

반응형