본문 바로가기


Java

[OOP] SRP 와 객체의 역할, 책임의 충돌

SRP 는 Single Responsibility Principle 의 약자로 단일 책임의 원칙이다. 모든 클래스는 하나의 책임만 가지며, 클래스는 그 책임을 완전히 캡슐화해야 함을 일컫는 말이다. 

객체지향 설계는 '책임' 주도 설계가 바탕이 되어야 하는데 이 개념이 SRP 개념과 충돌하는 지점이 생겼었다.

 

하나의 객체는 한 협력안에서 하나의 역할만 수행한다면 여러가지 역할을 가질 수 있다. 그리고 역할은 책임의 집합이다. 라는 개념과

클래스는 하나의 책임만 가지며 변경의 이유는 1가지 여야 한다는 개념이 맞물리지가 않았었다. 

Object 라는 책을 보면서 나온 개념 이었기 때문에 직접 조영호작가님께 여쭤본 결과 놓치고 있었던 키워드를 찾아내었다.

 

객체 지향설계에서 말하는 책임과 역할은 '객체' 의 관점에서 바라 보아야 한다. 그리고 SRP 원칙은 '클래스' 의 관점에서 변경의 이유가 하나임을 보장하는 것이다. 클래스는 객체의 구현방법이기 때문에 이 두개는 분리되어야 한다.

 

예를 들어 '검사' 라는 클래스를 '부장검사', '평검사', '차장검사' 의 클래스가 각각 상속하고 있다고 생각해보면 부장검사, 평검사, 차장검사는 각각 객체이며 검사 라는 역할을 가지게 된다. 하지만 부장검사만 할 수 있는 역할을 수행할 경우에는 부장검사의 책임을 하는 역할을 맡는다. 부장검사객체가 검사의 공통적인 역할을 수행할 때는 추상화된 검사의 역할을 한다. 이렇게 여러가지 역할을 가질 수 있지만 각각의 클래스인 부장검사, 평검사, 차장검사는 각각 다른 변경의 이유를 가지게 된다. 

 

끝!