2024. 2. 12. 16:48ㆍetc
SOLID란?
객체지향 프로그래밍 5대 원칙이다.
각 알파벳은 아래와 같은 의미를 담고 있다.
- Single Responsibility Principle - 단일 책임 원칙
- Open-Closed Principle - 개방-폐쇄 원칙
- Liskov substitution principle - 리스코브 치환 원칙
- Interface segregation principle - 인터페이스 분리 원칙
- Dependency inversion principle - 의존관계 역전 원칙
필요할 때 마다 내용을 추가하는 것으로 하고, 우선 OCP 원칙 부터 학습해보자.
OCP 원칙 (Open-Closed Principle - 개방-폐쇄 원칙)
Open for extension - 새로운 기능의 추가나 변경사항이 생겼을 때, 기존 코드는 확장할 수 있어야 함.
Closed for modification - 기존의 코드는 수정되지 않아야 함.
솔직히 원칙 읽어봤자, 뭔지 파악 잘 안 된다.
강의 보고 예제 작성하면서 이해도를 높여보자.
public class Kid{
private Lego lego;
public void setLego(Lego lego){
this.lego = lego;
}
}
위의 코드만 봤을 때, '어린이'는 '레고'를 가질 수 있다.
그러나, 레고'만' 갖고 고는 어린이가 있을까??
어린이는 레고 말고 닌텐도 스위치도 갖고 싶다.
위의 코드에서 어린이에게 스위치를 쥐여 주려면 어떻게 해야 할까?
public class Kid{
private Lego lego;
private NintendoSwitch nintendoSwitch;
public void setLego(Lego lego){
this.lego = lego;
}
public void setNintendoSwitch(NintendoSwitch nintendoSwitch){
this.nintendoSwitch = nintendoSwitch;
}
}
추가 해주면 된다.
그런데, 닌텐도 스위치 말고, 시크릿 쥬쥬, 뽀로로, 타요 등 등 다른 장난감도 필요하게 된다면?
코드가 밑도 끝도 없이 계속해서 늘어나야 할 것이다.
장난감을 사용(의존)하는 클라이언트(Kid)의 코드가 계속해서 변경되고 있는 것이다.
위에서 ocp 원칙을 지키려면 아래와 같아야 한다고 했다.
Open for extension - 새로운 기능의 추가나 변경사항이 생겼을 때, 기존 코드는 확장할 수 있어야 함.
Closed for modification - 기존의 코드는 수정되지 않아야 함.
그러나, Kid는 변화(다른 장난감을 갖고 싶게 되는 상황)이 있을 때마다, 코드가 계속해서 수정돼야만 한다.
OCP 원칙을 위배하고 있는 것이다. 작성 해봤다면 알겠지만, 너무 번거롭고 귀찮다.
그렇다면 어떻게 해야 해당 원칙을 지킬 수 있을까????
우리는 이미 답을 알고 있다. '다형성'
Lego, NintendoSwitch 의 상위 개념으로 Toy 를 만들어보자.
public class Toy{
}
public class Lego extends Toy{
}
public class NintendoSwitch extends Toy{
}
Toy 를 작성하고 상속 관계를 맺었다. 이를 통해 Toy 타입 참조변수에 하위타입(Lego, NintendoSwitch) 를 담을 수 있게 됐다.
public class Kid{
private Toy toy;
public void setToy(Toy toy){
this.toy = toy;
}
}
중요하니까 한번 더,
Toy 타입 참조변수에 하위타입(Lego, NintendoSwitch) 를 담을 수 있게 됐다.
이제, 스타워즈 광선검, 빔샤벨, 건담, 피규어 등 등 Toy에 대한 하위타입이기만 하다면, 어떤 것을 추가하던 위의 코드만으로 어린이는 수 많은 장난감을 손에 쥘 수 있게 되었다.
다시 한번 복기 해보자.
Open for extension - 새로운 기능의 추가나 변경사항이 생겼을 때, 기존 코드는 확장할 수 있어야 함.
Closed for modification - 기존의 코드는 수정되지 않아야 함.
1. 확장
새로운 장난감이 필요하게 됐을 때, 아이가 가질 수 있는가?
ㄴ yes. 다형성을 통해 어떤 장난감이든 가질 수 있음.
2. 기존 코드 수정
새로운 장난감이 필요하게 됐을 때, 기존 코드의 수정이 필요한가?
ㄴ No. 새로운 장난감에 대한 작성은 필요하겠지만 Kid 는 그것을 알 필요가 없음. 다형성을 통해 가능했음.
이상.
본 글에서는 객체지향 설계원칙(SOLID) 중 OCP(개방-폐쇄 원칙)에 대해 알아 보았다.
'etc' 카테고리의 다른 글
| JPA - 등장 배경 (0) | 2024.11.06 |
|---|---|
| 휴먼에러_지역변수, 인스턴스 변수 착각 (0) | 2024.06.28 |
| h2_문법 오류_큰 따옴표, 작은 따옴표 (0) | 2024.02.27 |
| 순차 탐색 ? 이진 탐색? (0) | 2024.02.17 |