본문 바로가기
자바

캡슐화

by 이상한나라의개발자 2023. 12. 11.

지난 시간에 이어 아래 코드를 확인해 보도록 하겠습니다.  

아래 코드에서 CalculateCommnad는 CalculateType, num1, num2 를 가지고 있습니다. 만약 해당 필드가 삭제가 된다면 getter 메서드도 함께 제거 되어야 하며 Client 코드 및 CalculateCommand를 사용 하는 기타 코드들도 변경이 이루어 져야 합니다.

이는 결합도가 높은 코드라 볼 수 있으며 필드 따로 계산로직 따로 사용하기 때문에 응집도가 낮다고할 수 있습니다.

 

CalculateCommand를 너무 잘 아는 Clinet 

 

객체 지향적인 코드는 결합도는 낮고 응집도는 높은 코드입니다. 

 

public class Client {
    public int someMethod(CalculateCommand calculateCommand) {
        CalculateType calculateType = calculateCommand.getCalculateType();
        int num1 = calculateCommand.getNum1();
        int num2 = calculateCommand.getNum2();

        int result = calculateType.calculate(num1, num2);

        return result;
    }
}

 

 

public class CalculateCommand {
    private CalculateType calculateType;
    private int num1;
    private int num2;

    public CalculateCommand(CalculateType calculateType, int num1, int num2) {
        if(calculateType == null) {
            throw new RuntimeException("CalculateType은 필수 값 입니다.");
        }

        if(calculateType.equals(CalculateType.DIVIDE) && num2 == 0) {
            throw new RuntimeException("0으로 나눌 수 없습니다.");
        }

        this.calculateType = calculateType;
        this.num1 = num1;
        this.num2 = num2;
    }

    public CalculateType getCalculateType() {
        return calculateType;
    }

    public int getNum1() {
        return num1;
    }

    public int getNum2() {
        return num2;
    }
}

 

 

아래 코드에서 좀더 캡슐화된 코드를 작성해 보도록 하겠습니다. 모든 필드는 private로 만들고 공개 하고 싶은 메서드만 public로 외부에 공개 합니다. 아래 코드는 결합도는 낮추고 응집도는 높였습니다.

 

public class Client {
    public int someMethod(CalculateCommand calculateCommand) {
        int result = calculateCommand.getCalculateResult();
        return result;
    }
}

 

 

public class CalculateCommand {
    private CalculateType calculateType;
    private int num1;
    private int num2;

    public CalculateCommand(CalculateType calculateType, int num1, int num2) {
        if(calculateType == null) {
            throw new RuntimeException("CalculateType은 필수 값 입니다.");
        }

        if(calculateType.equals(CalculateType.DIVIDE) && num2 == 0) {
            throw new RuntimeException("0으로 나눌 수 없습니다.");
        }

        this.calculateType = calculateType;
        this.num1 = num1;
        this.num2 = num2;
    }

    public int getCalculateResult() {
        CalculateType calculateType = this.calculateType;
        int num1 = this.num1;
        int num2 = this.num2;

        int result = calculateType.calculate(num1, num2);

        return result;
    }
}

 

 

기술적인 문제로 필드에 getter가 필요한 경우

 

 

'자바' 카테고리의 다른 글

Object Class  (1) 2023.12.11
예외  (0) 2023.12.11
추상클래스와 인터페이스  (0) 2023.12.11
상속과 다형성 기본  (0) 2023.12.11
객체지향적으로 개발해야 하는 이유  (0) 2023.12.11