객체 지향 설계 5원칙 - SOLID

2020. 6. 29. 11:00정리/JAVA

SOLID란 객체 지향 프로그래밍 및 설계의 다섯 가지 기본 원칙을 의미한다.

객체 지향 프로그래밍에서 장점을 명확히 누리기 위해 결합도는 낮추고 응집도를 높이는 원칙을 객체 지향 관점에서 재정립한 것이라고 볼 수 있다.

 

S - SRP(Single Responsibility Principle, 단일 책임 원칙)

O - OCP(Open Closed Principle, 개방 폐쇄 원칙)

L - LSP(Liskov Subsitution Principle, 리스코프 치환 원칙)

I - ISP(Interface SEgregation Principle, 인터페이스 분리 원칙)

D - DIP(Dependency Inversion Principle, 의존 역전 원칙)

 

으로 구성되어 있다.

이 5가지를 간단하게 정리해봤다. 


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

 

 

객체는 단 하나의 책임(기능)만을 가지도록 설계해야 한다. 

이것의 의미는 단 하나의 책임(기능)만을 가지기 때문에 해당 객체를 수정해야 할 경우가 단 하나의 기능 때문이라는 것이다. 

이는 객체 지향 프로그래밍의 특징인 낮은 결합도를 의미하며 그렇다 보니 캡슐화와 가장 밀접하게 관련이 있다.

 

만약 단일 책임 원칙을 적용하지 않았다면 객체가 여러 가지 책임을 처리하기 위해 if문과 같은 분기 처리가 많아질 것이며 이 경우 결합도는 어쩔 수 없이 높아질 것이다.

 


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

 

자신의 확장에는 열려 있고, 주변의 변화에 대해서는 닫혀 있어야 한다는 원칙이다.

쉽게 말하면 어떠한 새로운 기능을 추가할 경우 자신 외의 다른 코드가 변경되지 않도록 설계하는 것이다.

 

단일 책임 원칙이 변경될만한 책임이 1개인지 확인하는 원칙이라고 하면, 개방 폐쇄 원칙은 책임이 변할 때마다 다른 코드와 독립적으로 변화할 수 있도록 도와주는 원칙이라고 볼 수 있다. 

 

이 원칙은 추상화와 관련이 있는데, 어떠한 모듈이 추상화가 적용되어 있을 경우 같은 추상화 모델이 아닌 이상 다른 코드에 영향을 받지 않고, 같은 추상화 모델일 경우 새롭게 클래스를 파생해 자기 자신을 수정할 수 있기 때문이다. 

 

해당 원칙을 적용하기 위해 Strategy라는 디자인 패턴을 사용한다. 

 

해당 원칙을 적용하지 않았다면 유연성, 재사용성과 유지보수성 등과 같은 장점을 누릴 수 없다. 

즉 객체 지향 프로그래밍에서 반드시 지켜야할 기본적인 원칙이라고 볼 수 있다. 


LSP(Liskov Subsitution Principle, 리스코프 치환 원칙)

 

하위 클래스는 언제나 자신의 상위 클래스로 교체할 수 있어야 한다는 원칙이다. 

 

이는 하위 클래스에서는 상위 클래스의 모든 기능을 포함하고 있어야 한다는 의미이므로 객체 지향 프로그래밍에서 상속성과 관련이 있다.

 

상속 관계에 있을 경우 하위 클래스를 상위 클래스의 데이터 타입으로 표현할 수 있기 때문에 객체 지향 설계에서 상속 관계를 정확하게 표현했다면 해당 원칙은 자연스럽게 적용되는 듯 하다.

 

또한 해당 원칙은 몇 가지 제약조건이 있는데, 먼저 시그니처의 경우

  • 하위 클래스에서 메소드 인수의 반공변성
  • 하위형에서 반환형의 공변성
  • 하위형에서 메소드는 상위형 메소드에서 던져진 예외의 하위형을 제외하고 새로운 예외를 던져서는 안된다.

라는 제약 조건이 있으며, 하위형에서 만족해야 하는 조건으로는

  • 하위형에서 선행조건을 강화될 수 없다.
  • 하위형에서 후행조건은 약화될 수 없다.
  • 하위형에서 상위형의 불변조건은 반드시 유지되어야 한다.

가 있다.

 

이러한 제약조건, 혹은 필요조건을 살펴보면 객체 지향 프로그래밍에서의 특징인 상속성을 정리할 때의 주의사항, 예를 들어 오버라이딩한 메소드는 상위 클래스보다 넓은 영역의 접근 제한자를 둘 수 없다거나 상위 클래스에서의 예외 영역보다 넓어서는 안된다라는 사항들과 매우 밀접한 관계가 있음을 알 수 있다.

 

공변성과 반공변성은 가변성, 특정 타입의 객체를 다른 타입의 객체로 변환할 수 있는 성격을 의미한다.

 


ISP(Interface SEgregation Principle, 인터페이스 분리 원칙)

 

인터페이스를 모듈별로 분리하자는 원칙이다.

 

모듈에서 사용하는 인터페이스는 모듈에서 사용하지 않는 기능이 포함되서는 안된다는 원칙이며 이는 결과적으로는 하나의 모듈에 모듈과 관련된 책임만을 포함한다는 의미이므로 단일 책임 원칙과 유사한 면이 있다.

 

즉 인터페이스 분리 원칙이던 단일 책임 원칙이던 설계에 적용시킬 경우 결과물은 유사할 것이며, 그렇기 때문에 이들 중 상황에 따라 적절한 것을 적용시키면 될 것이다.

 

특별한 경우가 아니라면 단일 책임 원칙을 적용하는 것이 대체적으로 더 효율적이라고 한다.

 


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

 

자기 자신보다 변하기 쉬운 것에 의존하지 않는다는 원칙이다.

 

상위 모듈은 하위 모듈에 의존해서는 안된다. 상위 모듈과 하위 모듈 모두 추상화에 의존해야 한다.

추상화는 세부 사항에 의존해서는 안된다. 세부사항이 추상화에 의존해야 한다.

 

해당 원칙은 상위와 하위 객체 모두 동일한 추상화에 의존해야 한다는 객체 지향적 설계의 대원칙을 제공한다. 

 


SOLID에 대한 간단한 개념만을 정리했는데, 어렴풋하게 이해는 되지만 정확하게 와닿지 않기 때문에 원칙 하나하나씩 예제를 들어 찾아볼 예정이다.

 

해당 글은 개인이 공부하면서 정리한 글이기 때문에 정확하지 않은 내용이 있을 수 있습니다.

 

참조

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

https://sticky32.tistory.com/entry/C-%EA%B3%B5%EB%B3%80%EC%84%B1%EA%B3%BC-%EB%B0%98%EA%B3%B5%EB%B3%80%EC%84%B1%EC%9D%B4%EB%9E%80

 

'정리 > JAVA' 카테고리의 다른 글

인터페이스와 추상클래스  (0) 2020.06.26
추상 클래스  (0) 2020.06.25
인터페이스  (0) 2020.06.02
다형성  (0) 2020.05.27
상속  (0) 2020.05.25