블링블링 범블링

객체지향의 원칙-SOLID 본문

Technology/객체 지향 디자인 패턴

객체지향의 원칙-SOLID

뻠스키 2018. 4. 17. 02:12

객체지향의 원칙-SOLID


객체지향 설계에서 5대 원칙이 있다. 단일책임원칙(Single responsibility principle), 개방폐쇄 원칙(Open-Closed principle), 리스코프 치환원칙(Liskov substitution principle), 인터페이스 분리의 법칙(Interface segregation principle), 의존관계역전법칙(Dependency inversion principle)을 말한다. 이 5가지를 SOLID법칙이라고 말한다. 5가지의 원칙이 지켜져야하는 이유는 코드의 재사용성과 유지보수성을 키울 수 있기 때문이다. 그리고 이 설계원칙을 기반으로 디자인패턴 또는 소프트웨어 개발론이 등장하고 있다.


1. 단일책임원칙(Single responsibility principle)

클래스는 단 하나의 책임을 가져야 한다는 원칙을 말한다. 클래스를 변경하는 이유가 단 한 개여야한다라는 뜻으로 표현하기도 한다. 

클래스 안에 여러 책임이 있게 되면 객체 지향 코드가 아닌 절차 지향 코드가 되어버린다. 그리고 수정할 때 다른 책임과 연관을 갖게되어 수정을 할 때 다른 책임에 영향이 갈 가능성도 커지게 된다. 때문에 코드의 수정을 할 때 보다 수월하게 하기 위해서 이 원칙이 지켜져야한다. 

그리고 단일책임원칙이 잘 지켜졌을 때 또 하나의 장점은 하나의 기능만을 가지고 있기 때문에 재사용성이 커진다는 점이다.


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

확장에는 개방되어있고, 수정에 있어서는 닫혀있는 구조가 되어야한다는 원칙이다.

새로운 조건이 추가될 때 관련된 다른 객체에 최대한 영향이 없도록 해야한다. 즉, 수정된 클래스 이외에 다른 클래스는 수정하지 않도록 코드를 작성해야한다. 그러기 위해서는 클래스간의 의존도와 결합도가 작을수록 좋다.


개방폐쇄 원칙을 지키기 위해 추상화와 다형성을 이용해야 한다. 그 예시로는 전략패턴이 있다. 새로운 전략이 추가할 때(확장) 서브클래스를 생성해주면 된다. 이 때 Context 클래스에는 영향이 가지 않는다.(폐쇄)


3. 리스코프 치환 원칙(Liskov substitution principle)

자식 클래스는 언제나 자신의 부모 클래스를 교체할 수 있다는 원칙이다. 즉, 부모 클래스가 들어가는 자리에 자식 클래스를 넣어도 의도에 맞게 작동되야한다. 즉, 업캐스팅을 해도 문제가 되지 않아야한다. 


리스코프 치환 원칙은 다형성(상속)과 관련이 깊다. 때문에 리스코프 치환원칙이 잘 지켜져야 개방 폐쇄원칙도 지켜질 수 있다.


4, 인터페이스 분리의 법칙(Interface segregation principle)

이 개념은 클라이언트가 자신이 이용하지 않는 메서드에 의존하지 않아야한다는 원칙이다. 클라이언트 입장에서 인터페이스를 분리해야한다.

한 클래스는 자신이 사용하지 않는 인터페이스는 구현하지 말아야한다. 하나의 일반적인 인터페이스보다는 여러 개의 구체적인 인터페이스가 낫다.

단일책임원칙과 마찬가지로 인터페이스 분리법칙은 객체가 커지는 것을 막아준다. 객체가 많은 기능을 가지게 되면, 변화가 있을 때 다른 객체에 영향이 크지게 되고, 다른 기능을 하는 클라이언트까지 영향을 줄 수 있기 때문이다. 결과적으로 이러한 원칙을 지켜야하는 이유는 코드의 변경이 보다 수월하기 위함에 있다.


5. 의존관계역전법칙(Dependency inversion principle)

상위 모듈은 하위 모듈의 구현에 의존하면 안되며, 하위 모듈이 상위 모듈에서 정의한 추상 타입에 의존해야한다는 원칙이다. 

클래스의 개념으로 이해하면, 하위 클래스가 상위 클래스에 의존해야하며, 상위클래스가 하위클래스에 의존하면 안된다는 의미다. 하위클래스가 상위클래스를 의존하게 하는 방법은 추상화가 있다. 

추상 타입(인터페이스)를 통해서 하위클래스와 상위클래스는 추상타입에 의존하도록 만들 수 있다. 이렇게 코드를 작성하면 변경사항이 생겨도 상위 클래스의 변경없이 하위 클래스만 변경할 수 있는 코드의 유연함을 가지게 된다.

의존관계역전법칙은 추상화와 관련이 깊은데 의존관계역전법칙이 잘 지켜져야지(추상화) 개방폐쇄원칙이 지켜질 수 있다.



참고 위키디피아 위키나무

출처 http://meylady.tistory.com/

Comments