2021. 8. 7. 00:40ㆍCSE/JAVA
1. SRP - 단일 책임 원칙
- 클래스에 하나의 역할과 책임만 있도록, 역할과 책임을 분리하라는 것
=> 클래스 뿐만 아니라 속성, 메서드 패키지, 모듈, 컴포넌트, 프레임워크 등에도 적용할 수 있다.
예시)
- 남자는 반드시 군대에 가고, 여자는 절대로 군대에 가지 않는다고 하자
class 사람 {
String 군번;
...
}
...
사람 로미오 = new 사람();
사람 줄리엣 = new 사람();
줄리엣.군번 = "123456789";
=> 다음과 같이 사람 클래스를 사용하게 되면 여자인 줄리엣이 군번 속성을 갖는 것을 막을 수 없다.
=> 따라서 사람 클래스를 상위 클래스로 두고, 남자 클래스와 여자 클래스를 만들고 공통점만 사람 클래스에 두면 된다.
- 하나의 속성이 여러 의미를 갖는 경우도 단일 책임 원칙을 지키지 못하는 경우다
예시) 하나의 필드가 토지인 경우 면적을, 건물인 경우 층수를 나타내는 경우
- 메서드가 단일 책임 원칙을 지키지 않을 경우 나타내는 대표적인 부분이 분기 처리를 위한 if문이다.
class 강아지{
final static Boolean 수컷 = true;
final static Boolean 암컷 = false;
Boolean 성별;
void 소변보다(){
if(this.성별 == 수컷){
//한쪽 다리를 들고
}else{
//뒷 다리를 둘 다 들지 않고
}
}
}
=> 대신 강아지를 추상 클래스로 가지고 수컷 강아지와, 암컷 강아지 클래스를 각각 만들어 주면 된다.
- 단일 책임 원칙과 가장 관계가 깊은 것 : 추상화
=> 애플리케이션의 경계를 정하고 추상화를 통해 클래스들을 선별하고 속성과 메서드를 설계할 때, 반드시 단일 책임 원칙을 고려하는 습관을 들이자.
=> 리팩터링을 할 때에도, 단일 책임 원칙을 적용할 곳이 있는지 꼼꼼히 살피자.
2. OCP - 개방 폐쇄 원칙
- 로버트 C. 마틴 : "소프트웨어 엔티티(클래스, 모듈, 함수 등)는 확장에 대해서는 열려있어야하지만 변경에 대해서는 다혀있어야 한다.
=> 자신의 확장에는 열려 있고, 주변의 변화에 대해서는 닫혀 있어야 한다.
예시)
- 위와 같은 경우는 운전자가 차를 마티즈에서 쏘나타로 바꾸면 사용하는 메서드를 바꿔야 한다.
=> 하지만 위와 같이 상위 클래스 또는 인터페이스인 자동차를 중간에 둠으로써 자동차 입장에서는 자신의 확장에는 개방되어있고, 운전자는 주변의 변화에 폐쇄되어있게 된다.
- 개방 폐쇄 원칙의 아주 좋은 예로는 JDBC가 있다.
=> 데이터베이스가 바뀌더라도 Connection을 설정하는 부분 외에는 수정할 필요가 없다.
- 개방 폐쇄 원칙을 무시하고 프로그램을 작성하면 객체 지향 프로그래밍의 가장 큰 장점인 유연성, 재사용성, 유지보수성 등을 얻을 수 없다.
3. LSP - 리스코프 치환 원칙
- 아래의 두 문장대로 구현된 프로그램이라면 이미 LSP를 잘 지키고 있다고 말할 수 있다.
- 하위 클래스 is a kind of 상위 클래스
- 구현 클래스 is able to 인터페이스
- 로버트 C. 마틴 : "서브 타입은 언제나 자신의 기반 타입으로 교체할 수 있어야 한다"
=> 하위 클래스의 인스턴스는 상위형 객체 참조 변수에 대입해 상위 클래스의 인스턴스 역할을 하는데 문제가 없어야 한다.
'CSE > JAVA' 카테고리의 다른 글
[자바 객체 지향] 스프링이 사랑한 디자인 패턴 1 (0) | 2021.08.16 |
---|---|
[자바 객체 지향] 객체 지향 설계 5원칙 : ISP, DIP (0) | 2021.08.09 |
[자바 객체 지향] static 블록 (0) | 2021.08.07 |
[자바 객체 지향] 캡슐화 (0) | 2021.08.05 |
[자바 객체 지향] 다형성 (0) | 2021.08.05 |