[스프링 입문을 위한 자바 객체 지향의 원리와 이해] Chapter 5정리

구범모·2023년 7월 13일
0

개구리책

목록 보기
4/6
post-thumbnail

SOLID의 주 목적

응집도는 높이고, 결합도는 낮추라.

응집도 : 하나의 모듈 내부에 존재하는 구성 요소들의 기능적 관련성. 응집도가 높은 모듈은 하나의 책임에 집중하고 독립성이 높아져 재사용이나 기능의 수정, 유지보수가 용이 (클래스 내의 메소드끼리 엮이도록 구현하는게 좋다는 듯.)

결합도 : 모듈간의 상호 의존 정도로서 결합도가 낮으면 모듈 간의 상호 의존성이 줄어들어 객체의 재사용이나 수정, 유지보수가 용이.

SRP - 단일 책임 원칙

💡 어떤 클래스를 변경해야 하는 이유는 오직 하나뿐이어야 한다.

단일 책임을 지키지 못하는 경우

1. 속성이 여러 의미를 갖는 경우 / 할당되지 말아야 할 속성이 있는 경우

ex : 하나의 필드가 하나의 클래스에선 A, 다른 클래스에선 B의 의미로 통하는 경우,
여자 클래스에 군번이 있는 경우(모든 남성만 군대를 가고, 모든 여성은 군대를 안 간다고 가정.)

2. 메서드가 단일 책임을 지키지 못하는 경우.

하나의 메서드에서 분기 처리를 위한 if문이 존재 할 때.

ex : 강아지 클래스에서 소변보다() 메서드를 구현 할 때, 암컷 / 수컷을 나누어서 if문으로 분기처리 하는 경우.

OCP - 개방 폐쇄 원칙

💡 확장에 대해서는 열려 있어야 하고, 변경에 있어서는 닫혀 있어야 한다.

상위 클래스 / 인터페이스에 의존하게 함으로써, 의존하는 클래스가 다른 클래스로 바뀌더라도 상위 클래스 / 인터페이스의 메소드를 사용하므로 확장에는 개방되어 있고, 변경에는 폐쇄되어 있다.

ex : 데이터베이스 프로그래밍(JDBC를 사용할 때, Oracle → Mysql로 DB를 바꿔도 Connection만 수정하면 끝. )

LSP - 리스코프 치환 원칙

💡 서브 타입은 언제나 자신의 기반 타입으로 교체할 수 있어야 한다.
  • 하위클래스 is a kind of 상위 클래스 - 하위 분류는 상위 분류의 한 종류다.
  • 구현클래스 is able to 인터페이스 - 구현체는 인터페이스할 수 있어야 한다.

위 두가지를 만족하면, LSP를 만족하는 것 → 상속이 분류도 형태로 잘 되어있기 때문(상속이 조직도 / 계층도 형태로 돼있으면 안된다!)

💡 하위 클래스가 상위 클래스의 역할(메소드)를 수행 할 수 있으면, 그것은 LSP를 만족하는 관계! → 상속만 잘 하면 LSP는 지켜진다!

ISP - 인터페이스 분리 원칙

💡 클라이언트는 자신이 사용하지 않는 메서드에 의존 관계를 맺으면 안 된다.

하나의 큰 클래스를, 세부적인 인터페이스로 나누는 방법.

결국 SRP와 ISP는 한 문제에 대한 두가지의 다른 해결책이다.

일반적으로 SRP가 더 좋은 해결책이라고 한다.(인터페이스로 분할해서 쓰면, 쓰이지 않는 메서드가 많아지므로?)

상위 클래스는 풍성할 수록 좋고, 인터페이스는 작을 수록 좋은 이유

상위클래스가 풍성하면, LSP를 적용할 때 하위 클래스가 상위 클래스의 풍부한(다양한) 멤버변수를 이용할 수 있으므로 좋고,

인터페이스가 작으면, 해당 객체가 쓸(필요한) 메서드만 누릴 수 있기 때문에 좋다.

DIP - 의존 역전 원칙

💡 고차원 모듈은 저차원 모듈에 의존하면 안 된다. 이 두 모듈 모두 다른 추상화된 것에 의존해야 한다. 추상화된 것은 구체적인 것에 의존하면 안 된다. 구체적인 것이 추상화된 것에 의존해야 한다. 자주 변경되는 구체 클래스에 의존하지 마라.(추상 클래스에 의존해라)

자신보다 변하기 쉬운 것(구체 클래스)에 의존하던 것을 추상화된 인터페이스나 상위 클래스를 두어 변하기 쉬운 것의 변화에 영향받지 않게 하는 것.

profile
우상향 하는 개발자

0개의 댓글