항해 99 27일차 10/15일
어제 카카오톡 자체가 아예 안되서 지금 올립니다.
객체 지향 설계 5원칙
객체 지향 프로그래밍 및 설계의 다섯가지 기본원칙을 SOLID라는 것으로 불리고 있습니다.
SOLID는 객체 지향 프로그래밍 및 설계의 다섯 가지 기본 원칙의 맨 앞단어를 하나씩 가져와 만든 것 입니다.
SOLID는 프로그래머가 시간이 지나도 유지 보수와 확장이 쉬운 시스템을 만들고자 할 때 사용합니다.
SOLID의 종류
단일 책임의 원칙 (Single Responsibility Principle, SRP)
개방-폐쇄 원칙 (Open-Closed Principle, OCP)
리스코프 치환 원칙 (Liskov substitution principle, LSP)
인터페이스 분리 원칙 (Interface segregation principle, ISP)
의존성 역전 원칙 (Dependency Inversion Principle, DIP)
단일 책임의 원칙 (Single Responsibility Principle, SRP)
하나의 객체는 단 하나의 책임을 가져야 한다.
즉, 클래스나 모듈을 변경할 이유가 단 하나뿐이어야 한다는 원칙입니다.
SRP는 책임이라는 개념을 정의하며 적절한 클래스의 크기를 제시합니다.
SRP는 객체 지향설계에서 중요한 개념이고 이해하고 따르기 쉬운 개념이지만, 프로그래머가 가장 무시하는 규칙입니다. 일반적인 프로그래머는 “깨끗하고 우아하게 작성된 소프트웨어"보다 “동작하기만 하는 소프트웨어"에 초점을 맞추기 때문입니다.
개방-폐쇄 원칙 (Open-Closed Principle, OCP)
소프트웨어 엔티티 또는 개체(클래스, 모듈, 함수 등)는 확장에는 열려 있으나 변경에는 닫혀 있어야 한다.
즉, 소프트웨어 개체의 행위는 확장될 수 있어야 하지만, 개체를 변경해서는 안됩니다.
조금 더 쉽게 설명하자면, 기존 코드에 영향을 주지않고 소프트웨어에 새로운 기능이나 구성 요소를 추가할 수 있어야 한다는 것입니다.
만약 요구사항을 조금확장하는 데 소프트웨어를 엄청나게 수정해야 한다면, 소모되는 개발 코스트또한 엄청나게 증가할 것입니다.
리스코프 치환 원칙 (Liskov substitution principle, LSP)
프로그램의 객체는 프로그램의 정확성을 깨뜨리지 않으면서 하위 타입의 인스턴스로 바꿀 수 있어야 한다.
여기서 하위 타입이란 S타입의 객체 o1각각에 대응하는 T타입 객체 o2가 있고, T타입을 이용해서 정의한 모든 프로그램 P에서 o2의 자리에 o1을 치환하더라도 P의 행위가 변하지 않는다면, S는 T의 하위 타입입니다.
즉, S가 T의 하위 유형이면 해당 프로그램의 속성을 변경하지 않고 T객체를 S객체로 대체할 수 있습니다.
만약 부모 클래스와 자식 클래스가 있는 경우 서로를 바꾸더라도해당 프로그램에서 잘못된 결과를 도출하지 않는 것입니다.
인터페이스 분리 원칙 (Interface segregation principle, ISP)
특정 클라이언트를 위한 인터페이스 여러 개가 범용 인터페이스 하나보다 낫다.
즉, 클라이언트가 필요하지 않는 기능을 가진 인터페이스에 의존해서는 안 되고, 최대한 인터페이스를 작게유지해야합니다.
조금 더 쉽게 설명하자면, 사용자가 필요하지 않은 것들에 의존하지 않도록, 인터페이스를 작게 유지해야 한다는 것입니다.
의존성 역전 원칙 (Dependency Inversion Principle, DIP)
프로그래머는 추상화에 의존해야지, 구체화에 의존하면 안된다.
즉, 높은 계층의 모듈(도메인)이 저수준의 모듈(하부구조)에 의존해서는 안된다.
조금 더 자세하게 정리해보자면,
고수준 계층의 모듈(도메인)은 저수준 계층의 모듈(하부구조)에 의존해서는 안된다. 둘 다 추상화에 의존해야 한다.
추상화는 세부 사항에 의존해서는 안 된다. 세부 사항은 추상화에 의존해야 한다.
만약 추상화를 하지 않고 고수준 계층의 모듈이 저수준 계층의 모듈을 의존하고 있다면 어떤 상황이 발생할까요? 사소한 코드 변경에도 고수준 계층의 코드를 변경해야할 것이고, 소모되는 개발 코스트또한 엄청나게 증가할 것입니다.