728x90
반응형
SMALL

개방-폐쇄 원칙

Open-Closed Principle, OCP

“소프트웨어 엔티티(클래스, 모듈, 함수 등)는 확장에 대해서는 열려 있어야 하지만 변경에 대해서는 닫혀 있어야 한다.” - 로버트 C. 마틴

'자신의 확장에는 열려 있고, 주변의 변화에 대해서는 닫혀 있어야 한다'

Java의 Database 연결

Java에는 데이터베이스에 접속할 수 있도록 도와주는 JDBC 라는 API 가 존재합니다.

이 JDBC 를 개방-폐쇄 원칙의 예로 들 수 있습니다.

개발을 할 때 우리는 Oracle, MySQL 등 다양한 데이터베이스를 사용하게 됩니다.

이때 만약 개발이 진행되는 과정에서 데이터베이스를 변경하게 된다고 하더라도 우리가 그동안 개발하던 코드를 전부 수정할 필요는 없습니다.

연결할 때 필요한 ID, PWD, URL 등의 설정을 담당하는 부분만 변경하면 쉽게 데이터베이스를 변경할 수 있습니다.

개방-폐쇄 원칙을 위반한 계산기

원칙 위반 증상

기능 확장을 할 때마다 기존코드를 수정해야 합니다.if else 블록이 자주 등장합니다.기능 확장을 위한 코드 수정을 할 때 여러 클래스에서 다발적으로 진행이 됩니다.

public class Calculator {
    private AddOperation addOperation;
    private SubstractOperation substractOperation;
    private MultiplyOperation multiplyOperation;
    private DivideOperation divideOperation;

    public Calculator(AddOperation addOperation, SubstractOperation substractOperation, MultiplyOperation multiplyOperation, DivideOperation divideOperation) {
        this.addOperation = addOperation;
        this.substractOperation = substractOperation;
        this.multiplyOperation = multiplyOperation;
        this.divideOperation = divideOperation;
    }

    public int add(int firstNumber, int secondNumber){
        return addOperation.operate(firstNumber, secondNumber);
    }

    public int substract(int firstNumber, int secondNumber){
        return substractOperation.operate(firstNumber, secondNumber);
    }

    public int multiply(int firstNumber, int secondNumber){
        return multiplyOperation.operate(firstNumber, secondNumber);
    }

    public int divide(int firstNumber, int secondNumber){
        return divideOperation.operate(firstNumber, secondNumber);
    }
}
public class Client {
    public static void main(String[] args) {
        Calculator calculator = new Calculator(
                new AddOperation(),
                new SubstractOperation(),
                new MultiplyOperation(),
                new DivideOperation()
        );

        int firNum = 140;
        int secNum = 60;

        int answer = calculator.add(firNum, secNum);
        System.out.println(" + answer = " + answer);

        answer = calculator.substract(firNum, secNum);
        System.out.println(" - answer = " + answer);

        answer = calculator.multiply(firNum, secNum);
        System.out.println(" * answer = " + answer);

        answer = calculator.divide(firNum, secNum);
        System.out.println(" / answer = " + answer);
    }
}
public class AddOperation {
    public int operate(int firstNumber, int secondNumber){
        return firstNumber + secondNumber;
    }
}
public class SubstractOperation {
    public int operate(int firstNumber, int secondNumber){
        return firstNumber - secondNumber;
    }
}
public class MultiplyOperation {
    public int operate(int firstNumber, int secondNumber){
        return firstNumber * secondNumber;
    }
}
public class DivideOperation {
    public int operate(int firstNumber, int secondNumber){
        return firstNumber / secondNumber;
    }
}

연산자를 추가하려고 할 때 코드의 변화가 너무 많이 일어납니다.

if else 조건문 블록이 존재하며 연산자 추가 시 코드변화가 빈번하게 일어납니다.

원칙 적용 방법

변화되는 부분을 추상화해서 변화를 고정 시킵니다.

기능이 추가될 때 클래스의 상속을 통해서 하위 클래스에서 기능을 구현 하도록 합니다.

기존코드를 수정하지 않아도 객체 상속의 다형성 원리에 의해 기능이 확장 되도록 합니다.

연산 클래스는 추상화된 부모 클래스를 상속받아 기능별로 구현합니다.

AbstractOperation : 추상 클래스operate : 추상 메서드

728x90
반응형
LIST

'개발 > JAVA' 카테고리의 다른 글

인터페이스 분리 원칙  (0) 2023.01.27
리스코프 치환 원칙  (0) 2023.01.27
단일 책임 원칙  (0) 2023.01.27
SOLID  (0) 2023.01.27
변수의 종류  (0) 2023.01.20

+ Recent posts