객체지향의 특징은 다형성, 캡슐화, 상속, 추상화 들이 있습니다.
이러한 특징을 잘 활용해서 객체지향 설계를 해야합니다. 하지만 잘 하라고만 하면 어떻게 하라는 건지... 알 수 없습니다.
따라서 특징을 잘 살려 어떻게 하라고 설명서 같은 원칙들이 있습니다.
바로 solid 입니다.
- SRP (Single Responsibility Principle) : 단일 책임 원칙
- OCP (Open Close Principle) : 개방 폐쇄 원칙
- LSP (Liskov Substitution Principle) : 리스코프 치환 원칙
- ISP (Interface Segregation Principle) : 인터페이스 분리 원칙
- DIP (Dependency Inversion Principle) :: 의존 역전 원칙
위의 원칙들을 하나씩 구체적으로 알아보겠습니다.
SRP (Single Responsibility Principle) : 단일 책임 원칙
단일 책임 원칙은 "클래스는 단 한개의 책임을 가져야 한다" 를 의미합니다.
클래스가 여러 책임을 갖게 된다면 여러 책임마다 변경되는 이유가 생기기 때문에 한 개의 이유로만 변경되기 위해서 한 개의 책임만을 가져야 합니다.
이를 다시 말하면 "클래스를 변경하는 이유는 단 한개여야 한다"라고 할 수 있습니다.
package oop.srp;
public class Zoo {
public void getAnimal(Tiger tiger){
findAnimal(tiger);
}
public void saveAnimal(Tiger tiger){
setAnimal(tiger);
}
private void findAnimal(Tiger tiger){
}
private void setAnimal(Tiger tiger){
}
}
내부 구현은 하나도 하지않고 제가 공부한 srp의 정리를 위해서만 만든 코드입니다.
현재 Zoo라는 클래스는 동물을 찾고 저장할 수 있습니다.
지금 상태로는 찾고 저장하는데 문제가 없습니다.
하지만 Tiger가 아니라 Lion이 매개변수로 제공되면 문제가 생깁니다.
package oop.srp;
public class Zoo {
public void getAnimal(Lion lion){
findAnimal(lion);
}
public void saveAnimal(Lion lion){
setAnimal(lion);
}
private void findAnimal(Lion lion){
}
private void setAnimal(Lion lion){
}
}
여기서 문제점은 다른 동물이 제공되면서 코드의 수정이 다양하게 발생했습니다.
결국, 한 클래스가 많은 책임을 지는 만큼 그 책임과 관련된 많은 코드에서 수정이 발생했고
이는 절차지향적인 코드로 만들어 버립니다.
따라서, 저희는 동물을 찾는 책임과 동물을 저장하는 책임으로 분리할 필요가 있습니다.
이것뿐만 아니라 또 다른 문제도 있습니다.
바로 특정 객체가 동물을 찾고싶어서 Zoo클래스를 만들었을 때 필요없는 동물 저장 코드도 함께 사용된다는 것입니다.
만약 책임이 분리되어있었다면 원하는 책임만을 가져와 사용할 수 있었을 것입니다.
책임이란?
위의 내용으로 한 객체에 한 책임만을 주지 않았을 경우 문제점들에 대해서 알게 되었습니다.
책임에 대해서 공부하면서 몇 가지 의문이 생겼습니다.
1. 한 클래스에 한 메소드만 구현해야 하는 것인가?
2. 클래스 하나가 다중 상속을 받게 되면 여러 책임을 갖게 되는거 아닌가?
3. 한 클래스에 여러 요청이 들어온다면 그 요청에 맞게 변경이 일어나게 되지는 않을까?
라는 의문들입니다.
사실, 1번과 2번은 비슷한 것 같습니다 하하..
하나의 모듈은 하나의, 오직 하나의 액터에 대해서만 책임져야 한다.
로버트C 마틴이 한 말입니다.
이제 이 말을 바탕으로 저의 의문을 정리해 보겠습니다.
모듈은 책임, 액터는 클라이언트라고 생각하면 되겠습니다.
A와 B 두 액터가 있다고 가정을 해봅시다.
이때, 특정 클래스를 이용하는데 같은 기능을 원한다면 A와 B를 같은 액터라고 볼 수 있습니다.
그리고 한 클래스안에 여러 기능이 있더라고 하나의 액터가 그 기능들을 모두 필요로 한다면 srp규칙을 잘 지켰다고 볼 수 있습니다.
로버트C 마틴의 말로 정리한 내용들을 이용해 의문점들의 답을 찾아보겠습니다.
1번과 2번의 경우 여러 기능이 있더라도 하나의 액터에 대해서만 책임을 지는 것이라면 srp 규칙을 잘 지킨것 입니다.
3번의 경우 여러 클라이언트의 요청이 있다고 하더라도 동일한 요구사항을 갖고 있다면 srp 규칙을 잘 지켰다고 할 수 있습니다.
마무리
SRP라는 규칙에 대해서 정리하면서 아무것도 모른 채로 객체지향언어인 자바를 사용했다고 생각하게 되었습니다....
SOLID에 대한 개념도 없었고 신경쓰면서 코드를 사용하지 않은 만큼 정리하면서 어려움을 많이 느꼈습니다.
아직 5가지중 한 가지 밖에 정리하지 않았지만 객체지향적인 프로그래밍을 할 수 있도록 항상 고민하면서 사용해야겠습니다!!
출처
https://steady-coding.tistory.com/370
[SOLID] 단일 책임 원칙(SRP)이란?
안녕하세요? 제이온입니다. 이번 시간부터는 SOLID의 원칙 하나씩 알아보려고 합니다. 그렇다면, 이 SOLID 원칙이란 무엇일까요? SOLID 원칙 흔히 객체 지향 5대 원칙으로 불리는 이 SOLID 원칙은 SRP(단
steady-coding.tistory.com
https://limkydev.tistory.com/77
[Java] 객체 지향 설계란? (SOLID)
이번 시간은 객체지향의 4대특성인 캡슐화, 상속, 추상화, 다형성 을 이용하여 객체 지향을 올바르게 설계할 수 있도록 도와주는 원칙들을 알아 볼까 한다. 객체 지향을 공부해봤고, 객체 지향으
limkydev.tistory.com
'객체지향' 카테고리의 다른 글
[객체지향의 사실과 오해] 1장 협력하는 객체들의 공동체 (0) | 2024.03.12 |
---|---|
캡슐화란 무엇일까? (0) | 2023.12.01 |
객체지향 설계란? - 3. LSP (0) | 2022.01.16 |
객체지향 설계란? - 2. OCP (1) | 2021.12.19 |
객체지향 프로그래밍 이란 (0) | 2021.02.01 |
댓글