본문 바로가기
프로그래밍

객체지향 프로그래밍의 5가지 설계 원칙, SOLID

by so5663 2022. 10. 22.

객체지향 5원칙(SOLID)이란?

  • SOLID란 로버트 마틴이 2000년대 초에 명명한 객체 지향 프로그래밍의 다섯 가지 기본 원칙을 마이클 페더스가 원칙의 앞 글자를 따서 다시 SOLID라는 이름으로 소개한 것입니다.
  • SOLID의 5대 원칙을 나열하면 다음과 같습니다.
  1. 단일 책임 원칙(Single responsibility principle) : SRP
  2. 개방 폐쇄 원칙(Open/closed principle) : OCP
  3. 리스코프 치환 원칙(Liskov substitution principle) : LSP
  4. 인터페이스 분리 원칙(Interface segregation principle) : ISP
  5. 의존관계 역전 원칙(Dependency inversion principle) : DIP

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

SOLID의 S에 해당하는 원칙으로 모든 클래스는 각각 하나의 기능만 가진다는 의미입니다. 다시 말하면 해당 클래스가 제공하는 모든 서비스는 단 하나의 책임을 수행하는 데 집중되어야 한다는 원칙입니다.

 

저는 이게 제일 중요하다고 생각합니다.

이 원칙을 지키면 코드의 가독성향상뿐만 아니라 유지보수에도 상당한 이점이 있습니다.

 

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

SOLID의 O에 해당하는 원칙으로 소프트웨어의 모든 구성요소(클래스, 모듈, 함수)는 확장에는 열려있고,

변경에는 닫혀있어야한다는 원칙입니다.

다시 말하면 요구사항의 변경이나 추가사항의 발생하더라도, 기존 구성요소는 수정이 일어나지 말아야하며 쉽게 확장이 가능하여 재사용할 수 있어야 한다는 뜻입니다.

 

클래스를 설계할 때 변할 부분과 변하지 않을 부분을 명확히 구분해야 겠습니다.

변할 수 있는 부분은 추상화하여 상속하는 클래스가 의존할 수 있게 코드를 작성합니다.

적당한 추상화 레벨을 선택해야 합니다. 그래디 부치에 의하면 추상화란 ‘다른 모든 종류의 객체로부터 식별될 수 있는 객체의 본질적인 특징’ 이라고 정의합니다. 이 ‘본질적인 특징’을 명확히 정의할 수 있어야겠습니다.

Interface란 이런 변하지않을 본질적인 특징에 관한 약속입니다.

 

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

한마디로 부모 클래스를 상속한 자식 클래스는 부모 클래스의 역할을 정확히 해내야한다는 뜻입니다.

 

LSP를 지키는 가장 간단한 방법은 상속을 하되 override를 안하는 것입니다. 하지만 이게 무조건 적인 방법은 아닙니다.

상속을 할 때 override가 필요하다면 기존 부모 클래스의 메소드가 하던 역할을 충실히 수행하고 기능의 추가만 신중하게 수행하면 됩니다.

 

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

SOLID의 I에 해당하는 원칙으로 자신이 사용하지 않는 인터페이스는 구현하지 말아야 한다는 원칙입니다. 

자신이 사용하지 않는 인터페이스를 구현하지 않으려면 인터페이스를 구체적이고 작은 단위들로 분리시켜 필요한 인터페이스만 상속하면 됩니다.

 

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

SOLID의 마지막인 D에 해당하는 원칙입니다. 위 원문을 그대로 번역하면 ‘상위 모듈은 하위 모듈에 의존해서는 안된다. 둘 다 추상화에 의존해야한다.’, ‘추상화는 구체적인 것에 의존해서는 안된다. 구체적인 것은 추상화에 의존해야한다.’입니다

 

 

'프로그래밍' 카테고리의 다른 글

트래픽이 증가할 때 고려해야 할 사항  (0) 2024.05.25
[tomcat] 톰캣 가상 호스팅  (0) 2023.06.06
웹 서버와 WAS의 차이  (0) 2023.01.12
쿠키(cookie) 저장 및 삭제  (0) 2022.12.29
REST API 기본  (0) 2022.10.31