본문 바로가기
Computer Science/Java

접근 제어자

by eunnnn 2023. 4. 10.

먼저 '제어자'란 클래스와 클래스 멤버의 선언 시 사용하여 부가적인 의미를 부여하는 키워드를 의미한다. 제어자는 이번 포스팅에서 중점적으로 살펴 볼 접근 제어자와 기타 제어자로 나뉘는데, 기타 제어자는 경우에 따라 여러개를 함께 사용할 수도 있지만 접근 제어자는 두 개 이상 같이 사용할 수는 없는 특징이 있다.

 

접근 제어자가 사용되는 이유는 객체지향의 특징인 캡슐화와 관련이 있다. 객체지향 프로그래밍에서는 정보 은닉, 즉 사용자가 굳이 알 필요가 없는 정보는 사용자로부터 숨겨야 한다는 개념이 존재한다. 유효한 값을 유지하도록, 함부로 변경하지 못하도록 접근을 제한하는 것이 필요한 것이다. 자바는 이러한 정보 은닉을 접근 제어자를 통해 구현한다. 접근제어자를 사용하여 변수, 메서드, 생성자에 대한 접근 권한을 지정하는 것이다.

 

자바에서는 접근 제어자로 private, public, default, protected 네 가지를 제공하고, 

기타 제어자로 static, final, abstract, native, transient, synchronized, volatile, strictfp 등을 제공한다.

 

이번 포스팅에서는 접근 제어자에 대해 먼저 알아본다.


public

자바에서 public 멤버는 프로그램 어디에서 누구나 접근할 수 있다. public 접근 제어를 사용하여 선언 된 클래스 멤버는 외부로 공개되며, 해당 객체를 사용하는 프로그램 어디에서나 접근할 수 있다.

public class HousePark {
    protected String lastname = "park";
    public String info = "this is public message.";
}
public class Sample {
    public static void main(String[] args) {
        HousePark housePark = new HousePark();
        System.out.println(housePark.info);
    }
}

자바 클래스는 private 멤버로 정보를 은닉하고, public 멤버로 사용자나 프로그램과의 인터페이스를 구축한다. 자바 프로그램은 public 메소드를 통해서만 해당 객체의 private 멤버에 접근할 수 있어서, public 메소드는 private 멤버와 프로그램 사이의 인터페이스(interface) 역할을 수행한다고 말한다.

 

protected

protected 멤버는 부모 클래스에 대해서는 public 멤버처럼 취급되며, 외부에서는 private 멤버처럼 취급된다.

 

클래스의 protected 멤버에 접근할 수 있는 영역은 다음과 같다.

1. 이 멤버를 선언한 클래스의 멤버

2. 이 멤버를 선언한 클래스가 속한 패키지의 멤버

3. 이 멤버를 선언한 클래스를 상속받은 자식 클래스(child class)의 멤버

결론적으로 같은 패키지에 속하는 클래스와 다른 패키지에 속하는 자식 클래스에서만 접근할 수 있는 것이다.

package test;

public class SameClass {
    protected String sameVar = "다른 패키지에 속하는 자식 클래스까지 허용"; 
}
package test.other;
import test.SameClass; // test 패키지의 SameClass 클래스를 불러들여 포함시킴.

public class ChildClass extends SameClass {
    public static void main(String[] args) {
        SameClass = new SameClass();
        System.out.println(sp.sameVar); // 다른 패키지에 속하는 자식 클래스까지 허용
    }
}

 

default

default 접근 제어자는 자바에서 클래스 및 클래스 멤버 접근 제어의 기본값으로 설정되어 있다. 그래서 default를 위한 접근 제어자는 따로 존재하지 않으며, 접근 제어자가 지정되지 않으면 자동적으로 default 접근 제어를 가지게 된다.

default 접근 제어를 가지는 멤버는 같은 클래스의 멤버와 같은 패키지에 속하는 멤버에서만 접근할 수 있다.

 

package house; 

public class HouseKim {
    String lastname = "kim"; 
}
package house;  // 패키지가 동일하다.

public class HousePark {
    String lastname = "park";

    public static void main(String[] args) {
        HouseKim kim = new HouseKim();
        System.out.println(kim.lastname);  // HouseKim 클래스의 lastname 변수를 사용할 수 있다.
    }
}

 

private

private 접근 제어자를 사용하여 선언된 클래스 멤버는 외부에 공개되지 않으며, 외부에서는 직접 접근할 수 없다. 앞서 public을 설명하면서 언급 했던 것 처럼, private 멤버에 직접 접근할 수 없기 때문에 해당 객체의 public 메소드를 통해서만 private 변수에 접근할 수 있다.

public class Sample {
    private String secret;
    private String getSecret() {
        return this.secret;
    }
}

위 예제의 secret 변수와 getSecret 메서드는 오직 Sample 클래스에서만 접근이 가능하고 다른 클래스에서는 접근이 불가능하다.


결론적으로 private < default < protected < public 순으로 보다 많은 접근을 허용한다

또한 대상에 따라 사용할 수 있는 제어자의 종류에도 차이가 있다.

 

 

출처