본문 바로가기

Design

객체지향 5대 원칙 SOLID

이미지 출처 : https://depositphotos.com/

객체 지향 설계의 정수라고 할 수 있는 5대 원칙으로 SOLID가 있다.

아래 원칙들은 응집도는 높이고, 결합도는 낮추는 고전 원칙을 객체지향의 관점에서 재정립 한 것이다.

  • SRP(Single Responsibility Principle) : 단일 책임 원칙
  • OCP(Open Closed Principle) : 개방 폐쇄 원칙
  • LSP(Liskov Substitution Principle) : 리스코프 치환 원칙
  • ISP(Interface Segregation Principle) : 인터페이스 분리 원칙
  • DIP(Dependency Inversion Principle) : 의존 역전 원칙

SOLID는 제품이 아닌 개념이기에, 보는 사람의 관점에 따라 다르게 해석 될 수 있다.

 

SRP - 단일 책임 원칙

Single Responsibility Principle

클래스를 역할과 책임에 따라 분리하라.

하나의 클래스가 불필요한 역할을 전부 가지고 있어서는 안된다. 역할과 책임에 알맞게 클래스를 분리 해야 한다.

알맞은 추상화를 통해서, 불필요한 분기 처리나 불필요한 책임을 가지지 않도록 해야 한다.

 

OCP - 개방 폐쇄 원칙

Open Closed Principle

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

환경의 변화나 모듈의 교체에 대해서 유연해야 한다. 하지만 환경, 모듈이 변화한다고 해서 자신(코드)이 변경 돼서는 안된다.

객체 지향 프로그래밍의 가장 큰 장점인 유연성, 재사용성, 유지보수성을 얻기 위해서는 개방 폐쇄 원칙은 반드시 지켜야 한다.

 

LSP - 리스코프 치환 원칙

Liskov Substitution Principle

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

하위 클래스의 인스턴스는 상위 클래스의 인스턴스 역할을 하는데 문제가 없어야 한다.

  • 사람 왕민 = new 남자()
  • 동물 나비 = new 고양이()

위 예시 처럼 객체 지향의 상속이라는 특성을 올바르게 활용하면 자연스럽게 지키게 되는 원칙이다.

 

ISP - 인터페이스 분리 원칙

Interface Segregation Principle

클라이언트는 자신이 사용하지 않는 메소드에 의존 관계를 맺어선 안된다.

단일 책임 원칙의 해결책과는 달리, 다수의 인터페이스로 분리하는 방법을 따른다. 인터페이스를 분리 할 때는 인터페이스 최소주의 원칙을 따라서 최소한의 메소드만 제공 해야 한다.

 

DIP - 의존 역전 원칙

Dependency Inversion Principle

고차원 모듈은 저차원 모듈에 의존하면 안된다. 이 두 모듈 모두 다른 추상화된 것에 의존해야 한다. 추상화 된 것은 구체적인 것에 의존하면 안된다. 구체적인 것이 추상화된 것에 의존해야 한다.

쉽게 말해서 '자신보다 변하기 쉬운 것에 의존하면 안된다.'라는 의미로 볼 수 있다.

교체 주기가 잦은 모듈이라면 해당 모듈이 아닌, 추상화 된 인터페이스 혹은 클래스에 의존해야 한다는 원칙이다.

 

요약 및 정리

SOLID의 각 원칙을 간단하게 요약하면 아래와 같다.

  • SRP(단일 책임 원칙) : 어떤 클래스를 변경해야 하는 이유는 오직 하나 뿐이어야 한다.
  • OCP(개방 폐쇄 원칙) : 자신의 확장에는 열려 있고, 주변의 변화에 대해서는 닫혀 있어야 한다.
  • LSP(리스코프 치환 원칙) : 서브 타입은 언제나 자신의 기반 타입으로 교체할 수 있어야 한다.
  • ISP(인터페이스 분리 원칙) : 클라이언트는 자신이 사용하지 않는 메소드에 의존관계를 맺으면 안된다.
  • DIP(의존 역전 원칙) : 자신보다 변하기 쉬운 것에 의존하지 마라.

SOLID원칙을 따르면 소스 파일의 개수는 많아 질 수 있다. 하지만 이해하기 쉽고, 개발하기 쉽고, 유지와 관리, 보수하기 쉬워진다.

참조

 

스프링 입문을 위한 자바 객체 지향의 원리와 이해

자바에서 스프링으로 나아가기 위한 연결 고리를 제공해 드립니다! 자바 엔터프라이즈 개발을 편하게 해주는 오픈소스 경량 애플리케이션 프레임워크인 스프링은 자바와 객체 지향이라는 기반

wikibook.co.kr

 

'Design' 카테고리의 다른 글

Layered Architecture in DDD  (0) 2021.02.04
Entity, VO, DTO  (0) 2021.02.01