코딩로그
[SOLID] OCP_개방 폐쇄 원칙 본문
[OCP]
- 개방 폐쇄 원칙
- Open Closed Principle
- 클래스, 모듈, 함수는 확장에 대해서는 열려있어야 하지만 변경에 대해서는 닫혀 있어야 함
- 확장 → 새로운 타입을 추가함으로써 기능 확장
- 변경 → 확장이 발생했을 때 해당 코드를 호출하는 쪽에서 변경 발생 X
- 기존 코드 변경 없이 기능 추가할 수 있도록 설계
- 기존 코드 변경 없이 상속과 확장을 통해 변경할 수 있게 설계
- 변경되는 클래스의 영향이 밖으로 미치지 않도록 중간에 추상 클래스, 인터페이스 같은 완충장치 O
- 객체 지향의 추상화, 다향성 활용
- 다형성 → 하나의 객체가 여러 타입을 가질 수 있는 것
- 해당 클래스의 기존 동작을 변경하지 않고 클래스의 동작을 확장하는 것을 목표
- 하나의 변화가 다른 곳에도 연쇄적으로 변화를 일으키는 것을 방지하기 위해
- 유지 관리 및 수정이 쉬운 코드 작성 시, 필수
- 과도한 OCP 설계는 불필요한 복잡성을 유발 → 적절하게 사용
- ex) 충전기 타입 통일 → 기종이 달라도 같은 충전기 사용 가능
[Example]
- Bad Example
- 헤야 할 일이 추가될 때마다 새로운 class 생성, do 함수 생성, 실행
// OCP Bad Example
// 해야 할 일마다 새로운 do 함수 실행
class DogWash{
public void doWash(){
System.out.println("wash");
}
}
class DogEat{
public void doEat(){
System.out.println("eat");
}
}
class DogWalk{
public void doWalk(){
System.out.println("walk");
}
}
public class MyClass {
public static void main(String args[]) {
DogWash dubuwash = new DogWash();
DogEat dubueat = new DogEat();
DogWalk dubuwalk = new DogWalk();
dubuwash.doWash();
dubueat.doEat();
dubuwalk.doWalk();
}
}
- Good Example
- DogCare Class 코드 변경 없이 여러 일의 getNowDo() 기능 확장 가능
// OCP Good Example
// DogCare 클래스 코드 변경 없이 여러 일의 getNowDo() 기능 확장 가능
class DogCare{
public String nowDo = "";
public void dogCare(String nowDo){
this.nowDo = nowDo;
}
public void setNowDo(String nowDo){
this.nowDo = nowDo;
}
public void getNowDo(){
System.out.println("nowDo : " + nowDo);
}
}
class Wash extends DogCare{
public Wash() {
setNowDo("Wash");
}
@Override
public void getNowDo(){
super.getNowDo();
}
}
class Eat extends DogCare{
public Eat() {
setNowDo("Eat");
}
@Override
public void getNowDo(){
super.getNowDo();
}
}
class Walk extends DogCare{
public Walk() {
setNowDo("Walk");
}
@Override
public void getNowDo(){
super.getNowDo();
}
}
public class MyClass {
public static void main(String args[]) {
DogCare[] dubucare = new DogCare[3];
dubucare[0] = new Wash();
dubucare[1] = new Eat();
dubucare[2] = new Walk();
for(int i = 0; i < dubucare.length; i++){
dubucare[i].getNowDo();
}
}
}
'YJ > 관련 이론' 카테고리의 다른 글
[SOLID] DIP_의존 역전 원칙 (0) | 2022.09.25 |
---|---|
[SOLID] ISP_인터페이스 분리 원칙 (0) | 2022.09.25 |
[SOLID] LSP_리스코프 치환 원칙 (0) | 2022.09.25 |
[SOLID] SRP_단일 책임 원칙 (0) | 2022.09.24 |