객체지향프로그래밍

SOLID 5원칙 - SRP 단일 책임 원칙(Single Responsibility Principle)

쿠쿠s 2022. 1. 18. 15:02

컴퓨터 프로그래밍에서 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 해당 글을 보시면 도움이 될 것 같습니다.