Access-Modifier
1 Access Modifier
- 접근 제한자는 객체의
캡슐화를 달성하는데 사용되는 메커니즘이다. - 외부 클래스에서 접근할 수 있는 멤버와 접근 할 수 없는 멤버를 구분해서 필드, 메소드, 생성자를 설계하는 것이 바람직
- 접근 제 한자로 이러한 기능을 사용할 수 있다.
- 접근 제한자는 public, protected, default, private 4가지의 종류가 있다.
- public: 외부 클래스가 자유롭게 사용할 수 있는 멤버를 만든다.
- protected: 같은 패키지 또는 자식 클래스만 사용할 수 있는 멤버를 만든다.
- default: 같은 패키지에 속한 클래스만 사용할 수 있는 멤버를 만든다.
- private: 외부에 노출하지 않는 멤버를 만든다.
| 접근 제한 | 적용 대상 | 접근할 수 없는 클래스 |
|---|---|---|
| public | 클래스, 필드, 생성자, 메소드 | 없음 |
| protected | 필드, 생성자, 메소드 | 자식 클래스가 아닌 다른 패키지에 소속된 클래스 |
| default | 클래스, 필드, 생성자, 메소드 | 다른 패키지에 소속된 클래스 |
| private | 필드, 생성자, 메소드 | 모든 외부 클래스 |
2 클래스의 접근 제한
- 클래스를 선언할 때 고려해야 할 사항은 같은 패키지 내에서만 사용할 것인지, 아니면 다른 패키지에서도 사용할 수 있도록 할 것인지를 결정해야 한다.
- 클래스에 적용할 수 있는 접근 제한은
public과dafault단 두 가지인데, 다음과 같은 형식으로 작성한다.
// default 접근 제한
class 클래스 { ... }
// public 접근 제한
public class 클래스 { ... }
2.1 default 접근 제한
- 클 래스를 선언할 때 public을 생략했다면 클래스는 default 접근 제한을 가진다.
- 클래스가 default 접근 제한을 가지게 되면 같은 패키지에서는 아무런 제한 없이 사용할 수 있지만 다른 패키지에서는 사용할 수 없도록 제한된다.
2.2 public 접근 제한
- 클래스를 선언할 때 public 접근 제한자를 붙였다면 클래스는 public 접근 제한을 가진다.
- 클래스가 public 접근 제한을 가지게 되면 같은 패키지뿐만 아니라 다른 패키지에서도 아무런 제한 없이 사용할 수 있다.
- 인터넷에 배포되는 라이브러리 클래스는 모두 public이다.
3 생성자의 접근 제한
- 객체를 생성하기 위해서는 new 연산자로 생성자를 호출해야 한다.
- 생성자가 어떤 접근 제한을 갖느냐에 따라 호출 가능 여부가 결정된다.
| 접근 제한자 | 생성자 | 설명 |
|---|---|---|
| public | 클래스(…) | public 접근 제한은 모든 패키지에서 아무런 제한 없이 생성자를 호출할 수 있도록 한다. 클래스가 default 접근 제한을 가진다면 클래스 사용이 같은 패키지로 한정되므 로, 비록 생성자가 public 접근 제한을 가지더라도 같은 패키지에서만 생성자를 호출할 수 있다. |
| protected | 클래스(…) | protected 접근 제한은 default와 마찬가지로 같은 패키지에 속하는 클래스에서 생성자를 호출할 수 있도록 한다. 차이점은 다른 패키지에 속한 클래스가 해당 클래스의 자식 클래스라면 생성자를 호출할 수 있다. |
| default | 클래스(…) | 생성자를 선언할 때 public 또는 private를 생략했다면 생성자는 default 접근 제한을 가진다. 같은 패키지에서는 아무런 제한 없이 생성자를 호출할 수 있으나, 다른 패키지에서는 생성자를 호출할 수 없도록 한다. |
| private | 클래스(…) | 동일 패키지이건 다른 패키지이건 상관없이 생성자를 호출하지 못하도록 제한한다. 따라서 클래스 외부에서 new 연산자로 객체를 만들 수 없다. 오로지 클래스 내부에서만 생성자를 호출할 수 있고, 객체를 만들 수 있다. |
4 필드와 메소드의 접근 제한
- 필드와 메소드는 다음과 같이 public, protected, default, private 접근 제한을 가질 수 있다.
| 접근 제한자 | 생성자 | 설명 |
|---|---|---|
| public | 필드 메소드(…) | public 접근 제한은 모든 패키지에서 아무런 제한 없이 필드와 메소드를 사용할 수 있도록 해준다. 필드와 메소드가 public 접근 제한을 가질 경우 클래스도 public 접근 제한을 가져야 한다. |
| protected | 필드 메소드(…) | protected 접근 제한은 default와 마찬가지로 같은 패키지에 속하는 클래스에서 필드와 메소드를 사용할 수 있도록 한다. 차이점은 다른 패키지에 속한 클래스가 해당 클래스의 자식 클래스라면 필드와 메소드를 사용할 수 있다. |
| default | 필드 메소드(…) | 필드와 메소드를 선언할 때 public 또는 private를 생략했다면 생성자는 default 접근 제한을 가진다. 같은 패키지에서는 아무런 제한 없이 필드와 메소드를 사용할 수 있으나, 다른 패키지에서는 필드와 메소드를 사용할 수 없도록 한다. |
| private | 필드 메소드(…) | 동일 패키지이건 다른 패키지이건 상관없이 필드와 메소드를 사용하지 못하도록 제한한다. 오로지 클래스 내부에서만 사용할 수 있다. |
5 접근 제한자와 상속
- 상속을해도 부모 클래스의 모든 멤버를 물려받는 것은 아니다.
- 부모 클 래스에서 private 접근 제한자를 갖는 필드와 메소드는 상속 대상에서 제외된다
- 부모 클래스와 자식 클래스가 다른 패키지에 존재한다면 default 접근 제한자를 갖는 필드와 메소드는 상속 대상에서 제외된다.
참고
- 이것이 자바다(이상민 저)