Encapsulation
GOALS:
- Encapsulation의 핵심 개념과 목적을 이해하고 설명할 수 있다.
- Package의 개념과 import문이 어떻게 사용되는 지 이해할 수 있다.
- Java에서
encapsulation
을 달성하기 위해 사용하는 수단으로 접근 제어자 네 가지를 이해하고, 각각의 접근 범위를 설명할 수 있다. - 데이터를 효과적으로 보호하기 위한 수단으로
getter/setter
method를 이해하고 사용할 수 있다.
먼저, Encapsulation은 특정 객체 안에 관련된 속성과 기능을 하나의 capsule로 만드는 것이다.
이는 크게 두 가지 목적이 있는데,
첫 째는 데이터 보호의 목적이고, 두번째로 내부적으로만 사용되는 데이터를 불필요하게 외부 노출하지 않게끔 하기 위함이다.
그래서 장점 중 제일은 data hiding에 있다.
그렇다면 encapsulation을 자바에서 하기 위해 어떻게 해야할까?
자바에서 encapsulation의 수단으로 접근제어자(Access Modifier)와 getter/setter
method가 있다.
먼저 앞서 말한 내용을 익히기 전에 package의 개념을 알고 가야한다.
Package는 특정한 목적을 공유하는 클래스와 인터페이스의 묶음을 의미한다.
예를 들어 우리가 폴더를 정리할 때 관련된 것들끼리 구분해서 관리하는 것처럼,
자바에선 클래스들을 그룹 단위로 묶어 효과적으로 관리하는 목적이다.
물론 package 또한 물리적인 디렉터리가 있고, 그 안에 클래스 파일(들)이 있다.
자바 클래스 파일이 package에 있는 경우에는 소스 코드 첫 줄에
package 패키지 이름;
이 선언이 있어야 한다.
이렇게 다른 사람이 packaging 해놓은 것을 우리는 import해서 사용한다.
결국 import를 하는 목적은 다른 사람이 만들어 놓은 다른 package 내의 클래스를 사용하기 위함이다.
아 물론 내가 만들어서 import해도 된다.
제어자(Modifier)
Modifier는 클래스, 필드, 메서드, constructor 등에 부가적인 의미를 주기위한 키워드이다.
접근 제어자 | public, protected, (default), private |
---|---|
기타 제어자 | static, final, abstract, native, transient, synchronized 등 |
접근 제어자 | 접근 제한 범위 |
---|---|
public | 접근 제한 없음 |
protected | 동일 패키지 + 다른 패키지의 하위 클래스에서 접근 가능 |
default | 동일 패키지 내에서만 접근 가능 |
private | 동일 클래스에서만 접근 가능 |
자바에서 modifier는 크게 접근 제어자와 기타 제어자로 구분할 수 있다.
접근 제어자는 클래스에 사용하며 클래스 외부로의 불필요한 데이터 노출을 방지할 수 있고,
데이터가 외부로부터 변경되지 않도록 막을 수 있다. 접근 제어자를 사용하여 클래스의 접근 제한 범위를 건다.
getter
와 setter
method
앞서 접근 제어자를 통하여 데이터가 외부로부터 변경되지 않도록 막을 수 있다고 하였다.
보통 접근 제어자 private
을 사용하여 해당 클래스에서만 데이터 노출을 허락하는데
private
을 사용하면 외부 클래스에선 접근하지 못하기 때문에 데이터를 읽거나 수정할 수 있는 방법이 필요하다.
이때 getter
와 setter
method를 사용한다.
위와 같은 코드를 예시로 보자면
우리는 Worker 클래스를 이용하여 인스턴스 변수를 생성하여 해당 인스턴스에 나이, 이름, ID 등을 설정해서 읽어오고 싶은데,
Worker 클래스에선 변수들이 private으로 되어 있기에
해당 인스턴스에 setName, getName, setAge, getAge 등을 사용하여 데이터를 수정하고 사용하여야 한다.
이렇게까지 데이터를 보호하면서 setter
와 getter
를 사용하는 이유는 먼저 객체지향에 있고,
그리고 변수를 private
으로 감싸지 않으면 다른 코드에서 동일하게 접근했다면 데이터의 reliable을 보장받을 수 없기 때문이다.