본문 바로가기

프로그래밍 언어/Java

접근제어자

private, public, protected 등의 접근제어자에 대해 알아보자.

자바는 크게 4가지의 접근 제어자로 나눌수 있다.

  • private 
  • public
  • protected
  • default

많은 사람들이 default 접근 제어자에 대해서 잘 모르는 경우가 많다. 이번에 확실하게 알아보자.

private

접근제어자가 private으로 설정되었다면 private 이 붙은 변수, 메소드는 해당 클래스에서만 접근이 가능하다.

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

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

default

접근 제어자를 별도로 설정하지 않는다면 접근 제어자가 없는 변수, 메소드는 default 접근 제어자가 되어 해당 패키지 내에서만 접근이 가능하다.

※ 우리가 지금까지 진행했던 대부분의 예제는 특별한 경우가 아니라면 모두 default 접근 제어자를 사용했다.

다음의 예제를 보자.

house/HouseKim.java

package house;  // 패키지가 동일하다.

public class HouseKim {
    String lastname = "kim";  // lastname은 default 접근제어자로 설정된다.
}

house/HousePark.java

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 변수를 사용할 수 있다.
    }
}

HouseKim과 HousePark의 패키지는 house로 동일하다. 따라서 HousePark 클래스에서 HouseKim의 lastname 변수에 접근이 가능하다.

protected

접근제어자가 protected로 설정되었다면 protected가 붙은 변수, 메소드는 동일 패키지의 클래스 또는 해당 클래스를 상속받은 다른 패키지의 클래스에서만 접근이 가능하다.

다음의 예를 보자.

house/HousePark.java

package house;  // 패키지가 서로 다르다.

public class HousePark {
    protected String lastname = "park";
}

house/person/EungYongPark.java

package house.person;  // 패키지가 서로 다르다.

import house.HousePark;

public class EungYongPark extends HousePark {  // HousePark을 상속했다.
    public static void main(String[] args) {
        EungYongPark eyp = new EungYongPark();
        System.out.println(eyp.lastname);  // 상속한 클래스의 protected 변수는 접근이 가능하다.
    }
}

HousePark 클래스를 상속한 EungYongPark 클래스의 패키지는 house.person으로 HousePark의 패키지인 house와 다르지만 HousePark의 lastname 변수가 protected이기 때문에 eyp.lastname과 같은 접근이 가능하다. 만약 lastname의 접근제어자가 protected 가 아닌 default 접근제어자였다면 eyp.lastname 문장은 컴파일 오류가 발생할 것이다.

public

접근제어자가 public으로 설정되었다면 public 접근제어자가 붙은 변수, 메소드는 어떤 클래스에서라도 접근이 가능하다.

package house;

public class HousePark {
    protected String lastname = "park";
    public String info = "this is public message.";
}

위 예제의 HousePark의 info 변수는 public 접근 제어자가 붙어 있으므로 어떤 클래스라도 접근이 가능하다.

'프로그래밍 언어 > Java' 카테고리의 다른 글

Java Volatile은 무엇이고 왜 필요할까?  (0) 2022.07.26
enum과 활용사례  (0) 2022.07.13
Hash Map과 Hash Collision 문제  (0) 2022.07.10
GC(Garbage Collector)  (0) 2022.07.10
자바 Transactional  (0) 2022.07.10