객체지향 5대 원칙이란,
SRP(단일 책임 원칙), OCP(개방-폐쇄 원칙), LSP(리스코프 치환 원칙), DIP(의존 역전 원칙), ISP(인터페이스 분리 원칙)을 말하며, 앞자를 따서 SOILD 원칙이라고 부른다. 프로그래머가 시간이 지나도 유지 보수와 확장이 쉬운 소프트웨어를 만드는데 이 원칙들을 적용할 수 있다.
SRP (Single Responsibility Principle): 단일 책임 원칙
소프트웨어의 설계 부품(클래스, 함수 등)은 단 하나의 책임만을 가져야 한다.
한 클래스는 하나의 책임만을 가져야 합니다. 이때 하나의 책임을 구분하는 기준은 변경입니다.
변경이 있을 때 파급 효과가 적으면 단일 책임 원칙을 잘 따른 것으로 볼 수 있습니다.
- 여기서 책임이란, '기능' 정도의 의미로 해석하면 된다.
OCP (Open / Closed Principle): 개방 / 폐쇄 원칙
기존의 코드를 변경하지 않고(Closed) 기능을 수정하거나 추가할 수 있도록(Open) 설계해야 한다.
OCP에 만족하는 설계를 할 때 변경되는 것이 무엇인지에 초점을 맞춘다.
자주 변경되는 내용은 수정하기 쉽게 설계 하고, 변경되지 않아야 하는 것은 수정되는 내용에 영향을 받지 않게 하는 것이 포인트다.
이를 위해 자주 사용되는 문법이 인터페이스(Interface)이다.
OCP를 만족한 설계는 변경에 유연하므로 유지보수 비용을 줄여주고 코드의 가독성 또한 높아지는 효과를 얻을 수 있다.
소프트웨어 요소는 확장에는 열려있으나 변경에는 닫혀있어야 합니다.
확장을 하려면 당연히 기존 코드를 변경해야 한다고 생각할 수 있지만, 다형성을 활용한다면, 역할과 구현의 분리를 생각해보면 가능합니다.
그러나 순수 자바 언어로는 다형성을 사용했어도 OCP 원칙을 지킬 수는 없습니다. (코드를 수정/변경해야합니다)
이를 해결하기 위해서, 객체를 생성하고 연관관계를 맺어주는 별도의 조립 및 설정자가 필요합니다. 이 부분을 스프링에서 도맡아 줍니다.
LSP (Liskov Substitution Principle): 리스코프 치환 원칙
자식 클래스는 부모클래스에서 가능한 행위를 수행할 수 있어야 한다.
부모 클래스와 자식 클래스 사이의 행위에는 일관성이 있어야 한다는 원칙이며,
이는 객체 지향 프로그래밍에서 부모 클래스의 인스턴스 대신 자식 클래스의 인스터스를 사용해도 문제가 없어야 한다는 것을 의미한다.
상속 관계에서는 일반화 관계(IS-A)가 성립해야 한다. 일반화 관계에 있다는 것은 일관성이 있다는 것이다. 따라서 리스코프 치환 원칙은 일반화 관계에 대해 묻는 것이라 할 수 있다.
단순히 컴파일에 성공하는 것을 넘어서, 자동차 인터페이스의 엑셀은 앞으로 가라는 기능인데 이를 뒤로 가게 구현하면 LSP에 위반되는 것처럼, 인터페이스 규약을 따라야 합니다.
ISP (Interface Segregation Principle): 인터페이스 분리 원칙
한 클래스는 자신이 사용하지 않는 인터페이스는 구현하지 말아야 한다.
하나의 일반적인 인터페이스보다는, 여러 개의 구체적인 인터페이스가 낫다.
이는 다시 말해서, 자신이 사용하지 않는 기능(인터페이스)에는 영향을 받지 말아야 한다는 의미이다.
클라이언트를 위한 인터페이스 여러 개가 하나의 범용 인터페이스보다 제 역할을 다합니다. 자동차 인터페이스는 운전 인터페이스와 정비 인터페이스로 분리하는 것과 같이, 인터페이스가 명확해지고 대체 가능성이 높아집니다. 동시에 하나의 인터페이스가 변하더라도 운전자 클라이언트에 영향을 주지 않게 됩니다.
DIP (Dependnecy Inversion Principle): 의존관계 역전 원칙
의존 관계를 맺을 때, 변화하기 쉬운것(구체적) 보단 변화하기 어려운 것(추상적) 에의존해야 한다는 원칙이다.
즉, 역할에 의존해야 하는 것입니다.
객체지향적인 관점에서 보자면 변화하기 쉬운것이란 구체화된 클래스를 의미하고, 변화하기 어려운 것은 추상클래스나 인터페이스를 의미한다.
따라서 DIP를 만족한다는 것은 의존관계를 맺을 때, 구체적인 클래스보다 인터페이스나 추상 클래스와 관계를 맺는다는 것을 의미한다.
그러나 OCP와 마찬가지로 다형성을 사용했더라도 DIP 원칙을 지킬 수는 없습니다. 클라이언트가 구현 클래스를 직접 선택하여 인터페이스와 구현 클래스를 동시에 의존합니다. 이 문제를 스프링에서 해결해줍니다.
참고 :
'개발 > CS' 카테고리의 다른 글
[CS] 프레임워크(Framework)와 라이브러리(Library)의 차이 (0) | 2023.05.11 |
---|---|
[CS] 상속이란 (Inheritance, extends, implements ) (0) | 2023.03.16 |
[CS] OOP(객체 지향 프로그래밍) (0) | 2023.02.23 |