Programming/Java

접근제어자

helloworld: 2021. 8. 9. 20:11

접근제어자

클래스, 멤버변수, 메서드, 생성자에 사용 -> 외부에서의 접근을 제한하는 용도

 

접근제어자별 접근 가능 범위

제어자 같은 클래스 같은 패키지 자손클래스 전체
public
protected  
default    
private      

※ protected는 패키지 관계 없이 상속관계의 자손 클래스에서 접근하도록 제한하는 것이 목적이나, 같은 패키지 내에서는 상속 관계가 아니어도 접근 가능

 

사용 가능한 접근 제어자

대상 사용 가능한 접근제어자
클래스 public, default
메서드 public, protected, default, private
멤버변수
지역변수 없다

 

접근제어자를 사용하는 이유 : 캡슐화

1. 외부로부터 데이터를 보호

2. 외부에는 불필요, 내부적으로만 사용되는 멤버변수, 메서드를 클래스 내부에 감추기 위해

 

생성자의 접근제어자 private (싱글톤)

보통 생성자의 접근제어자와 클래스의 접근제어자는 같지만 다르게 지정하는 경우도 있다. 그중 생성자의 접근제어자가 private인 경우를 보자.

 


class Singleton {

   ...

   private static Singletone s = new Singleton();

   // 생성자가 private으로 막혀있어 외부에서 인스턴스를 생성할 수 없으므로 내부적으로 인스턴스를 생성해 놓는다.

   private Singleton() { ... } // private 생성자

 

   public static Singleton getInstance() { return s; }

   // 내부적으로 생성한 인스턴스를 반환하는 메서드를 마련하여

   // 외부에서도 이 클래스의 인스턴스를 사용할 수 있도록 한다.

 

   // ※ static 사용 이유

   // 생성자가 막혀있어 (외부에서) 인스턴스 생성이 불가한 상황.

   // 외부에서 이 클래스의 인스턴스를 생성하지 않고도 호출할 수 있어야 하므로 

   ...

}


생성자가 private인 클래스는 :

1. 단 한 개의 인스턴스만 생성된다.

2. 다른 클래스의 조상이 될 수 없다. 자손 클래스에서 조상클래스의 생성자를 호출할 수 없기 때문이다.

   => 클래스 앞에 final을 추가하여 상속 불가함을 알려주는 것이 좋다.

 

 

※ 포스팅에 사용한 도서 : 남궁성의 자바의 정석 3판