CS

[OOP] 객체지향 설계 5원칙

명도환 2025. 3. 17. 09:29

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

-       어떠한 클래스를 변경해야 하는 이유는 오직 하나뿐이어야 한다.


2.    OCP(Open Closed Principle) : 개방 폐쇄 원칙

-       소프트웨어 엔티티(클래스, 모듈, 함수 등)는 확장에 대해서는 열려 있어야 하지만 변경에 대해서는 닫혀 있어야 한다.

-       확장에 열려 있다 : 요구사항이 변경될 때 새로운 동작을 추가하여 애플리케이션의 기능을 확장할 수 있다.

-       변경에 닫혀 있다 : 기존의 코드를 수정하지 않고 애플리케이션의 동작을 추가하거나 변경할 수 있다.

-       자신의 확장에는 열려있고, 주변의 변화에 대해서는 닫혀 있어야 한다.

-       JDBC를 사용하는 클라이언트는 데이터베이스가 오라클에서 MySql로 바뀐다고 해도 Connection을 설정하는 부분 외에는 따로 수정 할 필요가 없다.

-       JDBC라는 상위 클래스 혹은 인터페이스를 중간에 둠으로써 다양한 데이터베이스에도 실제 개발자의 코드에 영향을 거의 미치지 않는다.

-       JDBC뿐만 아니라 IBatis, MyBatis, 하이버네이트 등등 데이터베이스 프로그래밍을 지원하는 라이브러리와 프레임워크도 개방폐쇄원칙의 예로 볼 수 있다.

-       또한 자바를 예로 들면 운영체제 별 JVM과 목적파일이 있기에 개발자는 다양한 구동환경에 대해서는 걱정하지 않고 본인이 작업하고 있는 개발 PC에 설치된 JVM에서만 코드를 작성할 수 있다.

-       개방 폐쇄 원칙을 지키기 위해서는 추상화에 의존해야 한다.

-       추상화를 통해 변하는 것들은 숨기고 변하지 않는 것들에 의존하게 하면 기존의 코드 나 클래스를 수정하지 않고 애플리케이션을 확장할 수 있다.


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

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

-       객체지향에서의 상속은 다음 조건을 만족해야 한다.

 

# 하위 클래스 is a kind of 상위 클래스 -> 하위 분류는 상위 분류의 한 종류이다.

# 구현 클래스 is able to 인터페이스 -> 구현 분류는 인터페이스 할 수 있어야 한다.

 

-       상속 관계는 계층적인 것이 아닌 확장과 재사용적인 개념이다.

-       아버지 – 아들 구조(계층적 / 조직도)는 리스코프 치환 원칙을 위배하는 것이며

-       동물 – 고양이 구조(분류도)는 리스코프 치환 원칙을 만족하고 있는 것이다.

-       하위 클래스의 인스턴스는 상위형 객체 참조 변수에 대입해 상위 클래스의 인스턴스 역할을 하는데 문제가 없어야 한다.


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

-       클라이언트는 자신이 사용하지 않는 메서드에 의존 관계를 맺으면 안 된다.

-       여자친구에게는 남자친구의 역할을 하고, 부모님에게는 아들의 역할, 상사에게는 사원의 역할, 소대장에게는 소대원의 역할을 하는 인터페이스로 제한하는 방식이다.

 


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

-       고차원 모듈은 저차원 모듈에 의존하면 안 된다.

-       고차원 모듈 : 변경이 없는 추상화된 클래스(또는 인터페이스)

-       저수준 모듈 : 변하기 쉬운 구체 클래스

-       이 두 모듈 모두 다른 추상화된 것에 의존해야 한다.

-       추상화된 것은 구체적인 것에 의존하면 안 된다.

-       구체적인 것이 추상화 된 것에 의존해야 한다.

-       여기서 자동차는 추상화 된 것인데 구체적인 스노우 타이어에 의존하고 있으므로 의존 역전 원칙에 위배 된다.

-       자동차가 구체적인 타이어들(스노우, 일반, 광폭)이 아닌 추상화된 타이어 인터페이스에 의존하게 함으로써 스노우타이어 에서 일반타이어로 변경되어도 자동차는 이 영향을 받지 않는 형태로 구성되어 의존 역전 원칙을 만족한다.

-       스노우 타이어 또한 어떤 것에도 의존적이지 않은 클래스였지만 의존 원칙 적용 후에는 추상적인 타이어 인터페이스에 의존하게 되었다.

-       자동차는 자신보다 변하기 쉬운 스노우 타이어에 의존하던 관계를 중간에 추상화된 타이어 인터페이스를 추가하여 의존 관계를 역전시키고 있다.

-       의존 역전 원칙이란 자신보다 변하기 쉬운 것에 의존하던 것을 추상화된 인터페이스나 상위 클래스를 두어 변하기 쉬운 것의 변화에 영향을 받지 않게 하는 것이다.

'CS' 카테고리의 다른 글

[CS] 디자인 패턴 간단 요약  (1) 2025.03.17
FTP와 SFTP  (1) 2025.03.11