객체지향 5원칙(SOLID)

객체지향 5원칙(SOLID)
muaga's avatar
May 19, 2024
객체지향 5원칙(SOLID)

SOLID 원칙


객체 지향 프로그래밍 및 설계의 5가지 기본 원칙
 

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

객체는 오직 하나의 책임을 가져야 한다.
(객체는 오직 하나의 변경의 이유 만을 가져야 한다.)
  • 클래스의 목적을 명확히 함으로써 구조를 간단히 하고 기능을 분리한다.
  • 유지보수 시 코드 추적이 용이해진다.
 

◽ OCP (Open/Closed Principle) : 개방/폐쇄 원칙

객체는 확장에 대해서는 개방적이고, 수정에 대해서는 폐쇄적이어야 한다.
(객체 기능의 확장을 허용하고, 스스로의 변경은 피해야 한다.)
  • 특정 기능과 비슷한 다른 기능을 구현 시, 기존 기능을 그대로 두고 따로 재정의(확장)하면 기존의 기능은 수정할 필요가 없다.(폐쇄)
 

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

자식 클래스는 언제나 자신의 부모를 대체할 수 있다.
즉, 부모 클래스가 들어갈 자리에 자식 클래스를 넣어도 계획대로 잘 작동해야 한다는 것
= 상속의 본질
  • 조건
      1. 형식적으로, 오버라이딩하는 변수 및 메소드가 부모 클래스의 형식과 일치해야 한다.
      1. 내용적으로, 부모 클래스의 메소드에 담긴 의도와 규약을 위반하지 않아야 한다.
 

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

자신이 사용하지 않는 인터페이스는 구현하지 말아야 한다.
  • 큰 덩어리의 인터페이스들을 구체적이고 작은 단위로 분리시켜 꼭 필요한 메소드만 이용할 수 있게 한다.
  • 시스템의 내부 의존성을 약화시켜 리팩토링, 수정 등을 쉽게 할 수 있다.
 

◽ DIP (Dependacny Inversion Principle) : 의존관계 역전 원칙

의존 관계를 맺을 때 자주 변화하는 것보다 변화가 거의 없는 것에 의존해야 한다.
  • 내용
    • 1. 상위 모듈은 하위 모듈에 의존해서는 안된다. 둘 다 추상화에 의존해야 한다.
      2. 추상화는 세부 사항에 의존해서는 안된다. 세부 사항이 추상화에 의존해야 한다.
       
이상한 나라의 앨리스로 드는 예시
  • 심문 : setter -> "재판관은 심문을 하면 피곤함 ↑"
    • 상태값을 변경시키는 것이 하나가 아닌, 동시에 여러 개를 변경시킬 수 있다.
      예) 왕이 심문을 하면(변경되는 상태 1), 동시에 피곤함이 상승(변경되는 상태 2)
      👉 (new)가 된 이후 - 상태값을 변경 ; 상태는 행위를 통해 변경된다를 실현
  • 왕 : 재판관이 되어 모자장수를 심문할 수 있는 객체 1
  • 여왕 : 재판관이 되어 모자장수를 심문할 수 있는 객체 2
  • 엘리스
  • 모자장수 : 심문을 당하는 객체
 
❔ 재판관이 될 수 있는 1번째 방법
k(왕)에게만 재판관이 될 수 있는 방법을 알려준 후, 심문할 수 있는 권리가 생겼다.
👉 k.심문( );
q(여왕)에게만 재판관이 될 수 있는 방법을 알려준 후, 심문할 수 있는 권리가 생겼다.
👉 q.심문( );
➡️ 재판관이 되는 방법은 k(왕), q(여왕)만 알 수 있다
 
그런데, 엘리스도 재판관이 되고 싶어한다.
그러자 왕과 여왕은 엘리스에게 재판관이 될 수 있는 방법을 알려주면서, 본인들의 피곤함과 스케줄을 변경해야 했다. 수정
✅ 이러한 상황이 생길 때, 인터페이스나 상속을 통해 기존 행위가 변경될 필요 없이 추가만 하여 상황이 가능하도록 하자.
 
❔ 재판관이 될 수 있는 2번째 방법
재판관이 될 수 있는 방법은 k(왕), q(여왕)에게만 알려주지 않고, [책 A]를 만들어 놓는다. 그래서 왕과 여왕은 그 책을 통해 재판관이 되었고, 심문할 수 있는 권리가 생겼다.
👉 심문 k(왕) = new 심문();
👉 심문 q(여왕) = new 심문();
➡️ k(왕), q(여왕)은 재판관이 되어 모자장수를 심문할 수 있는 재판관이 되었다. 상태 변경
 
그런데, 엘리스도 재판관이 되고 싶어한다.
그러자 엘리스는 재판관이 될 수 있는 방법이 적힌 [책 A]를 통해 재판관이 되었다.
👉 심문 e(엘리스) = new 심문();
➡️ e(엘리스)도 재판관이 되어 모자장수를 심문할 수 있는 재판관이 되었다.(상태 변경)
 
엘리스는 책을 통해서 혼자 공부해 재판관이 될 수 있었기 때문에, 왕과 여왕의 심문 스케줄과 피곤함에는 전혀 지장을 주지 않았다.
✅ 오버라이딩 : 이와 같이 오브젝트에 의존하고 있는 코드를 짜면, 수 많은 코드를 수정해야 한다. 원래 의존하는 것을 코드를 짜는 것이 맞으나, 구체적인 것이 아닌 추상적인 것에 의존해야 한다.
 

🤓 출저 및 참고 자료


 
Share article

muaga's Hub