본문 바로가기
객체지향

객체지향 설계란? - 2. OCP

by 근즈리얼 2021. 12. 19.
728x90

이번 포스팅에서는 OCP 규칙에 대해서 포스팅해보겠습니다.


OCP(Open Closed Principle) : 개방 폐쇄 원칙

 

소프트웨어 객체는 확장에는 열려있고, 수정에는 닫혀있다는 한다는 프로그래밍 원칙입니다.

 

프로그래밍을 진행할 때 수정할 때 한 객체를 수정해야 하는 상황이 발생한다면 그 객체를 이용하는 다른 객체들을 줄줄이 수정해야 하는 일이 발생할 수 있습니다.

따라서, 개방 폐쇄 원칙을 잘 지키게 된다면 기능을 추가하거나 수정할 때 기존의 코드를 수정하지 않고, 새로운 코드를 추가함으로써 기능의 추가나 수정을 완성할 수 있습니다.

 

말로만 하면 이해하기 어려우니 간단한 코드로 알아보겠습니다!

 

Tiger 클래스입니다.

public class Tiger {

    public String name;
    public int age;

    public void eat(String meat){
        System.out.println(meat + " 맛있당~!");
    }

    public void yell(){
        System.out.println("어흥");
    }
}

 

Zoo 클래스입니다.

public class Zoo {

    public void eat(Tiger tiger){
        tiger.eat("고기");
    }

    public void yell(Tiger tiger){
        tiger.yell();
    }
}

- Tiger는 먹기와 소리치기 기능을 갖고 있습니다.

- 제가 볼때는 충분히 잘 완성된 코드 같은데... 뭔가 부족한 점이 있을까요??

- 만약 여기에 Lion 클래스를 만들고 동물원에 Lion에게 먹을 것을 주고 소리를 치게 하고 싶으면 어떻게 해야 할까요?

- 아마도 Zoo 클래스안에 Tiger를 Lion으로 바꿔야 할 것입니다.

- 이러면 Lion을 추가하고 싶은데 기존의 코드를 수정하게 되었네요,..... 어떻게 하면 좋을까요??

 

다른 코드를 한번 봐볼게요

Animal 인터페이스입니다.

public interface Animal {

    public void eat(String meat);
    public void yell();
}

Tiger 클래스와 Lion는 Animal 인터페이스를 상속하고 있습니다.

 

바뀐 Zoo 클래스입니다.

public class Zoo {

    public void eat(Animal animal){
        animal.eat("고기");
    }

    public void yell(Animal animal){
        animal.yell();
    }
}

마지막으로 main 클래스가 있는 StartApplication 클래스입니다.

public class StartApplication {

    public static void main(String[] args) {
        Zoo zoo = new Zoo();
        Animal lion = new Lion();
        Animal tiger = new Tiger();
        zoo.yell(lion);
        zoo.yell(tiger);
    }
}

- lion과 tiger를 불러서 각각 yell 메소드를 호출했지만 Zoo 클래스안에서는 코드의 수정이 발생하지 않았습니다.

- 즉, ocp원칙을 잘 지켜서 Lion 객체가 새롭게 만들어졌지만 기존의 코드의 추가를 했지만 수정하지는 않았습니다.

 


마무리

- ocp 원칙을 잘 지킨다면 기능의 확장에 아주 용이하다고 생각합니다.

- 나중에 코드의 확장을 위해서라도 프로그램을 설계할 때 ocp 원칙을 지키는 것은 중요하다고 생각합니다.

- 이제 solid원칙의 두번째 원칙까지 정리했으니 다음번에는 세번째(LSP)에서 만날게요~!

728x90

댓글