Java(폐지)/객체지향 설계 5원칙-SOLID
SRP와 ISP
kyeongjun-dev
2020. 7. 21. 13:03
단일 책임 원칙(SRP)와 인터페이스 분할 원칙(ISP) - 클래스를 나누느냐 인터페이스를 나누느냐
SRP와 ISP는 같은 문제에 대한 두 가지 다른 해결책이라고 볼 수 있다.프로젝트 요구사항과 설계자의 취향에 따라 선택될 수 있다.
하지만 특별한 경우가 아니라면 단일 책임 원칙을 적용하는 것이 더 좋은 해결책이라고 할 수 있다.
인터페이스 최소주의 원칙
인터페이스를 통해 메서드를 외부에 제공할 때 최소한의 메서드만 제공하라는 것이다.
상위 클래스는 풍성하게, 인터페이스는 작게
앞의 게시물 '상속과 인터페이스'에서 상위 클래스는 풍성할수록 좋고, 인터페이스는 작을수록 좋다고 언급했다. 이는 리스코프 치환 원칙(LSP)로 예를 들 수가 있다.
LSP에 따라 하위 객체는 상위 객체인 척 할 수 있다.

빈약한 상위 클래스
package poorSuperClass;
import java.util.Date;
public class Driver {
public static void main(String[] args) {
사람 김학생 = new 학생("김학생", new Date(2000, 01, 01), "20000101-1234567",
"20190001");
사람 이군인 = new 군인("이군인", new Date(1998, 12, 31), "19981231-1234567",
"19-12345678");
System.out.println(김학생.이름);
System.out.println(이군인.이름);
// System.out.println(김학생.생일); // 사용불가
// System.out.println(이군인.생일); // 사용불가
System.out.println(((학생) 김학생).생일); // 캐스팅 필요
System.out.println(((군인) 이군인).생일); // 캐스팅 필요
// System.out.println(김학생.주민등록번호); // 사용불가
// System.out.println(이군인.주민등록번호); // 사용불가
System.out.println(((학생) 김학생).주민등록번호);
// 캐스팅 필요
System.out.println(((군인) 이군인).주민등록번호);
// 캐스팅 필요
김학생.먹다();
이군인.먹다();
// 김학생.자다(); // 사용불가
// 이군인.자다(); // 사용불가
((학생) 김학생).자다(); // 캐스팅 필요
((군인) 이군인).자다(); // 캐스팅 필요
// 김학생.소개하다(); // 사용불가
// 이군인.소개하다(); // 사용불가
((학생) 김학생).소개하다(); // 캐스팅 필요
((군인) 이군인).소개하다(); // 캐스팅 필요
((학생) 김학생).공부하다(); // 캐스팅 필요
((군인) 이군인).훈련하다(); // 캐스팅 필요
}
}
풍성한 상위 클래스
package richSuperClass;
import java.util.Date;
public class Driver {
public static void main(String[] args) {
사람 김학생 = new 학생("김학생", new Date(2000, 01, 01), "20000101-1234567",
"20190001");
사람 이군인 = new 군인("이군인", new Date(1998, 12, 31), "19981231-1234567",
"19-12345678");
System.out.println(김학생.이름);
System.out.println(이군인.이름);
System.out.println(김학생.생일);
System.out.println(이군인.생일);
System.out.println(김학생.주민등록번호);
System.out.println(이군인.주민등록번호);
// System.out.println(김학생.학번); // 사용불가
// System.out.println(이군인.군번); // 사용불가
System.out.println(((학생) 김학생).학번);
// 캐스팅 필요
System.out.println(((군인) 이군인).군번);
// 캐스팅 필요
김학생.먹다();
이군인.먹다();
김학생.자다();
이군인.자다();
김학생.소개하다();
이군인.소개하다();
// 김학생.공부하다(); // 사용불가
// 이군인.훈련하다(); // 사용불가
((학생) 김학생).공부하다(); // 캐스팅 필요
((군인) 이군인).훈련하다(); // 캐스팅 필요
}
}
상위클래스가 빈약할 때, 캐스팅(형변환)이 훨씬 많이 필요한 것을 확인할 수 있다.