Sam Story

JAVA - 개방 폐쇄 원칙 본문

JAVA

JAVA - 개방 폐쇄 원칙

Sam H 2024. 10. 14. 17:22

지난번 포스팅에 이어 오늘은 개방 폐쇄 원칙에 대해 포스팅 하겠다.

 

객체지향 프로그래밍의 5가지 원칙 SOLID 원칙에 대한 내용은 아래 포스팅 참고

 

https://samtistory.tistory.com/49

 

객체지향 프로그래밍 SOLID 원칙

지난번 포스팅 했던 객체지향 프로그래밍에 이어서객체지향 프로그래밍의 5가지 원칙 SOLID 원칙에 대해 포스팅 하려한다.  SOLID 원칙 이란? SOLID란 객체 지향 프로그래밍을 하면서 지켜야하

samtistory.tistory.com

 

 

개방-폐쇄 원칙 (OCP)

개방-폐쇄 원칙은 클래스는 확장에 열려있어야 하며, 수정에는 닫혀있어야 한다를 뜻한다.

 

기능 추가 요청이 오면 클래스를 확장을 통해 쉽게 구현하면서,

확장에 따른 클래스 수정은 최소화 하도록 프로그램을 작성해야 하는 설계 기법이다.

 

- 확장에 열려있다

새로운 변경 사항이 발생했을 때 유연하게 코드를 추가함으로써

애플리케이션의 기능을 큰 힘을 들이지 않고 확장할 수 있다.

- 변경에 닫혀있다

새로운 변경 사항이 발생했을 때 객체를 직접적으로 수정해야 한다면

새로운 변경사항에 대해 유연하게 대응할 수 없는 애플리케이션이라고 말한다.
이는 유지보수의 비용 증가로 이어지는 매우 안좋은 예시이다.

 

그림으로 간단하게 알아보자면

 

위 그림을 보면 알다시피

개방 폐쇄의 원칙은 추상화를 이용하여 간단히 나타낼 수 있다.

 

코드를 보며 잘못된 예시와 그를 수정한 예시를 보도록 하자.

 

 

 

Exercise class & PlayExercise class

public class Exercise {

    String exerciseName;

    // 생성자
    public Exercise(String exerciseName) {

        this.exerciseName = exerciseName;

    }


}

public class PlayExercise {

    // 기능 자체에는 문제가 없다.
    // 운동이 점점 늘어나게 될 수록 분기점이 계속 늘어나게 되고 계속 수정해줘야함.
    void play(Exercise exercise) {

        if(exercise.exerciseName.equals("스쿼트")) {

            System.out.println("스쿼트를 합니다.");

        } else if(exercise.exerciseName.equals("푸시업")) {

            System.out.println("푸시업을 합니다.");

        } else if(exercise.exerciseName.equals("런지")) {

            System.out.println("런지를 합니다.");

        }

    }

}

 

 

Main class

public class Main {
    public static void main(String[] args) {

        Exercise squat = new Exercise("스쿼트");
        Exercise pushUp = new Exercise("푸시업");
        Exercise lunge = new Exercise("런지");

        PlayExercise playExercise = new PlayExercise();

        playExercise.play(squat);
        playExercise.play(pushUp);
        playExercise.play(lunge);

    }
}

 

 

 

이렇게 코드를 짜고 실행하면 정상적으로 작동하는 결과를 볼 수 있다.

 

 

하지만 이렇게 작성할 경우 playExercise class 에서 작성한 주석대로

운동의 종류가 늘어나게 되면 playExercise class 에 play 메서드 분기점을 늘려줘야 되면서

수정을 해야하고, 코드 가독성 또한 상당히 떨어지게 된다.

 

이렇게 작성한 코드는 처음 설계가 잘못되었다는걸 보여주는 예시이다.

 

그렇다면 어떤식으로 작성해야 개방 폐쇄 원칙을 지킨것 일까

같은 내용에 새로운 class로 아래 새로운 예시를 보도록 하자.

 

Exercise2 class

public abstract class Exercise2 { // 추상클래스로 구현

    // 추상 메서드
    public abstract void play();

}

 

 

Squat class , PushUp class , Lunge class

public class Squat extends Exercise2{

    @Override
    public void play() {

        System.out.println("스쿼트를 합니다.");

    }

}

public class PushUp extends Exercise2{

    @Override
    public void play() {

        System.out.println("푸시업을 합니다.");

    }

}

public class Lunge extends Exercise2{

    @Override
    public void play() {

        System.out.println("런지를 합니다.");

    }

}

 

각각 새로운 운동명들로 클래스를 만들고 Exercise2 class를 상속받아

play 메서드를 override 해준다.

 

 

Main2 class

public class Main2 {
    public static void main(String[] args) {

        Exercise2 squat = new Squat();
        Exercise2 pushUp = new PushUp();
        Exercise2 lunge = new Lunge();

        squat.play();
        pushUp.play();
        lunge.play();

    }
}

 

 

실행결과

 

 

위에 코드처럼 수정하게 되면 각 운동별로 운동 내용이 수정되기도 굉장히 간단하며

운동 종류가 늘어날 경우 새로운 class를 만들어서 늘려주면 되기 때문에

 

개방 - 폐쇄 원칙을 지키며 작성한 코드라고 할 수 있다.

 

 

프로젝트를 진행하기 전 설계하는 부분에 있어서 이러한 원칙을 준수해야

나중을 위해서라도 훨씬 유리하다는걸 알게되는 내용이다. 

'JAVA' 카테고리의 다른 글

JAVA - 인터페이스 분리 원칙  (1) 2024.10.16
JAVA - 리스코프 치환 원칙  (0) 2024.10.15
JAVA - 단일 책임의 원칙  (1) 2024.10.12
JAVA - 2~36진수 기수변환  (0) 2024.09.29
JAVA - 자료구조 Map  (4) 2024.09.21