컴퓨터 프로그래밍에서 SOLID 원칙들은 소프트웨어 작업에서 프로그래머가 소스 코드가 읽기 쉽고 확장하기 쉽게 될 때까지 소프트웨어 소스 코드를 리팩터링하여 코드 냄새를 제거하기 위해 적용할 수 있는 지침이다.
출처 - 위키백과
SRP 단일 책임 원칙(Single Responsibility Principle) 이란??
한 클래스는 하나의 책임만 가져야 한다. 다른말로는 클래스를 변경하는 이유는 단 한개여야 한다. 라는 원칙입니다.
하나의 책임? 솔직히 처음 접하면 무슨말인지 이해하기 참 어렵습니다.
아주 유명하신 로버트 마틴이라는 분이 말하시는 SRP는 하나의 클래스가 변경되어야 하는 사유는 하나여야 한다.
소프트웨어를 더 쉽게 구현하고 변경으로 인하여 예상못한 부작용을 방지하기 위함입니다. 사용자의 요구 사항은 다양하고 소프트웨어의 변경은 당연한 일입니다. 만약 한 클래스가 여러 책임을 가지게 된다면 요구사항이 변할 때 마다 엄청난 코드의 변경이 이루어 질 것입니다.
간단한 예시를 통해 설명 드리겠습니다.
class Car{
public void accel(){
//logic
}
public void stop(){
//logic
}
public void nowSpeed(){
//logic
}
public void nowFuel(){
//logic
}
}
자동차 라는 클래스를 아주 간단히 구현을 했습니다. 자동차를 움직이거나 멈추거나 현재 속도와 현재 연료를 볼 수 있습니다.
코드상에는 문제가 없습니다. 하지만 동작을 수정하거나, 현재 상태를 정보를 수정하려면 Car 클래스를 손봐야 합니다.
Car 클래스를 수정해야하는 이유가 2가지입니다.
동작이라는 책임과 현재 상태 정보를 가지는 책임을 가졌기 때문입니다. 그래서 이 책임을 다른 클래스에게 넘겨보겠습니다.
accel 과 stop 을 '동작(Move.class)'이라는 책임으로 nowSpeed 와 nowFuel은 '상태 정보(State.class)' 라는 책임으로 분리를 시켜보겠습니다.
class Car{
private State state = new State();
private Move move = new Move();
public void accel(){
move.accel();
}
public void stop(){
move.stop();
}
public void printNowSpeed(){
state.nowSpeed();
}
public void printNowFuel(){
state.nowFuel();
}
}
class Move{
public void accel(){
//logic
}
public void stop(){
//logic
}
}
class State{
public void nowSpeed(){
//logic
}
public void nowFuel(){
//logic
}
}
책임을 분리시켰기 때문에 동작을 수정하고 싶으면 동작을 책임지고있는 Move 클래스만 수정하면 됩니다.
이처럼 한 클래스에서 하나의 책임을 가질 수 있도록 하는것이 SRP원칙을 지켰다고 할 수 있습니다.
하나의 책임이라고 하는 것은 모호한데 단순 메서드의 개수가 중요한게 아닌 만드는 사람이 책임을 잘 설정하여 요구사항의 변경이 있을 때 변경으로 인해 코드의 변화가 얼마나 있는지 잘 생각해서 클래스를 완성해야 합니다.
좀 더 참고 해볼만한 정보는 https://blog.cleancoder.com/uncle-bob/2014/05/08/SingleReponsibilityPrinciple.html 해당 글을 보시면 도움이 될 것 같습니다.
'객체지향프로그래밍' 카테고리의 다른 글
SOLID 5원칙 - DIP 의존관계 역전 원칙(Dependency inversion principle) (0) | 2022.01.21 |
---|---|
SOLID 5원칙 - ISP 인터페이스 분리 원칙(Interface Segregation Principle) (0) | 2022.01.20 |
SOLID 5원칙 - LSP 리스코프 치환 원칙(Liskov Substitution Principle) (0) | 2022.01.19 |
SOLID 5원칙 - OCP 개방 폐쇄 원칙(Open/Closed Principle) (0) | 2022.01.18 |
객체 지향 프로그래밍 (Object-Oriented Programming) 이란? - JAVA (0) | 2022.01.13 |