Notice
Recent Posts
Recent Comments
Link
«   2025/08   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31
Archives
Today
Total
관리 메뉴

코딩로그

[SOLID] OCP_개방 폐쇄 원칙 본문

YJ/관련 이론

[SOLID] OCP_개방 폐쇄 원칙

Team DAON 2022. 9. 24. 01:56

[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