[자바 객체 지향] 객체 지향 설계 5원칙 : SRP, OCP, LSP

2021. 8. 7. 00:40CSE/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. 마틴 : "서브 타입은 언제나 자신의 기반 타입으로 교체할 수 있어야 한다"

=> 하위 클래스의 인스턴스는 상위형 객체 참조 변수에 대입해 상위 클래스의 인스턴스 역할을 하는데 문제가 없어야 한다.