캡슐화(Encapsulation)

1 minute read

캡슐화(encapsulation)

  • 클래스를 작성한 사람의 의도와 다르게 사용하지 못하도록 하는 것이 캡슐화다.
  • 필드나 메서드의 외부 접근 범위를 조정하는 문법이다.

  • 직접 값에 엑세스 할 수 없어도 이 값을 조회할 수 있는 메서드를 통해서 값을 알아낼 수 있다.
  • 메서드의 용도를 이해하기 쉽도록 get으로 시작한다.
  • 메서드의 이름이 get으로 시작한다고 해서 게터(getter)라고 부른다. 이런 게터는 공개 모드로 설정한다.(public을 붙인다.)

  • 필드의 값을 변경할때마다 뭔가를 해야하는 경우 해당 필드에 직접적으로 엑세스 하는 것을 막는다.
  • 대신 메서드를 통해 필드의 값을 설정하게 한다.
  • 이러한 메서드를 세터(setter) 라고 한다. 이런 세터는 공개 모드로 설정한다.(public을 붙인다.)
  • 필드를 비공개로 막으면 값을 조회할 수 없기 때문에 게터를 추가해야 한다.

  • 직접 접근해도 되는 것도 프로그램의 일관성을 위해 세터나 게터로 만든다.
  • 필드는 프라이빗으로 막고 그 필드의 값을 쓸 때는 게터나 세터를 사용해 엑세스한다.
  • 게터나 세터는 프로퍼티(property)라 부른다.

캡슐화의 필요성

  • 인스턴스의 변수에 추상화 목적에 맞는 유효한 값만 넣을 수 있도록 외부 접근을 제한할 수 있다.
  • 세터 메소드에서 값이 유효한지 아닌지 검사할 수 있다.(실무에서는 잘 사용하지 않는다.)
  • 게터, 세터를 사용하면 확장성을 고려한 코딩이 된다.

접근 제어

  • 4개 방법이 있다.
    • private : 같은 클래스 안에서만 접근 가능
    • (default) : 같은 클래스 + 같은 패키지 소속
    • protected : 같은 클래스 + 같은 패키지 + 서브 클래스로 만든 변수인 경우 서브 클래스에서 접근 가능
    • public : 모두
  • private로 제한해도 중첩 클래스(nested class)인 경우에는 접근 가능하다.(같은 클래스이기 때문에)
  • protected는 자식 클래스이면서 자식 클래스로 만든 변수(자기 변수)일 경우 자식 클래스에서 접근 가능하다. 즉, 수퍼 클래스의 설계도로 만든 변수는 접근이 불가능하다.

Factory method 설계 방법

  • 생성자를 private로 만들면 인스턴스를 생성할 수 없다.
  • 개발자가 직접 인스턴스를 만들어 초기화 시키는 과정이 너무 복잡할 경우 다른 메서드를 통해 인스턴스를 생성한다.
  • creat() 메서드는 호출할 때 마다 인스턴스를 만들어 준다.
  • 대표적인 예가 캘린더 클래스이다.
  • 캘린더는 이 클래스의 인스턴스를 만들 수 있도록 스태틱 매서드를 제공한다. 그 메서드는 외부에서 호출할 수 있도록 public으로 되어있다.
 protected Calendar(TimeZone zone, Locale aLocale)
    {
        fields = new int[FIELD_COUNT];
        isSet = new boolean[FIELD_COUNT];
        stamp = new int[FIELD_COUNT];

        this.zone = zone;
        setWeekCountData(aLocale);
    }

 public static Calendar getInstance()
    {
        Locale aLocale = Locale.getDefault(Locale.Category.FORMAT);
        return createCalendar(defaultTimeZone(aLocale), aLocale);
    }

----- ----- ----- ----- 

Calendar cal1 = Calendar.getInstance();
Calendar cal2 = Calendar.getInstance();
  • 생성자를 protected로 감추고 getInstance()를 public으로 공개하였다.
  • cal1과 cal2의 getInstance() 리턴 값을 비교해보면 서로 다르다는 것을 알 수 있다. 즉, getInstance()는 호출할 때 마다 다른 인스턴스를 만든다.

Categories:

Updated: