접근제어자

김나영·2023년 7월 8일
0

Java

목록 보기
2/2

제어자

  • 클래스와 클래스 멤버의 선언 시 사용하여 부가적인 의미를 부여하는 키워드

  • 접근 제어자 Vs 기타 제어자로 구분 가능

    • 접근 제어자

      • 두 개 이상 같이 사용 불가
    • 기타 제어자

      • 여러 개 함께 사용 가능

접근 제어자(access modifier)

  • 자바에서는 정보 은닉을 위해 접근 제어자라는 기능 제공

    • 정보 은닉이란??

      • 사용자가 굳이 알 필요가 없는 정보는 사용자로부터 숨겨야 한다는 개념

종류

1) private

  • 선언된 클래스 멤버는 외부에 공개되지 않으며, 외부에서는 직접 접근이 불가능

    • 외부 클래스나 상속된 클래스, 동일한 패키지의 클래스에서 접근 불가
  • 가장 제한적인 범위의 접근 제어자

  • 해당 객체의 public 메소드를 통해서만 접근 가능

  • public 인터페이스를 직접 구성하지 않고, 클래스 내부의 세부적인 동작을 구현하는데 사용

    • 클래스의 내부 구현을 감추고 캡슐화하기 위해 사용

언제 사용될까?

  • 클래스의 내부 구현 세부 사항을 감추고, 외부에서 접근할 필요가 없는 보조 메서드나 내부 데이터 필드에 사용

ex)

public class Sample {
    private String secret;
    private String getSecret() {
        return this.secret;
    }
}
  • secret 변수와 getSecret 메서드는 오직 Sample 클래스에서만 접근이 가능하고 다른 클래스에서는 접근이 불가능

2) public

  • 선언된 클래스 멤버는 외부로 공개되며, 해당 객체를 사용하는 프로그램 어디에서나 직접 접근 가능

    • 외부 클래스, 상속된 클래스, 동일한 패키지의 클래스 등
  • 해당 객체의 private 멤버에 접근 가능

  • private 멤버와 프로그램 사이의 인터페이스(interface) 역할 수행

  • 가장 넓은 범위의 접근 제어자

  • 다른 클래스나 모듈에서 재사용 가능한 공개 인터페이스를 제공하기 위해 사용됨

언제 사용될까?

  • 외부에서 접근이 가능한 공개 API, 인터페이스(interface), 클래스 등을 정의할 때 사용

ex)

package house;

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

import house.HousePark;

public class Sample {
    public static void main(String[] args) {
        HousePark housePark = new HousePark();
        System.out.println(housePark.info);
    }
} // this is public message. 출력
  • HousePark의 info 변수는 public 접근 제어자가 붙어 있으므로 어떤 클래스라도 접근이 가능

3) defalut(접근 지정자를 생략한 경우)

  • 클래스 및 클래스 멤버의 접근 제어의 기본값

  • 따로 존재하지 않으며, 접근 제어자가 지정되지 않으면 자동으로 defalut 접근 제어를 가지게 됨

  • 같은 클래스의 멤버와 같은 패키지에 속하는 멤버에서만 접근 가능

    • 외부 패키지의 클래스나 상속된 클래스에서는 접근 불가
  • 패키지 내에서의 내부적인 구현을 위해 사용됨

ex)

package house;  // 패키지 동일

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

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 변수를 사용할 수 있다.
    }
} // kim 출력
  • HouseKim과 HousePark의 패키지는 house로 동일

  • 따라서 HousePark 클래스에서 HouseKim의 lastname 변수에 접근이 가능

언제 사용될까?

  • 패키지 내에서의 내부적인 구현에 사용

  • 접근을 제한하면서도 동일한 패키지 내의 다른 클래스에서 접근이 가능하게 하고자 할 때 사용

4) protected

  • 부모 클래스에 대해서는 public 멤버처럼 취급되며, 외부에서는 private 멤버처럼 취급됨

    • 외부 패키지의 클래스나 상속된 클래스에서는 접근 불가
  • 이 멤버를 선언한 클래스의 멤버에 접근 가능

  • 이 멤버를 선언한 클래스가 속한 패키지의 멤버에 접근 가능

  • 이 멤버를 선언한 클래스를 상속받은 자식 클래스(child class)의 멤버에 접근 가능

    • 즉, 상속 관계에 있는 하위 클래스에서 해당 멤버에 접근 가능
  • 상속과 관련된 기능을 구현하고, 일부 멤벙듸 접근을 제한하여 상속 계층에서의 사용을 조절하기 위해 사용됨

언제 사용될까?

  • 상속 관계에서 하위 클래스에게 필요한 메서드나 데이터 필드를 제공하고, 외부에서의 접근을 제한하고자 할 때 사용

ex)

package house;  // 서로 다른 패키지

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

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 변수는 접근이 가능
    }
} // park 출력
  • HousePark 클래스를 상속한 EungYongPark 클래스의 패키지는 house.person으로 HousePark의 패키지인 house와 다르지만 HousePark의 lastname 변수가 protected이기 때문에 eyp.lastname과 같은 접근이 가능

  • 만약 lastname의 접근제어자가 protected 가 아닌 default 접근제어자였다면 eyp.lastname 문장은 컴파일 오류가 발생할 것

접근 제어자같은 클래스의 멤버같은 패키지의 멤버자식 클래스의 멤버그 외의 영역
public
protectedX
defaultXX
privateXXX

0개의 댓글