본문으로 건너뛰기

Access-Modifier

1 Access Modifier

  • 접근 제한자는 객체의 캡슐화를 달성하는데 사용되는 메커니즘이다.
  • 외부 클래스에서 접근할 수 있는 멤버와 접근 할 수 없는 멤버를 구분해서 필드, 메소드, 생성자를 설계하는 것이 바람직
  • 접근 제한자로 이러한 기능을 사용할 수 있다.
  • 접근 제한자는 public, protected, default, private 4가지의 종류가 있다.
    • public: 외부 클래스가 자유롭게 사용할 수 있는 멤버를 만든다.
    • protected: 같은 패키지 또는 자식 클래스만 사용할 수 있는 멤버를 만든다.
    • default: 같은 패키지에 속한 클래스만 사용할 수 있는 멤버를 만든다.
    • private: 외부에 노출하지 않는 멤버를 만든다.
접근 제한적용 대상접근할 수 없는 클래스
public클래스, 필드, 생성자, 메소드없음
protected필드, 생성자, 메소드자식 클래스가 아닌 다른 패키지에 소속된 클래스
default클래스, 필드, 생성자, 메소드다른 패키지에 소속된 클래스
private필드, 생성자, 메소드모든 외부 클래스

2 클래스의 접근 제한

  • 클래스를 선언할 때 고려해야 할 사항은 같은 패키지 내에서만 사용할 것인지, 아니면 다른 패키지에서도 사용할 수 있도록 할 것인지를 결정해야 한다.
  • 클래스에 적용할 수 있는 접근 제한은 publicdafault 단 두 가지인데, 다음과 같은 형식으로 작성한다.
// 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 접근 제한자를 갖는 필드와 메소드는 상속 대상에서 제외된다.

참고

  • 이것이 자바다(이상민 저)