객체지향 설계원칙: SOLID
S: SRP, Single Responsibility Principle: 단일 책임 원칙
- 한 객체는 하나의 책임만을 진다
- 수정이 필요할 경우 수정되는 이유는 그 책임, 하나 때문이어야 한다.
O: OCP, Open Close Principle: 수정에는 닫히고, 확장에는 열어라
- 객체를 만들 때 처음부터 수정할 수 있게 만들지 말고 확장하여 기능을 변경할 수 있도록 만들어라
L: LSP, Liscov Substitution Principle: 리스코프 치환 원칙
- 추상객체로 사용되는 부분에 구상객체가 들어가도 문제가 없어야 한다.
- 객체간의 관계를 추상과 구상으로 묶었다면 자연스럽게 이루어지는 것.
- 상속을 공통기능의 전달로서 사용하게 되면 깨지게 됨.
I: ISP, Interface Segregation Principle: 인터페이스 분리 원칙
- 기능별로 인터페이스를 분리한다.
D: DIP, Dependency Inversion Principle: 의존역전
- 구상체에 의존하지 말고 추상체를 통해 의존하라
- 추상체에 의존 => 실행부에서 구상체를 결정: 결합도를 낮출 수 있음
//구현부, Service 클래스
// Login 인터페이스를 상속받음
public class UserService implements Login{
private Login login;
//Login의 type를 외부에서 받음
public UserService(Login login){
this.login = login;
}
//Login 인터페이스의 메소드 구현
@Override
public void login() {
login.login();
}
//메소드와 매개변수로 어떤 로그인을 할지 결정
//호스트 코드에서 어떤 로그인을 할지 결정
void run(LoginType loginType) {
Login user = getLogin(loginType);
user.login();
}
//구현코드
//LoginType: Enum Class
//팩토리 패턴: 대신 새로운 인스턴스를 생성
private static Login getLogin(LoginType type) {
if(type == LoginType.Kakao) return new KakaoLogin();
return new NaverLogin();
}
}
//호스트 코드: 구현코드가 아닌, 구현코드를 실행하는 말단. 호출부
//인터페이스의 다형성을 활용하여 구현부의 코드를 독립적이면서도 다양하게 활용할 수 있음
UserService s = new UserService(new KakaoLogin());
s.login();
login을 이용해서 기능을 수행하기 때문에 "Login에 의존한다"라고 표현.
private Login login = new KakaoLogin(); 이렇게 서비스 클래스에서 직접 구상체를 결정하게 되면 기능이 KakaoLogin이라는 구상체에만 한정되게 된다. 그러나 private Login login; 을 필드로 선언하고 생성자를 UserService(Login login)과 같이 외부에서 전달받는다면, 여러가지 기능을 수행할 수 있는 잠재력을 갖추게 된다.
private Login login = new KakaoLogin(); 이렇게 서비스 클래스에서 직접 구상체를 결정하게 되면 기능이 KakaoLogin이라는 구상체에만 한정되게 된다. 그러나 private Login login; 을 필드로 선언하고 생성자를 UserService(Login login)과 같이 외부에서 전달받는다면, 여러가지 기능을 수행할 수 있는 잠재력을 갖추게 된다.
>> 이를 "의존도를 낮춘다" 라고 표현한다
의존성을 외부로부터 전달받았다는 것은 "의존성을 주입받았다"라고 표현하고, 이를 Dependency Injection(DI, 의존성 주입)이라고 한다.
결합도는 클래스 간 관계가 맺어지는 정도를 말한다. KakaoLogin과 같은 구상체와 결합하는 경우는 결합이 강하고, Login과 같은 추상체와 결합하는 경우는 결합도가 낮다. SOLID 원칙의 D, Dependency Inversion Principle(의존성 역전)은 위의 코드와 같이 구상체가 아닌 추상체와 의존하여 결합도를 낮추는 것을 말한다.
'CS' 카테고리의 다른 글
CORS (0) | 2023.03.17 |
---|---|
Server와 Client, request와 response (0) | 2023.02.02 |
Entity, VO, DTO (0) | 2023.01.30 |
디자인패턴 (0) | 2023.01.19 |
UML(Unified Modeling Language) (0) | 2023.01.10 |