1. 접근제어자
- 접근제어자는 멤버 또는 클래스에 사용되어 해당하는 멤버 또는 클래스를 외부에서 접근하지 못하도록 제한하는 역할을 함
- 접근제어자는 생략가능하며 생략했을 때는 자동으로 default
임을 뜻하게 된다. 따라서 default
일경우에는 접근제어자를 지정하지 않는다.
- 접근제어자가 사용될 수 있는 곳 : 클래스, 멤버변수, 메서드, 생성자
1) private
: 같은 클래스 내에서만 접근 가능
2) default
: 같은 패키지 내에서만 접근 가능
3) protected
: 같은 패키지 내에서, 그리고 다른 패키지의 자손 클래스에서 접근 가능
4) public
: 접근 제한이 전혀 없다.
제어자 |
같은 클래스 |
같은 패키지 |
자손 클래스 | 전체 |
public |
|
|
|
|
protected |
|
|
|
|
default |
|
|
|
|
private |
|
|
|
|
- 접근 범위 : private
< default
< protected
< public
순으로 보다 많은 접근을 허용한다
대상 |
사용가능한 접근 제어자 |
클래스 |
public, (default) |
메서드 |
public, protected, (default), private |
멤버변수 |
|
지역변수 |
없음 |
2. 접근 제어자를 이용한 캡슐화
- 접근 제어자를 사용하는 이유는 클래스의 내부에 선언된 데이터를 보호하기 위해서이다. 데이터가 유효한 값을 유지하도록 또는 비밀번호와 같은 데이터를 외부에서 함부로 변경하지 못하도록 하기 위해서는 외부로부터의 접근을 제한하는 것이 필요하다
- 이것을 데이터 감추기라고 하며 객체지향개념에선 캡슐화(encapsulation)이라 한다.
3. 제어자의 조합
- 대상에 따라 사용할 수 있는 제어자
대상 | 사용가능한 접근 제어자 |
클래스 | public, (default), final, abstract |
메서드 | 모든 접근제어자, final, abstract, static |
멤버변수 | 모든 접근제어자, final, static |
지역변수 | final |
- 제어자 조합해서 사용할 때 주의할 사항
1) 메서드에static
과 abstract
를 함께 사용할 수 없다. :
static
메서드는 몸통이 있는 메서드에만 사용할 수 있기 때문2) 클래스에
abstract
와 final
을 동시에 사용할 수 없다.:클래스에 사용되는
final
은 클래스를 확장할 수 없다는 의미이고, abstract
는 상속을 통해서 완성되어야 한다는 의미이므로 서로 모순되기 때문이다.3)
abstract
메서드의 접근 제어자가 private일 수 없다.:
abstract
메서드는 자손클래스에서 구현하기 위해 접근해야 하기 때문이다.4) 메서드에 private와
final
을 같이 사용할 필요는 없다: 접근 제어자가 private인 메서드는 오버라이딩될 수 없기 때문이다. 이 둘 중 하나만 사용해도 의미가 충분하다.