객체지향원칙(SOLID) - SRP(Single Responsibility Principle)

728x90

오늘은 객체 지향 설계 원칙 중 하나인 SRP(Single Responsibility Principle)에 대해 알아보겠습니다.

SRP란 무엇인가?

SRP는 Single Responsibility Principle의 약자로, 한국어로는 "단일 책임 원칙"이라고 합니다. 이 원칙은 클래스가 하나의 책임만 가져야 한다는 것을 의미합니다. 즉, 클래스는 하나의 기능 또는 역할만 담당해야 합니다.

SRP 원칙의 위배

아래와 같은 코드를 예로 들어보겠습니다.

public class Tuple<F, S> {
    private final F first;
    private final S second;

    public Tuple(F first, S second) {
        this.first = first;
        this.second = second;
    }

    public F getFirst() {
        return first;
    }

    public S getSecond() {
        return second;
    }

    public void print() {
        System.out.println(first + " " + second);
    }
}

이 클래스는 두 개의 값을 저장하는 Tuple 클래스입니다. 이 클래스의 주요 역할은 두 개의 값을 저장하고 반환하는 것입니다. 그러나 print() 메서드는 값을 출력하는 추가적인 역할을 담당합니다. 값의 저장과 출력이라는 두 가지 책임을 동시에 가지고 있는 것입니다. 이러한 설계는 클래스가 비대해지고, 변경 시 에러 발생 가능성이 높아질 수 있습니다. SRP 원칙은 이러한 문제를 예방하기 위해 존재합니다.

SRP 원칙을 준수하는 코드

위의 코드를 SRP 원칙에 맞게 수정해보겠습니다.

public class Tuple<F, S> {
    private final F first;
    private final S second;

    public Tuple(F first, S second) {
        this.first = first;
        this.second = second;
    }

    public F getFirst() {
        return first;
    }

    public S getSecond() {
        return second;
    }

    @Override
    public String toString() {
        return first + " " + second;
    }
}
public class Main {
    public static void main(String[] args) {
        Tuple<Integer, Integer> tuple = new Tuple<>(1, 2);
        System.out.println(tuple);
    }
}

toString() 메서드는 객체가 가진 두 값을 문자열로 반환합니다. 이는 여전히 클래스의 본래 역할인 값을 반환하는 기능의 연장선상에 있으므로 SRP 원칙을 위배하지 않습니다. 만약 toString() 메서드도 부적절하다고 생각한다면, getFirst()와 getSecond() 메서드를 사용해 외부에서 출력할 수 있습니다.

이처럼 출력 기능을 클래스 외부로 전가함으로써 클래스는 하나의 책임만을 가지게 되고, SRP 원칙을 준수하게 됩니다.

728x90