소프트웨어 개발에서 시간이 지나도 유지보수하기 쉽고 유연한 시스템을 만드는 것은 매우 중요합니다. SOLID는 객체 지향 프로그래밍 및 설계의 다섯 가지 기본 원칙을 나타내는 약어로, 로버트 C. 마틴(Robert C. Martin)에 의해 널리 알려졌습니다.
이 원칙들을 따르면 코드의 결합도(coupling)는 낮추고 응집도(cohesion)는 높여, 더 깔끔하고 이해하기 쉬우며 확장에 유연한 코드를 작성할 수 있습니다.
1. 단일 책임 원칙 (SRP: Single Responsibility Principle)
"클래스는 단 하나의 변경 이유만을 가져야 한다."
이는 클래스가 하나의 기능이나 역할에만 집중해야 한다는 의미입니다. 예를 들어, '사용자 인증'과 '사용자 정보 조회' 기능이 하나의 클래스에 있다면, 각 기능의 변경이 서로에게 영향을 줄 수 있습니다. 이들을 별개의 클래스로 분리하면 독립적인 수정과 관리가 가능해집니다.
2. 개방-폐쇄 원칙 (OCP: Open/Closed Principle)
"소프트웨어 개체(클래스, 모듈, 함수 등)는 확장에 대해서는 열려 있어야 하지만, 수정에 대해서는 닫혀 있어야 한다."
새로운 기능을 추가할 때 기존 코드를 변경하는 것이 아니라, 새로운 코드를 추가하여 기능을 확장해야 한다는 원칙입니다. 주로 추상화와 다형성을 통해 구현됩니다. 예를 들어, 결제 방법에 '카카오페이'를 추가할 때 기존 결제 로직을 수정하는 대신, 새로운 '카카오페이' 클래스를 추가하여 시스템에 통합하는 방식입니다.
3. 리스코프 치환 원칙 (LSP: Liskov Substitution Principle)
"상위 타입의 객체를 하위 타입의 객체로 치환해도 프로그램의 정확성은 깨져서는 안 된다."
즉, 자식 클래스는 최소한 부모 클래스의 기능을 모두 수행할 수 있어야 하며, 부모 클래스가 사용되는 곳에 자식 클래스를 넣어도 문제없이 동작해야 합니다. 예를 들어, '새' 클래스를 상속받는 '타조' 클래스가 '날다()' 메소드를 제대로 구현할 수 없다면, 이는 LSP를 위반하는 설계일 수 있습니다.
4. 인터페이스 분리 원칙 (ISP: Interface Segregation Principle)
"클라이언트는 자신이 사용하지 않는 메서드에 의존 관계를 맺으면 안 된다."
하나의 거대한 인터페이스보다는, 특정 클라이언트를 위한 여러 개의 구체적인 인터페이스를 만드는 것이 낫다는 원칙입니다. 예를 들어, '동물' 인터페이스에 '먹다()', '날다()', '헤엄치다()'가 모두 포함되어 있다면, 날지 못하는 동물도 '날다()' 메서드를 억지로 구현해야 합니다. '나는 동물', '헤엄치는 동물' 등으로 인터페이스를 분리하면 이런 문제를 해결할 수 있습니다.
5. 의존관계 역전 원칙 (DIP: Dependency Inversion Principle)
"상위 모듈은 하위 모듈에 의존해서는 안 되며, 둘 모두 추상화에 의존해야 한다. 추상화는 세부 사항에 의존해서는 안 되며, 세부사항이 추상화에 의존해야 한다."
구체적인 구현 클래스에 직접 의존하는 대신, 추상적인 인터페이스나 상위 클래스에 의존해야 한다는 의미입니다. 이를 통해 모듈 간의 결합도를 크게 낮출 수 있습니다. 예를 들어, 자동차가 특정 브랜드의 '스노우 타이어'에 직접 의존하는 대신, 추상적인 '타이어' 인터페이스에 의존하게 만들면, 나중에 '사계절 타이어'로 쉽게 교체할 수 있습니다.
댓글 없음:
댓글 쓰기