[참조 - 스프링 입문을 위한 자바 객체 지향의 원리와 이해]

객체 지향의 설계 5원칙
** 솔직히 원칙에 대한 정의를 보고 바로 이해하기가 쉽지 않았다. 최대한 그림이나 사례를 통해 이해하고자 노력하고 있다.

SRP(Single Responsibility Principle) : 단일 책임 원칙

어떤 클래스를 변경해야 하는 이유는 오직 하나뿐이어야 한다.


위와 같은 클래스구조는 다음과 같이 바뀌어야 한다.



OCP(Open Closed Principle) : 개방 폐쇄 원칙

"소프트웨어 엔티티(클래스, 모듈, 함수 등)는 확장에 대해서는 열려 있어야 하지만 변경에 대해서는 닫혀 있어야 한다."
"자신의 확장에는 열려있고, 주변의 변화에 대해서는 닫혀 있어야 한다."

이게 무슨 말일까?

JDBC를 예로 들어 설명하겠다. 



JDBC를 사용하는 클라이언트는 데이터베이스가 오라클에서 MySQL로 바뀐다고 해도 Connection을 설정하는 부분 외에는 따로 수정 할 필요가 없다.

JDBC라는 상위 클래스 혹은 인터페이스를 중간에 둠으로써 다양한 데이터베이스에도 실제 개발자의 코드에 영향을 거의 미치지않는다.

JDBC뿐만 아니라 iBatis, MyBatis, 하이버네이트 등등 데이터베이스 프로그래밍을 지원하는 라이브러리와 프레임워크도 개방폐쇄원칙의 예로 볼 수 있다. 

또한 자바를 예로 들자면 운영체제 별 JVM과 목적파일(.class)이 있기에 개발자는 다양한 구동환경에 대해서는 걱정하지 않고 본인이 작업하고 있는 개발 PC에 설치된 JVM에서만 코드를 작성할 수 있는 것이다.


LSP(Liskov Substitution Principle) : 리스코프 치환 원칙

"서브 타입은 언제나 자신의 기반타입(Base Type)으로 교체 할 수 있어야 한다."

자바의 객체지향에서의 상속은 다음의 조건을 만족해야 한다. 

* 하위 클래스 is a kind of 상위 클래스 => 하위 분류는 상위 분류의 한 종류이다.

* 구현 클래스 is able to 인터페이스 => 구현 분류는 인터페이스 할 수 있어야 한다.

상속 관계는 계층적인 것이 아니라 확장과 재사용적인 개념이라는 것이다.

아버지 춘향이 = new 딸();

해석하자면 "딸을 하나 낳아서 이름을 춘향이라 하고 아빠의 역할하게 한다" ?????  조금 이상하다.

춘향이는 아버지형 객체 참조 변수이기에 아버지 객체가 가진 행위(메서드)를 할 수 있어야 하는데 아버지의 어떤 역할을 시킬 수 있나?

동물 뽀로로 = new 펭귄();

펭귄 한 마리가 태어나 뽀로로라 이름을 짓고 동물의 행위(메서드)를 하게 한다. 말이 된다.


아버지 - 딸 구조(계층적 / 조직도)는 리스코프 치환 원칙을 위배하고 있는 것이며, 

동물 - 펭귄 구조(분류도)는 리스코프 치환 원칙을 만족하고 있는 것이다.


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


ISP(Interface Segretation Principle) : 인터페이스 분리 원칙

"클라이언트는 자신이 사용하지 않는 메서드에 의존 관계를 맺으면 안 된다."


여자친구에게는 남자친구의 역할을 하고, 부모님에게는 아들의 역할을, 직장상사에게는 사원의 역할을, 소대장에게는 소대원의 역할을 하는 인터페이스로 제한하는 방법이다.

단일책임원칙과 똑같은 문제에 대해서 다르게 해결하는 방법이다.


DIP(Dependency Inversion Principle) : 의존 역전 원칙

"고차원 모듈은 저차원 모듈에 의존하면 안 된다.

이 두 모듈 모두 다른 추상화된 것에 의존해야 한다."

"추상화된 것은 구체적인 것에 의존하면 안 된다.

구체적인 것이 추상화 된 것에 의존해야 한다."

"자주 변경되는 구체(Concrete) 클래스에 의존하지 마라"

아... 이것 역시 무슨 말일까? 다음의 예를 보면서 이해해보았다.


[의존원칙 적용 전]


자동차는 계절이 바뀌면 일반 타이어로 교체해야 한다.

이런 경우 스노우 타이어를 일반타이어로 교체 할 때 자동차는 그 영향에 노출돼 있음을 알 수 있다. 

바로 자동차 자신보다 더 자주 변하는 스노우타이어에 의존하기에 부서지기 쉬움이라는 나쁜 냄새를 풍기는 것이다.

[의존원칙 적용 후]


자동차가 구체적인 타이어들(스노우 타이어, 일반타이어, 광폭 타이어)이 아닌 추상화된 타이어 인터페이스에만 의존하게 함으로써 스노우타이어에서 일반타이어로, 또는 다른 구체적인 타이어로 변경돼도 자동차는 이제 그 영향을 받지 않는 형태로 구성된다.

기존에는 스노우 타이어가 그 어떤 것에도 의존적이지 않는 클래스였는데 반해, 의존원칙 적용 후에는 

바로 추상적인 것인 타이어 인터페이스에 의존하게 됐다. 그리고 자동차는 자신보다 변하기 쉬운 스노우 타이어에 의존하던 관계를 중간에 추상화된 타이어 인터페이스를 추가해 두고 의존 관계를 역전시키고 있다. 

이처럼 자신보다 변하기 쉬운 것에 의존하던 것을 추상화된 인터페이스나 상위 클래스를 두어 변하기 쉬운 것의 변화에 영향받지 않게 하는 것이 의존 역전 원칙이다.





Posted by slender ankles
,