본문 바로가기

Road to Web Developer/알.쓸.개.잡

SOLID 원칙

객체지향 디자인 원리들을 사용하면 좀 더 유지보수하기 쉽고, 유연하고, 확장이 쉬운 소프트웨어를 만들 수 있다. 이 원리들은 그 크기를 대비해 보면 패턴보다 훨씬 작지만, 표준화 작업에서부터 아키텍처 설계에 이르기까지 다양하게 적용되는 원칙이다.


① Single Responsibility Principle : 단일 책임의 원칙(SRP)


한 클래스에 하나의 책임만 가진다.


여기서 책임이란 '기능' 정도로 생각하면 된다. 설계를 잘한 프로그램은 기본적으로 새로운 요구사항과 프로그램 변경에 영향을 적게 받는다. 즉, 응집도는 높지만 결합도는 낮은 프로그램이다. 만약 한 클래스가 갖는 책임이 많아지면 클래스 내부의 함수끼리 결합도가 높아져서 유지보수가 어려워질 수 있다. 그래서 책임을 분산시킬 필요가 있다. 


② Open-Close Principle : 개방폐쇄의 원칙 (OCP)


확장에는 열려 있으나 변경에는 닫혀 있어야 한다.


OCP는 변경되는 것이 무엇인지에 포커스를 맞춘다. 자주 변경되는 것은 수정하기 쉬워야 하며, 변경 되지 않아야 하는 것은 수정되는 내용에 영향을 받지 않는 것이 핵심이다. 대표적인 문법이 인터페이스(Interface)다. 객체 지향의 장점을 극대화하는 원리다.


③ Liskov Substitution Principle : 리스코프 치환 원칙 (LSP)


프로그램의 객체는 정확성을 깨뜨리지 않으면서, 하위 타입의 인스턴스로 바꿀 수 있어야 한다.

즉, 인터페이스만 알면 구현체를 몰라도 사용이 가능해야 한다.


④ Interface Segregation Principle : 인터페이스 분리의 원칙 (ISP)


하나의 일반적인 인터페이스보다는 구체적인 여러개의 인터페이스가 낫다.


SRP가 클래스의 단일 책임을 의미한다면, ISP는 인터페이스의 단일 책임을 의미한다. 예를 들어 스마트폰으로 카카오톡과 인터넷을 하고 있는데 전화가 온다. 이때 전화는 카카오톡과 인터넷에 영향을 끼치면 안되므로 독립된 인터페이스로 구축되고, 마찬가지로 카카오톡이나 인터넷도 독립되어 서로 영향을 끼치지 않도록 설계되어야 한다.


⑤ Dependency Inversion Principle : 의존성 역전의 원칙 (DIP)


추상화에 의존하지, 구체화에 의존하면 안된다.


변경되기 쉬운 것이 변경되기 어려운 것에 의존해야 한다. 즉, 부모 클래스가 자식 클래스에 의존하면 안된다는 의미다.