SOLID - 객체 지향 설계 5원칙

강민범·2024년 4월 6일
0

그동안 개발을 해오면서 객체 지향 언어를 사용하면서도 객체 지향 설계 5원칙을 신경쓰며 개발하지 않았었다.

이번에 자바와 객체 지향의 대한 서적을 공부하면서 객체 지향 설계 5원칙을 지키며 개발하기 위해 정확하게 상기시키려한다.

객체 지향 설계 5원칙으로 SRP(단일 책임 원칙), OCP(개방 폐쇄 원칙), LSP(리스코프 치환 원칙), ISP(인터페이스 분리 원칙), DIP(의존 역전 원칙)이 있다.

이 5가지를 줄여서 SOLID라고 부르는데 SOLID는 응집도는 높이고 결합도는 낮추는 고전 원칙을 객체 지향의 관점엣허 재정립한 것이라고 할 수 있다.

SRP(단일 책임 원칙)

단일 책임 원칙은 클래스는 하나의 책임만을 가져야 한다는 뜻 이다.

아래의 사진은 단일 책임 원칙을 지키지 못한 다이어그램 인데

남자라고 하는 클래스에 여러 클래스가 의존하고 있다.

아래의 그림은 단일 책임 원칙을 지키는 다이어그램이다.

남자라는 클래스 하나가 역할과 책임에 따라 네 개의 클래스로 쪼개진 것을 볼 수 있다.

왜 SRP(단일 책임 원칙)을 지켜야 하는가?

1.

단일 책임 원칙을 지켜야 하는 이유 중 하나는 남자 클래스에서 남자친구로서 역할을 수정하기 위해 남자 클래스를 수정하면 아들 역할에도 문제가 생길 수 있다.

2.

아래의 다이어그램에서

남자 친구, 아들, 회사원, 소대원 클래스는 전화하기라는 동일한 메서드를 가지고 있다.

만약 네 개의 클래스 중 하나의 클래스의 전화하기 메서드에 문제가 생긴다면 네 개의 클래스 모두 손을 봐줘야 한다.

이럴때의 해결방법으로는 남자 클래스에 전화하기 메서드를 따로 빼주는 방법이 있다.

OCP(개방 폐쇄 원칙)

"확장에 대해서는 열려 있어야 하지만 변경에 대해서는 닫혀 이싸어야 한다." 로버트 C. 마틴

개방 폐쇄 원칙을 설명하는 적절한 예 중 하나가 바로 아래 사진이다.

JDBC를 사용하는 클라이언트는 데이터베이스가 Oracle에서 PostgreSQL이나 Sybase로 바뀌더라도 Connection을 설정하는 부분 외에는 따로 설정할 필요가 없다.

개방 폐쇄 원칙을 무시한체 프로그램을 작성하게 되면 객체 지향 프로그래밍의 장점인 유연성과, 재사용성, 유지보수성의 장점을 무시하게 된다.

LSP(리스코프 치환 원칙)

"서브 타입은 언제나 자신의 기반 타입으로 교체할 수 있어야 한다." 로버트 C.마틴

리스코프 치환 원칙은 하위클래스의 인스턴스는 상위형 객체 참조 변수에 대입해 상위 클래스의 인스턴스 역할을 하는 데 문제가 없어야 한다.

예를 들어, 상위 타입인 Item이 있고 하위 타입인 Apple이 있을 때, 위 인자로 item이 아닌 apple을 넘겨도 코드가 정상적으로 작동해야한다.

ISP(인터페이스 분리 원칙)

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

ISP는 SRP 달리 Class가 아닌 interface로 접근한다.

인터페이스는 그 역할에 충실한 최소한의 기능만 공개하는 것이 좋다.

DIP(의존 역전 원칙)

"고차원 모듈은 저차원 모듈에 의존하면 안 된다. 이 두 모듈 모두 다른 추상화된 것에 의존해야한다."
"추상화된 것은 구체적인 것에 의존하면 안 된다. 구체적인 것이 추상화된 것에 의존해야 한다."
"자주 변경되는 구체클래스에 의존하지 마라" 로버트 C. 마틴

결국 추상 클래스나 인터페이스를 생성하여 호출하라는 의미이다.

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

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

profile
개발자 성장일기

0개의 댓글