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
'DeepDive' 카테고리의 다른 글
객체지향원칙(SOLID) - ISP(Interface Segregation Principle) (0) | 2024.06.19 |
---|---|
객체지향원칙(SOLID) - LSP(Liskov Substitution Principle) (0) | 2024.06.12 |
객체지향원칙(SOLID) - OCP(Open-Closed Principle) (0) | 2024.05.30 |