Back-End/Spring Boot
예습) 스프링 입문을 위한 자바 객체 지향의 원리와 이해
newny
2023. 4. 17. 20:45
반응형
SOLID
객체 지향 프로그래밍 및 설계의 다섯가지 기본 원칙
응집도는 높이고, 결합도는 낮춰라
- SRP(Single Responsibility Principle) : 단일 책임 원칙
- OCP(Open Closed Principle) : 개방 폐쇄 원칙
- LSP(Liskov Substitution Principle) : 리스코프 치환 원칙
- ISP(Interface Segregation Principle) : 인터페이스 분리 원칙
- DIP(Dependency Inversion Principle) : 의존 역전 원칙
결합도
- 모듈(클래스) 간의 상호 의존 정도
- 결합도가 낮으면 모듈 간의 상호 의존성이 줄어들어 객체의 재사용이나 수정, 유지보수가 용이하다.
응집도
- 하나의 모듈 내부에 존재하는 구성 요소들의 기능적 관련성
- 응집도가 높은 모듈은 하나의 책임에 집중하고 독립성이 높아져 재사용이나 기능의 수정, 유지보수가 용이하다.
SRP(Single Responsibility Principle) : 단일책임 원칙
- 객체는 단 하나의 책임(기능담당)만 가져야 한다는 원칙
- 같이 수정해야될 것들은 묶고, 따로 수정해야될 것들은 분리하는 것
- 책임의 갯수 ≠ 메소드의 갯수
예) 맥가이버로 여러 기능을 사용할것인지(X), 필요에 맞는 각각의 도구들을 따로 사용할 것인지(O)
OCP(Open Closed Principle) : 개방 폐쇄 원칙
- 소프트웨어 엔티티(클래스, 모듈, 함수 등)는 확장에 대해서는 열려 있어야 하지만 변경(수정)에 대해서는 닫혀 있어야 한다.
- 기능 추가 요청이 오면 클래스를 확장을 통해 손쉽게 구현하면서, 확장에 따른 클래스 수정은 최소화 하도록 프로그램을 작성해야 하는 설계 기법을 말한다고 보면 된다.
예1) JDBC 연결 → DB가 오라클에서 MySQL로 바뀐다고 해도 Connection을 설정하는 부분 외에는 따로 수정할 필요가 없음
- 자바 애플리케이션은 데이터베이스라고 하는 주변의 변화에 닫혀있음
- 데이터베이스를 교체한다는 것은 데이터베이스가 자신의 확장에는 열려있음을 의미
예2) 여러 운영체제 상에서 java는 JVM에 의해 똑같이 구동됨
- 개발자가 작성한 소스코드는 운영체제의 변화에 닫혀있음
- 각 운영체제별 JVM은 확장에 열려 있는 구조가 됨
// 잘못된 설계 예시
class HelloAnimal {
// 기능을 확장하기 위해서는 클래스 내부 구성을 일일히 수정해야 하는 번거로움이 생긴다.
void hello(Animal animal) {
if (animal.type.equals("Cat")) {
System.out.println("냐옹");
} else if (animal.type.equals("Dog")) {
System.out.println("멍멍");
} else if (animal.type.equals("Sheep")) {
System.out.println("메에에");
} else if (animal.type.equals("Lion")) {
System.out.println("어흥");
}
// ...
}
}
// OCP의 좋은 예시 → 추상화시켜 코드 수정없이 확장이 가능하게 한다
class Cat extends Animal { // 상속
void speak() {
System.out.println("냐옹");
}
}
class Dog extends Animal { // 상속
void speak() {
System.out.println("멍멍");
}
}
class Lion extends Animal {
void speak() {
System.out.println("어흥");
}
}
//...
LSP(Liskov Substitution Principle) : 리스코프 치환 원칙
- 서브 타입은 언제나 기반 타입으로 교체할 수 있어야 한다.
- 계층도/조직도가 아닌 분류도로 표현되어야 한다.
- 하위 클래스 is a kind of 상위 클래스 - 하위 분류는 상위 분류의 한 종류이다
- 구현 클래스 is able to 인터페이스 - 구현 분류는 인터페이스할 수 있어야 한다.
→ ‘인터페이스 할 수 있어야 한다’의 의미 (인터페이스 명)
- AutoCloseable - 자동으로 닫힐 수 있어야 한다
- Appendable - 덧붙일 수 있어야 한다
- Cloneable - 복제할 수 있어야 한다
- Runnale - 실행할 수 있어야 한다
반응형