
객체 지향의 설계 5원칙
객체 지향 설계 (OOD) 5원칙 SOLID 은
응집도는 높이고 결합도는 낮추는 원칙을 객체 지향 관점에서 재정립한 것이다.
- 응집도 Cohension : 한 모듈 내 구성 요소들의 기능적 관련성
응집도가 높으면 하나의 책임에 집중하고 독립성이 높아져 재사용과 유지보수가 용이하다.
- 결합도 Coupling : 모듈(클래스) 간의 상호 의존 정도
결합도가 낮으면 객체의 재사용이나 유지보수가 용이하다.
SOLID 는 객체 지향을 프로그램에 올바르게 녹여내기 위한 원칙이다.
속성, 메서드, 클래스, 객체, 패키지, 모듈, 라이브러리, 프레임워크, 아키텍처 등 다양하게 적용된다.
SRP : Single Responsibility, 단일 책임 원칙
어떤 클래스를 변경해야 하는 이유는 오직 하나뿐이어야 한다.
하나의 클래스가 여러가지 역할을 맡고 있다면, 역할(책임)을 분리하라는 것이 단일 책임 원칙이다.
클래스 뿐만 아니라 속성, 메서드, 패키지, 모듈, 컴포넌트, 프레임워크에도 적용할 수 있다.
하나의 속성이 여러 의미를 가지는 경우도 단일 책임 원칙을 지키지 못하는 경우이다.
메서드가 단일 책임 원칙을 지키지 못하는 경우에도 흔히 분기 처리를 위한 if 문이 쓰인다.
OCP : Open Closed, 개방 폐쇄 원칙
소프트웨어 엔티티는 확장에 대해서는 열려 있어야 하지만 변경에 대해서는 닫혀 있어야 한다.
즉 자신의 확장에는 열려 있고, 주변의 변화에 대해서는 닫혀 있어야 한다.
개방 폐쇄 원칙을 만족하지 못하는 경우에는 상위 클래스 또는 인터페이스를 중간에 둠으로써 해결할 수 있다.
대표적인 예시로 JDBC 가 있다.
클라이언트는 데이터베이스의 종류가 달라지더라도 connection 설정 외에는 수정할 필요가 없다.
JDBC 인터페이스로 인해 자바 어플리케이션은 데이터베이스라는 주변의 변화에 닫혀있으며, 데이터베이스는 자신의 확장에 열려있는 것이다.
LSP : Liskov Substitution, 리스코프 치환 원칙
서브 타입은 언제나 자신의 기반 타입으로 교체할 수 있어야 한다.
하위 클래스 인스턴스는 상위 객체 참조 변수에 대입해 상위 클래스 인스턴스 역할을 할 수 있어야 한다.
하위 클래스와 상위 클래스 간에 is a (is a kind of), 인터페이스와 구현 클래스 간에 is able to
(하위 분류는 상위 분류의 한 종류이다, 구현 분류는 인터페이스 할 수 있어야 한다)
를 만족한다면 리스코프 치환 원칙을 잘 지키고 있다고 볼 수 있다.
상속을 할 때 계층도가 아닌 분류도로 올바르게 상속 했다면, 자연스럽게 만족하게 된다.
- 하위형에서 선행 조건은 강화될 수 없다.
- 하위형에서 후행 조건은 약화될 수 없다.
- 하위형에서 상위형의 불변 조건은 반드시 유지되어야 한다.
ISP : Interface Segregation, 인터페이스 분리 원칙
클라이언트는 자신이 사용하지 않는 메서드에 의존 관계를 맺으면 안 된다.
여러 가지 역할을 가지고 있는 하나의 클래스를 단일 책임 원칙에 의해 여러 개로 분할할 수도 있지만,
각각의 역할만 할 수 있게 역할에 따른 인터페이스로 제한할 수도 있다.
단일 책임 원칙과 인터페이스 분리 원칙은 같은 문제에 대한 두 가지 다른 해결책이라고 볼 수 있다.
하지만 특별한 경우가 아니라면 단일 책임 원칙이 더 좋은 해결책이라고 ... !
상위 클래스는 풍성할수록 좋고, 인터페이스는 작을수록 좋다.
인터페이스 최소 주의 원칙 - 인터페이스에서는 해당 역할에 충실한 최소한의 메서드만 제공해야 한다.
DIP : Dependency Inversion, 의존 역전 원칙
고차원 모듈은 저차원 모듈에 의존하면 안 된다. 이 두 모듈 모두 다른 추상화된 것에 의존해야 한다.
추상화된 것은 구체적인 것에 의존하면 안 된다. 구체적인 것이 추상화된 것에 의존해야 한다.
자주 변경되는 구체(concrete) 클래스에 의존하지 마라.
의존 역전 원칙은 자신보다 변하기 쉬운 것에 의존하지 않는 것이다.
만약 자신보다 변하기 쉬운 것에 의존하고 있다면, 추상화된 인터페이스나 상위 클래스를 두어 변화에 영향받지 않게 할 수 있다 - 개방 폐쇄 원칙과 겹치는 내용
상위 클래스일수록, 인터페이스일수록, 추상 클래스일수록 변하지 않을 가능성이 높기에,
하위 클래스나 구체 클래스가 아닌 상위 클래스, 인터페이스, 추상 클래스를 통해 의존해야 한다.
SoC : Separation Of Concerns
SoC, 관심사의 분리
관심이 같은 것끼리는 하나의 객체 안으로 또는 친한 객체로 모으고,
관심이 다르고 변화의 시기가 다르면 가능한 한 따로 떨어져 서로 영향을 주지 않도록 분리해야 한다.
하나의 속성, 하나의 메서드, 하나의 클래스, 하나의 모듈에는 하나의 관심사만 들어있어야 한다.
그러면 자연스럽게 SRP, ISP, OCP 에 도달하게 된다.
'Study > Booooooook' 카테고리의 다른 글
도메인 주도 설계 핵심 1-2장 (0) | 2024.07.19 |
---|---|
자바 객체 지향의 원리와 이해 4. 객체 지향 (2) (0) | 2024.05.22 |
자바 객체 지향의 원리와 이해 3. 객체 지향 (1) (0) | 2024.05.18 |
자바 객체 지향의 원리와 이해 2. 메모리 (0) | 2024.05.07 |
자바 객체 지향의 원리와 이해 1. Intro (0) | 2024.04.18 |

객체 지향의 설계 5원칙
객체 지향 설계 (OOD) 5원칙 SOLID 은
응집도는 높이고 결합도는 낮추는 원칙을 객체 지향 관점에서 재정립한 것이다.
- 응집도 Cohension : 한 모듈 내 구성 요소들의 기능적 관련성
응집도가 높으면 하나의 책임에 집중하고 독립성이 높아져 재사용과 유지보수가 용이하다.
- 결합도 Coupling : 모듈(클래스) 간의 상호 의존 정도
결합도가 낮으면 객체의 재사용이나 유지보수가 용이하다.
SOLID 는 객체 지향을 프로그램에 올바르게 녹여내기 위한 원칙이다.
속성, 메서드, 클래스, 객체, 패키지, 모듈, 라이브러리, 프레임워크, 아키텍처 등 다양하게 적용된다.
SRP : Single Responsibility, 단일 책임 원칙
어떤 클래스를 변경해야 하는 이유는 오직 하나뿐이어야 한다.
하나의 클래스가 여러가지 역할을 맡고 있다면, 역할(책임)을 분리하라는 것이 단일 책임 원칙이다.
클래스 뿐만 아니라 속성, 메서드, 패키지, 모듈, 컴포넌트, 프레임워크에도 적용할 수 있다.
하나의 속성이 여러 의미를 가지는 경우도 단일 책임 원칙을 지키지 못하는 경우이다.
메서드가 단일 책임 원칙을 지키지 못하는 경우에도 흔히 분기 처리를 위한 if 문이 쓰인다.
OCP : Open Closed, 개방 폐쇄 원칙
소프트웨어 엔티티는 확장에 대해서는 열려 있어야 하지만 변경에 대해서는 닫혀 있어야 한다.
즉 자신의 확장에는 열려 있고, 주변의 변화에 대해서는 닫혀 있어야 한다.
개방 폐쇄 원칙을 만족하지 못하는 경우에는 상위 클래스 또는 인터페이스를 중간에 둠으로써 해결할 수 있다.
대표적인 예시로 JDBC 가 있다.
클라이언트는 데이터베이스의 종류가 달라지더라도 connection 설정 외에는 수정할 필요가 없다.
JDBC 인터페이스로 인해 자바 어플리케이션은 데이터베이스라는 주변의 변화에 닫혀있으며, 데이터베이스는 자신의 확장에 열려있는 것이다.
LSP : Liskov Substitution, 리스코프 치환 원칙
서브 타입은 언제나 자신의 기반 타입으로 교체할 수 있어야 한다.
하위 클래스 인스턴스는 상위 객체 참조 변수에 대입해 상위 클래스 인스턴스 역할을 할 수 있어야 한다.
하위 클래스와 상위 클래스 간에 is a (is a kind of), 인터페이스와 구현 클래스 간에 is able to
(하위 분류는 상위 분류의 한 종류이다, 구현 분류는 인터페이스 할 수 있어야 한다)
를 만족한다면 리스코프 치환 원칙을 잘 지키고 있다고 볼 수 있다.
상속을 할 때 계층도가 아닌 분류도로 올바르게 상속 했다면, 자연스럽게 만족하게 된다.
- 하위형에서 선행 조건은 강화될 수 없다.
- 하위형에서 후행 조건은 약화될 수 없다.
- 하위형에서 상위형의 불변 조건은 반드시 유지되어야 한다.
ISP : Interface Segregation, 인터페이스 분리 원칙
클라이언트는 자신이 사용하지 않는 메서드에 의존 관계를 맺으면 안 된다.
여러 가지 역할을 가지고 있는 하나의 클래스를 단일 책임 원칙에 의해 여러 개로 분할할 수도 있지만,
각각의 역할만 할 수 있게 역할에 따른 인터페이스로 제한할 수도 있다.
단일 책임 원칙과 인터페이스 분리 원칙은 같은 문제에 대한 두 가지 다른 해결책이라고 볼 수 있다.
하지만 특별한 경우가 아니라면 단일 책임 원칙이 더 좋은 해결책이라고 ... !
상위 클래스는 풍성할수록 좋고, 인터페이스는 작을수록 좋다.
인터페이스 최소 주의 원칙 - 인터페이스에서는 해당 역할에 충실한 최소한의 메서드만 제공해야 한다.
DIP : Dependency Inversion, 의존 역전 원칙
고차원 모듈은 저차원 모듈에 의존하면 안 된다. 이 두 모듈 모두 다른 추상화된 것에 의존해야 한다.
추상화된 것은 구체적인 것에 의존하면 안 된다. 구체적인 것이 추상화된 것에 의존해야 한다.
자주 변경되는 구체(concrete) 클래스에 의존하지 마라.
의존 역전 원칙은 자신보다 변하기 쉬운 것에 의존하지 않는 것이다.
만약 자신보다 변하기 쉬운 것에 의존하고 있다면, 추상화된 인터페이스나 상위 클래스를 두어 변화에 영향받지 않게 할 수 있다 - 개방 폐쇄 원칙과 겹치는 내용
상위 클래스일수록, 인터페이스일수록, 추상 클래스일수록 변하지 않을 가능성이 높기에,
하위 클래스나 구체 클래스가 아닌 상위 클래스, 인터페이스, 추상 클래스를 통해 의존해야 한다.
SoC : Separation Of Concerns
SoC, 관심사의 분리
관심이 같은 것끼리는 하나의 객체 안으로 또는 친한 객체로 모으고,
관심이 다르고 변화의 시기가 다르면 가능한 한 따로 떨어져 서로 영향을 주지 않도록 분리해야 한다.
하나의 속성, 하나의 메서드, 하나의 클래스, 하나의 모듈에는 하나의 관심사만 들어있어야 한다.
그러면 자연스럽게 SRP, ISP, OCP 에 도달하게 된다.
'Study > Booooooook' 카테고리의 다른 글
도메인 주도 설계 핵심 1-2장 (0) | 2024.07.19 |
---|---|
자바 객체 지향의 원리와 이해 4. 객체 지향 (2) (0) | 2024.05.22 |
자바 객체 지향의 원리와 이해 3. 객체 지향 (1) (0) | 2024.05.18 |
자바 객체 지향의 원리와 이해 2. 메모리 (0) | 2024.05.07 |
자바 객체 지향의 원리와 이해 1. Intro (0) | 2024.04.18 |