필드 자체 캡슐화

필드에 직접 접근하던 중 그 필드로의 결합에 문제가 생길 땐,
그 필드용 읽기/쓰기 메서드를 작성해서 두 메서드를 통해서만 필드에 접근하게 만들자

동기

  • 변수 직접 접근파 VS 변수 간접 접근파
    • 직접 접근파 : 변수가 정의되어 있는 클래스 안에서는 변수에 자유롭게 접근할 수 있어야 한다
    • 간접 접근파 : 클래스 안에서라도 반드시 접근 메서드를 통해서만 접근 가능해야 한다
  • 직접 접근의 장점
    • 코드를 알아보기 쉽다
  • 간접 접근의 장점
    • 하위 클래스에서 해당 속성을 가져오는 방식을 재정의 할 수 있다(getter override)
    • 속성 초기화를 사용 시점으로 미룰 수 있다
  • 처음에는 직접 접근을 사용하다가 이상한 점이 생길 때 간접 접근으로 바꾸는게 좋다
    • 상위 클래스의 변수를 하위 클래스에서 계산된 값으로 재정의 해야한다거나
    • 사용하는 시점에 속성을 초기화하고 싶다거나
    • 등등등

방법

  1. 필드의 읽기 메서드와 쓰기 메서드를 작성한다
  2. 필드를 참조하는 부분을 전부 찾아서 읽기 메서드와 쓰기 메서드로 고친다
  3. 필드를 private으로 만든다

예시

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class SomeClass {
private int a;
private int b;
private int c;

public void doSomething() {
setC(getA() + getB());
}

public int returnSomething(boolean flag) {
if(flag) {
return getA() + getB();
}

return getC();
}
}

필드 자체 캡슐화를 할 때는 생성자 안에 쓰기 메서드를 사용하는 것을 주의해야한다
대체로 쓰기 메서드는 객체가 생성된후에 사용하므로, 쓰기 메서드에 초기화 시점과 다른 기능이 추가됐을 수 있다고 전제하는 경우가 많기 때문이다

참고 : 마틴 파울러, 『리팩토링』, 김지원 옮김, 한빛미디어(2012)