본문 바로가기

Programming/JAVA

자바의 접근 제한자

1. 접근 제한자(Access Modifier)

:  객체 생성을 막기 위해 생성자를 호출하지 못하게 하거나 객체의 특정 데이터를 보호하기 위해 해당 필드에 접근하지 못하도록 막아야 한다. 그리고 특정 메소드를 호출할 수 없도록 제한할 필요가 있는데 이러한 기능을 구현하기 위해 자바는 접근 제한자를 제공한다.

 

접근 제한자 적용 대상 접근할 수 없는 클래스
public 클래스, 필드, 생성자, 메소드 없음
protected 필드, 생성자, 메소드 자식 클래스가 아닌 다른 패키지에 소속된 클래스
default 클래스, 필드, 생성자, 메소드 다른 패키지에 소속된 클래스
private 필드, 생성자, 메소드 모든 외부 클래스

private > default > protected > public

 

 

2. 클래스의 접근 제한

: 같은 패키지 내에서만 사용할 것인지, 아니면 다른 패키지에서도 사용할 수 있도록 할 것인지를 결정해야 한다. 클래스에 적용할 수 있는 접근 제한은 public과 default 두 가지 이다.

 

 

-default 접근 제한

: 클래스 선언 시 public을 생략했다면 클래스는 default 접근 제한을 가진다. default 접근 제한을 가지게 되면 같은 패키지에서는 아무런 제한 없이 사용할 수 있지만 다른 패키지에서는 사용할 수 없도록 제한된다.

 

-public 접근 제한

: 같은 패키지뿐만 아니라 다른 패키지에서도 아무런 제한 없이 사용할 수 있다.

 

 

3. 생성자의 접근 제한

: 생성자의 호출 가능 여부를 접근 제한자에 따라 결정된다.

 

public class ClassName {
    // public 접근 제한
    public ClassName(...) { ... }
    
    // protected 접근 제한
    protected ClassName(...) { ... }
    
    // default 접근 제한
    ClassName(...) { ... }
    
    // public 접근 제한
    public ClassName(...) { ...}
}

 

접근 제한자 생성자 설명
public 클래스(...) 모든 패키지에서 아무런 제한 없이 생성자를 호출할 수 있도록 한다. 
protected 클래스(...) 같은 패키지에 속하는 클래스에서 생성자를 호출할 수 있다. default와 차이점은 다른 패키지에 속한 클래스가 해당 클래스의 자식(child) 클래스라면 자식을 호출 가능하다.
default 클래스(...) 생성자 선언 시 public 또는 private를 생략했다면 default 접근 제한을 가진다. 아무런 제한 없이 생성자를 호출할 수 있으나, 다른 패키지에서는 생성자를 호출할 수 없다.
private 클래스(...) 동일 패키지이건 다른 패키지이건 상관없이 생성자를 호출하지 못하도록 제한한다. 따라서 클래스 외부에서 new 연산자로 객체를 만들 수 없다. 오로지 클래스 내부에서만 생성자를 호출할 수 있고, 객체를 만들 수 있다.

 

 

4. 필드와 메소드의 접근 제한

: 클래스 내부에서만 사용할 것인지, 패키지 내에서만 사용할 것인지 아니면 다른 패키지에서도 사용할 수 있도록 결정해야하는데 이것은 어떤 접근 제한을 갖느냐에 따라 결정된다.

 

접근 제한자 생성자 설명
public 필드      메소드(...) 모든 패키지에서 아무런 제한 없이 필드와 메소드를 사용할 수 있도록 해준다.
protected 필드      메소드(...) 같은 패키지에 속하는 클래스에서 필드와 메소드를 사용할 수 있도록 한다. 
default 필드      메소드(...) 같은 패키지에서는 아무런 제한 없이 필드와 메소드를 사용할 수 있으나, 다른 패키지에서는 필드와 메소드를 사용할 수 없도록 한다.
private 필드      메소드(...) 오로지 클래스 내부에서만 사용할 수 있다.

 

 

 

 

 

 

 

 

 

 

 

 

'Programming > JAVA' 카테고리의 다른 글

자바의 추상 클래스  (0) 2020.01.07
자바 상속의 개념  (0) 2020.01.03
자바의 클래스  (0) 2019.12.27
자바의 참조 타입과 배열  (0) 2019.12.23
BufferedReader, BufferedWriter를 이용한 빠른 입출력  (0) 2019.12.20