Open zbqmgldjfh opened 2 years ago
SRP : 단일 책임 원칙 OCP : 개방 폐쇄 원칙 LSP : 리스코프 치환 원칙 ISP : 인터페이스 분리 원칙 DIP : 의존관계 역전 원칙
단일 책임 원칙이라 부른다.
한 클래스는 하나의 책임만을 가져야 한다는 것을 의미한다. 하지만 하나의 책임이라는 것이 좀 모호하다? 책임이라는게 클 수도 있고, 작을 수도 있기 때문이다.
예를들어 자동차를 생각해보자. 자동자 전체를 하나의 책임으로 본다면 운전, 트렁크, 좌석 등등 모든 기능을 자동차의 기능으로 보고 하나의 큰 책임이라 할 수도 있고, 운전을 하나의 책임, 트렁크도 하나의 책임, 좌석도 하나의 책임으로 세부적으로 본다면 이또한 각자의 첵임이라 할 수 있다. 따라서 문맥과 상황에 따라 다르다.
중요한 기준은 변경이다. 변경이 있을 때 파급 효과가 적으면 단일 책임 원칙 잘 따른 것이다. 예를 들어서 UI하나 변경하는데, SQL 코드부터 시작해서 애플리케이션 다 고쳐야 한다면 단일책임 원칙을 잘 지키지 못한 것이다.
즉! 변경되는 이유가 한가지여야만 한다!
소프트웨어 요소는 확장에는 열려있으나 변경에는 닫혀있어야 한다.
어떻게? 확장을 하려면 당연히 기존 코드 변경해야하지 않나? 이런 경우 다형성을 활용하면 됩니다!
인터페이스를 구현한 새로운 클래스(구상 클래스)를 하나 만들어서 새로운 기능을 구현했다고 해보자. 이런 새로운 클래스를 만드는 것은 기존 코드를 변경하는 것이 아니다. 인터페이스는 그대로 있고 새로운 구현체가 만들어진 것 입니다. 즉, 확장에 열려있는 것 이죠!
또한 이를 사용하는 곳에서는 Interface를 받도록 하면, 해당 interface를 구현한 모든 구현한 모든 구현체를 사용할 수 있으면서, 자신의 코드는 변경하지 않아도 됩니다. 즉, 수정에 닫혀있는 것 이죠!
이렇게 추상화를 통해 변하는 것들은 숨기고 변하지 않는 것들에 의존하게 하면 우리는 기존의 코드 및 클래스들을 수정하지 않은 채로 애플리케이션을 확장할 수 있습니다. 그리고 이것이 개방 폐쇄의 원칙이 의미하는 것죠!
하위 타입은 상위 타입을 대체할 수 있어야 한다는 것이다. 즉, 해당 객체를 사용하는 클라이언트는 상위 타입이 하위 타입으로 변경되어도, 차이점을 인식하지 못한 채 상위 타입의 퍼블릭 인터페이스를 통해 서브 클래스를 사용할 수 있어야 한다는 것이다.
객체가 충분히 높은 응집도의 작은 단위로 설계됐더라도, 목적과 관심이 각기 다른 클라이언트가 있다면 인터페이스를 통해 적절하게 분리해줄 필요가 있는데, 이를 인터페이스 분리 원칙이라고 부른다.
즉, 인터페이스 분리 원칙이란 클라이언트의 목적과 용도에 적합한 인터페이스 만을 제공하는 것이다. 인터페이스 분리 원칙을 준수 함으로써 모든 클라이언트가 자신의 관심에 맞는 퍼블릭 인터페이스(외부에서 접근 가능한 메세지)만을 접근하여 불필요한 간섭을 최소화할 수 있으며, 기존 클라이언트에 영향을 주지 않은 채로 유연하게 객체의 기능을 확장하거나 수정할 수 있다.
의존 역전 원칙이란 결국 추상화에 의존하며 구체화에는 의존하지 않는 설계 원칙을 의미한다.
고수준 모듈은 저수준 모듈의 구현에 의존해서는 안 되며, 저수준 모듈이 고수준 모듈에서 정의한 추상 타입에 의존해야 한다는 것이다. 객체 지향 프로그래밍에서는 객체들 사이에 메세지를 주고 받기 위해 의존성이 생기는데, 의존성 역전의 원칙은 올바른 의존 관계를 위한 원칙에 해당되는 것 이다.
OOP의 5대 원칙 (SOLID)에 대하여 학습하기
키워드
Java
,OOP