[Java/자바] 접근제어자(Access Modifier)란?

접근 제어자는 멤버 또는 클래스에 사용하여 해당하는 멤버 또는 클래스를 외부에서 접근하지 못하도록 제한하는 역할을 합니다.

만약 멤버 또는 클래스 앞에 접근 제어자가 지정되어 있지 않다면, 접근 제어자가 default임을 뜻합니다.

주의할 점으로 하나의 소스파일(*.java)에는 public 클래스가 단 하나만 존재할 수 있으며, 소스파일의 이름은 반드시 public 클래스의 이름과 같아야 합니다.

 

접근 제어자를 사용하는 이유는 다음과 같습니다.

  1. 외부로부터 데이터를 보호하기 위해
  2. 외부에는 불필요한, 내부적으로만 사용되는, 부분을 감추기 위해
접근 제어자가 사용될 수 있는 곳
클래스 멤버변수 메서드 생성자

 

접근 제한자의 사용 범위
public : 접근 제한이 전혀 없다.
protected : 같은 패키지 내에서, 그리고 다른 패키지의 자손 클래스에서 접근이 가능
default : 같은 패키지 내에서만 접근이 가능
private : 같은 클래스 내에서만 접근이 가능

 

사용 범위를 표로 나타내면 다음과 같으며, 위에서 부터 아래로 접근 범위가 넓은 순으로 나열하였습니다.

public > protected > default > private

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

 

대상에 따라 사용할 수 있는 접근 제어자
대상 사용가능한 접근 제어자
클래스 public, ( default )
메서드 public, protected, ( default ), private
멤버변수
지역변수 없 음

 

생성자의 접근 제어자

생성자에 접근 제어자를 사용함으로써 인스턴스의 생성을 제한할 수 있습니다.

만약 생성자의 접근 제어자를 private로 지정하게 된다면, 외부에서 생성자에 접근할 수 없어 인스턴스를 생성할 수 없게 됩니다.

대신, 인스턴스를 생성해서 반환해주는 public메서드를 제공하여 외부에서 이 클래스의 인스턴스를 사용하도록 할 수 있습니다.

, 이 메서드는 인스턴스를 생성하지 않고도 호출할 수 있어야 하므로 public인 동시에 static이어야 합니다. 

 

이 예로 Math 클래스를 예로 들 수 있는데, Math 클래스는 몇 개의 상수와 static 메서드로만 구성되어 있기 때문에 인스턴스를 생성할 필요가 없습니다.

그래서 외부로부터 불필요한 접근을 막기 위해 아래 처럼 생성자의 접근 제어자를 private로 지정하였습니다.

public final class Math {
	private Math() {}
    ...
    }

 


제어자의 조합

대상에 따라 다음과 같이 제어자를 사용할 수 있습니다.

대 상 사용가능한 제어자
클래스 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인 메서드는 오버라이딩될 수 없기 때문이다. 이 둘 중 하나만 사용해도 의미가 충분하다.