개발 etc

JAVA 자바 객체 지향 설계 5원칙 SOLID - SRP 단일 책임 원칙

알통몬_ 2017. 3. 12. 20:44
반응형


안녕하세요 알통몬입니다.

공감 및 댓글은 포스팅 하는데 아주아주 큰 힘이 됩니다!!

포스팅 내용이 찾아주신 분들께 도움이 되길 바라며

더 깔끔하고 좋은 포스팅을 만들어 나가겠습니다^^

 

SOLID의 S - SRP에 대해 공부해보겠습니다.



먼저 위 그림같이 남자라고 하는 클래스와 이 클래스에 의존하는 여러개의 클래스가 있다고 하면,

남자클래스가 해야할 일과 책임이 너무 많게 됩니다. 객체지향 세계에서는 이런 경우를 나쁜 냄새가 난다고 해요. 

따라서 이럴 때 역할(책임)을 분리하라는 것이 바로 SRP 단일 책임 원칙이에요

단일 책임 원칙은 속성, 메서드, 패키지, 모듈, 컴포넌트, 프레임워크 등에도 적용할 수 있는 개념이에요.

아래 그림처럼요.


앞으로 나올 나오는 모든 예제들은 이 책의 필자께서 

편의를 위해 클래스명과 메서드명,변수명에 한글을 사용하셨습니다.

단일 책임 원칙은 잘된 경우보다 잘못된 경우를 보는 것이 더 이해하는데 좋아요.

예제를 보겠씁니다. 아래 예제는 메서드가 단일 책임 원칙을 지키지 않을 경우에요.


package srp.bad;


public class 강아지 {

final static Boolean 숫컷 = true;

final static Boolean 암컷 = false;

Boolean 성별;


void 소변보다() {

if (this.성별 == 숫컷) {

// 한쪽 다리를 들고 소변을 본다.

} else {

// 뒤다리 두 개로 앉은 자세로 소변을 본다.

}

}

}


위 예제를 보면 강아지 클래스의 소변보다()메서드가 

숫컷의 행위와 암컷의 행위를 모두 구현하려고 단일 책임 원칙을 위배하고 있어요.

메서드가 단일 책임 원칙을 지키지 않을 경우 

나타나는 대표적인 냄새는 분기처리를 위한 if문 이라고해요.


그럼 단일 책임 원칙을 적용해 코드를 리팩터링하면 어떻게 될까요?


예제)

package srp.good;


public abstract class 강아지 {

abstract void 소변보다();

}

예제)

package srp.good;


public class 암컷강아지 extends 강아지 {

void 소변보다() {

// 뒤다리 두 개로 앉은 자세로 소변을 본다.

}

}

예제)

package srp.good;


public class 숫컷강아지 extends 강아지 {

void 소변보다() {

// 한쪽 다리를 들고 소변을 본다.

}

}


이해가 되시나요? if문으로 처리하던 것을 상위클래스를 추상클래스로 두고, 

하위클래스 각각 암컷 강아지 클래스와 숫컷 강아지 클래스를 두어 강아지추상클래스를 상속받아 

추상클래스의 추상메서드를 오버라이딩하여 각 클래스가 하나의 책임만 지고 있는 것을 볼 수 있습니다. 


단일 책임 원칙은 객체지향 4대 특성 중 모델링 과정을 담당하는 추상화와 가장 관계가 깊습니다.

반응형