본문 바로가기
Spring/자바 객체 지향의 원리와 이해

객체 지향 설계 5원칙 - SOLID

by k-mozzi 2023. 9. 4.
반응형
Preface

 

이번 장에선 객체 지향 설계 5원칙인 SOLID의 정의를 공부했다.

 

다소 추상적인 개념이던 객체 지향의 4대 특성을 SOLID와 결합해서 생각하니 쉽게 이해할 수 있었다.

 

책이 설명을 잘 하는 것인지, 단순히 여러 번 봐서 익숙해진 탓인지,

 

객체 지향의 개념과 장점 등 그동안 애매하게만 숙지하고 있던 내용들이 이상하게 머릿속에 쏙쏙 잘 들어온다.

 

또, 그동안 내가 자바로 작성하던 코드들이 SOLID 원칙, 특히 SRP 따위는 개나 줘버린 코드였던 것을 알 수 있었다.

 

단순히 클래스 파일과 메서드를 여러 개 생성하는 것이 귀찮아 특정 조건에 따라 분기하는 조건문을 사용하던 습관을 버려야 할 것 같다.


 

- SOLID: 객체 지향 설계 5원칙의 앞 머리 알파벳을 딴 단어

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

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

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

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

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

 

 

- 소프트웨어를 설계할 땐 결합도(coupling)는 낮추고 응집도(cohesion)는 높여야 한다.

 

 

- 참고 페이지: https://www.nextree.co.kr/p6960/

 

객체지향 개발 5대 원리: SOLID

현재를 살아가는 우리들은 모두 일정한 원리/원칙 아래에서 생활하고 있습니다. 여기서의 원칙 이라 함은 좁은 의미로는 개개인의 사고방식이나 신념, 가치관 정도가 될 수가 있겠고, 넓게는 한

www.nextree.co.kr

 

 

- SOLID

1. SRP(단일 책임 원칙): 어떤 클래스를 변경해야 하는 이유는 오직 하나뿐이어야 한다.
1) 클래스마다 역할(책임)을 분리해야 한다.
→ 복잡한 클래스를 단일 역할을 갖는 여러 개의 클래스로 분할해야 한다.
2) 하나의 속성이 여러 의미를 갖는 경우도 SRP를 지키지 못한 경우이다.
3) 분기 처리를 위한 조건문은 가능한 한 적어야 한다.
4) SRP와 가장 관계가 깊은 것은 추상화이다.
→ 애플리케이션 경계 설정, 클래스 및 속성, 메서드 선별 등


2. OCP(개방 폐쇄 원칙): 자신의 확장에는 열려 있고, 주변의 변화에 대해서는 닫혀 있어야 한다.
1) 대표적인 예시: JDBC
→ DBMS 종류가 변경되어도 Connection 부분을 제외하곤 수정할 필요가 없다.
2) OCP를 무시하면 유연성, 재사용성, 유지보수성 등을 잃게될 수 있다.


- 객체 지향의 상속 조건: 상위 클래스형의 참조 변수를 이용해야 상속의 장점을 제대로 사용할 수 있다.
1) 하위 클래스 is a kind of 상위 클래스
2) 구현 클래스 is able to 인터페이스


3. LSP(리스코프 치환 원칙): 서브 타입(하위 클래스)은 언제나 자신의 기반 타입(상위 클래스)으로 교체할 수 있어야 한다.
1) 객체 지향의 상속 조건대로 구현된 프로그램이라면 LSP를 지키고 있다고 할 수 있다.
→ 클래스는 분류, 객체는 실체임을 기억하자.
2) 하위 클래스의 인스턴스는 상위 클래스의 인스턴스 역할을 하는 데 문제가 없어야 한다.
3) LSP를 위반한 대표적인 예시: 계층도/조직도로 구현된 상속


4. ISP(인터페이스 분리 원칙): 클라이언트는 자신이 사용하지 않는 메서드에 의존 관계를 맺으면 안 된다.
1) SRP와 ISP는 같은 문제에 대한 다른 해결책이다.
→ 특별한 경우가 아니라면 SRP를 적용하는 것이 좋다.
2) 인터페이스 최소주의 원칙: 인터페이스는 그 역할에 충실한 최소한의 기능만 공개하라.
3) 상위 클래스는 풍성할수록 좋고, 인터페이스는 작을수록 좋다.
→ 풍성한 상위 클래스형의 참조 변수를 이용하되, 하위 클래스마다 상이한 메소드가 필요한 경우 추상 메서드를 사용하자.


5. DIP(의존 역전 원칙): 자신보다 변하기 쉬운 것에 의존하면 안 된다.
→ 자신보다 변하기 쉬운 것에 의존하던 것을 추상화된 객체를 두어 변하기 쉬운 것의 변화에 영향받지 않게 하는 것.

 

 

- SoC(Separation Of Concerns): 하나의 구성 요소 안에는 하나의 관심사만 들어 있어야 한다.

 

728x90
반응형

댓글