아직은 정체성이 없는 블로그

[Design Pattern][SOLID] 단일 책임 원칙 SRP (Single Responsibility Principle) 본문

Disign Pattern

[Design Pattern][SOLID] 단일 책임 원칙 SRP (Single Responsibility Principle)

coooding 2020. 6. 22. 11:08

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


 

정의

 

객체 지향 프로그래밍에서 단일 책임 원칙(single responsibility principle)이란 모든 클래스는 하나의 책임만 가지며, 클래스는 그 책임을 완전히 캡슐화해야 함을 일컫는다. 클래스가 제공하는 모든 기능은 이 책임과 주의 깊게 부합해야 한다.

 

책임의 의미

 

객체지향 설계 관점에서의 SRP의 책임의 기본 단위는 객체이다.

, 객체는 단 하나의 책임만 가져야 한다.

 

여기서 책임이란 여러 관점으로 해석이 가능하지만 보통 해야 하는 것이나 할 수 있는 것으로 간주할 수 있다.

 

객체에 책임을 할당할 때는 어떤 객체보다도 작업을 잘 할 수 있는 객체에 책임을 할당해야 하고 책임에 수반되는 모든 일을 자신만이 수행할 수 있어야 한다.

 

 

단일 책임 원칙의 장점

 

  • 하나의 함수 혹은 클래스가 단 한 가지 기능만 수행하도록 개발되어 있다면 사람이 코드를 봤을 때 이해하기 쉽다

  • 함수의 기능에 문제가 발생하여 해당 함수를 수정 할 일이 발생하였을 경우, 한 가지 기능만하기 때문에 유지보수가 쉽다.

 

잘못된 예

public class Student {
	public void getCourse(){...} // 수강 조회
	public void addCourse(){...} // 수강 추가 
	public void save(){...} // 정보 저장 
	public Student load(){...} //정보 조회
	public void printOnReportCard(){...} // 성적표 출력
	public void printOnAttendanceBook(){...}// 출석부 출력
}

 

위와 같은 코드는 Student 클래스에서 너무 많은 책임을 수행하고 있다. 수강 과목에 대한 조회와 추가를 제외한 메소드들은 다른 클래스에서 더 잘 수행 할 수 있는 여지가 많다.

따라서 Student 클래스는 수강 과목을 조회하고 추가할 수 있는 책임만 수행하는 것이 SRP를 따른 설계에 가깝다고 말할 수 있다.

 

변경

 

현재의 Student 클래스는 언제, 어떻게 변경되어야 하는가에 대한 답을 찾으려면 클래스의 변경 이유를 찾아보는 것이 좋다. 이유는 아래와 같다.

 

  • 학생이 지도 교수를 찾는 기능이 추가되어야 한다면 Student 클래스는 영향을 받는가?

  • 데이터베이스의 스키마가 변경된다면 Student 클래스도 변경되어야 하는가?

  • 학생 정보를 성적표와 출석부 이외 형식으로 출력해야 한다면 어떻게 해야 하는가?

 

이러한 사항은 모두 학생 클래스를 변경해야 하는 이유가 된다.

또한 책임을 많이 질수록 클래스 내부에서 서로 다른 역할을 수행하는 코드끼리 강하게 결합될 가능성이 높아진다.

 

 

참고

위키백과  

JAVA 객체지향 디자인패턴 (정인상, 채흥석)

Comments