본문 바로가기
독서에서 한걸음

변수 캡슐화

by oncerun 2022. 12. 4.
반응형

 

전역 변수와 같이 전역으로 사용되는 변수에 대해 고려해보자. 

 

해당 변수가 mutable 하는 특성을 갖고 전역적으로 사용된다면 많은 문제를 일으킬 가능성을 가지고 있을 수 있다. 

 

이 경우 Encapsulate Variable을 적용해 접근을 제어하거나 어디서 사용하는지 파악하기 쉽게 만들 수 있다. 

 

 

메서드를 리팩터링 하는 과정은 점진적으로 변경이 가능하지만, 데이터의 변경은 한 번에 모두 변경해야 해야 한다. 

따라서 더욱 안전하게 데이터를 다루기 위해서는 메서드 구조 변경 작업으로 대체해볼 수 있다. 

 

만약 데이터가 사용되는 범위가 커질 수록 캡슐화하는 것이 더 중요해지는데 함수를 사용해서 값을 변경하도록 하면 쉽게 검증 로직을 추가하거나 변경에 따르는 후속 작업을 추가하는 것이 편리해진다. 

 

불변 데이터는 접근이 제한되어 있고 대부분 정적 데이터이기 때문에 이러한 리팩터링 대상이 아니다.

 

public static Integer targetTemperature = 70;

public static Boolean heating = true;

public static Boolean cooling = false;

public static Boolean fahrenheit = true;

해당 변수들은 전역 데이터로 어느곳에서나 접근하여 값을 변경할 수 있다.

System.out.println(Thermostats.targetTemperature);
Thermostats.targetTemperature = -1111600;
Thermostats.fahrenheit = false;

 

따라서 이에 대한 변수의 값 설정 부분에 대해 별도의 검증을 하지 않는다면 큰 문제가 될 수 있다.

결국 검증 로직이 필요하다면 이를 메소드로 감싸는 경우가 좋다.

 

따라서 보통 접근지시어를 private으로 변경하고 getter, setter를 사용한다.

 

public class Thermostats {

    private static Integer targetTemperature = 70;

    private static Boolean heating = true;

    private static Boolean cooling = false;

    private static Boolean fahrenheit = true;

    public static Integer targetTemperature() {
        return targetTemperature;
    }

    public static void setTargetTemperature(Integer targetTemperature) {
        Thermostats.targetTemperature = targetTemperature;
    }

    public static Boolean heating() {
        return heating;
    }

    public static void setHeating(Boolean heating) {
        Thermostats.heating = heating;
    }

    public static Boolean cooling() {
        return cooling;
    }

    public static void setCooling(Boolean cooling) {
        Thermostats.cooling = cooling;
    }

    public static Boolean fahrenheit() {
        return fahrenheit;
    }

    public static void setFahrenheit(Boolean fahrenheit) {
        Thermostats.fahrenheit = fahrenheit;
    }
}

 

 

캡슐화의 장점을 가져갈 수 있다는 것은 기존 전역 데이터 필드로 노출하는 것보다 많은 장점이 존재한다. 

 

애플리케이션마다 지켜야하는 검증 로직이 있을 수 있고, 기능을 쉽게 추가할 수도 있고

오류의 범위를 해당 클래스 내부로 한정시킬 수도 있다. 

 

그래서 만약 정적 가변 데이터를 제공해야 한다면 캡슐화를 하는 것을 추천한다.

 

반응형

'독서에서 한걸음' 카테고리의 다른 글

Separate Query from Modifier && Remove Setting Method  (0) 2022.12.10
Split Variable  (0) 2022.12.05
긴 매개변수 목록  (0) 2022.12.04
긴 함수 (2)  (0) 2022.12.02
긴 함수 (1)  (0) 2022.12.02

댓글