Notice
Recent Posts
Recent Comments
Link
«   2025/04   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
Tags
more
Archives
Today
Total
관리 메뉴

쉽지않은 블로그

객체지향을 설계하는 원칙 5가지 [SOLID] 본문

개발공부/스프링

객체지향을 설계하는 원칙 5가지 [SOLID]

쉽지않네 2021. 4. 17. 01:10

좋은 객체지향을 설계할수 있는 5가지 원칙이라고 유명한 SOLID 원칙이라고 있다.

처음에는 이해하기 어려웠으나 스프링을 공부하면서 서서히 이 의미를 알거같다.

앞으로 이 5가지 원칙을 기준으로 내가 객체지향의 깊은 뜻을 이해하며 코딩을 하고 있는지 돌이켜보면 좋을거같다


1.SRP (Single Responsibiliy Principle) 단일 책임 원칙

"하나의 클래스는 하나의 책임(일)을 맡아야 한다"는 원칙이다.

객체가 만약 여러 책임을 가지고 있다면 다른 객체와 결합력이 높아질수 있다

만약 변형이 일어나도 최소한의 변경이 일어나게끔 설계해야 된다.

 


2.OCP (Open-Closed Principle) 개방-폐쇄 원칙

"확장에 대해 열려 있어야 하고 , 수정에 대해서는 닫혀 있어야 한다."

 

말 자체가 어렵게 들려지는데 결론은 "추상화" 를 잘 이용하라는 말인것같다

 

확장에 대해 열려있다는 말은 요구사항이 변경될 때 , 이 변경에 맞게 새로운 동작을 추가해 모듈을 확장한다는 말이다

즉 OOP 언어에서 "인터페이스 의 구현체를 새로 정의하여 주입하는건 괜찮다는 말이다"

 

수정에 대해 닫혀 있다는 말은 요구사항이 변경되었다고 해서 내부적인 수정은 하지 않아야 한다는 말이다.

 내부적인 수정이랑 인터페이스의 수정이라고 생각하면 이해하기 편할것같다. 

인터페이스 자체를 만약 수정해야 할일이 생겼다면 설계가 좋지 못했다는걸 말한다.

예를 들어 node_module 이나 .jar 파일같은 라이브러리들은 수정을 할일이 없다.

 


3.LSP (Liskov substitution principle)

항상 자식클래스는 부모클래스의 역할을 대체할수 있어야 한다는 원칙이다. 

 

원래 부모가 하던 역할을 그대로 자식클래스가 하기위해서는

부모가 하던 역할을 자식이 똑같이 수행해야하며

부가적인 기능에 대해서만 자식이 자유롭게 설계를 해야한다.

 


4.Interface Segregation Principle 인터페이스 분리 원칙

특정 객체가 여러 종류의 기능을 하게 될경우

인터페이스 하나에 모든 기능을 다시 정의해준다음에

해당 객체는 인터페이스를 구현한 구현체로 존재해야 될까?

 

하나의 인터페이스에 관련없는 여러 종류를 다 넣게 된다면 인터페이스를 정의하는 의미가 있을까?

재사용 가능성도 낮으니 그냥 클래스로 바로 정의하는게 더 편리할거같은 느낌이 들것이다.

 

인터페이스 분리 원칙에 따르면 

위와 같은 상황에서는 같은 종류의 기능을 하는것들끼리 묶어서 인터페이스를 분리해주는게 나중에 해당 객체를 교체해주어야 할 경우 인터페이스에 영향을 받지 않을것이다.

 

 


5.DIP (Dependency Inversion Principle) 의존관계 역전 원칙

상위 계층이 하위 계층의 구현으로부터 독립되어야 한다.

예를 들어

클래스 A 내부에서  클래스 B를 사용할 경우 

1.A 는 B의 구현으로 부터 자유로워야 하고

2.A 는 B의 구현에 집착하는 것이 아닌 B의 기능( 인터페이스) 만을 바라보아야 한다.

다음 글을 참고하면 좋을거같다.

dutchcoffee.tistory.com/27

 

[Spring] DI & IOC (1) 느슨한 결합력

자바의 객체지향 프로그래밍 관점에서 보게 되면 1) 클래스가 다른 클래스를 사용하거나 2) 클래스가 다른 클래스를 상속하거나  등 어떤 클래스 객체가 하는 일이 다른 객체에 영향을 받게 되

dutchcoffee.tistory.com

 

 

 

 

참고문헌  :  ko.wikipedia.org/wiki/SOLID_(%EA%B0%9D%EC%B2%B4_%EC%A7%80%ED%96%A5_%EC%84%A4%EA%B3%84)

www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%ED%95%B5%EC%8B%AC-%EC%9B%90%EB%A6%AC-%EA%B8%B0%EB%B3%B8%ED%8E%B8#

Comments