TIL | [Java] 접근 제어자

hyemin·2022년 4월 6일
0

Java

목록 보기
10/10
post-thumbnail
post-custom-banner

Java의 접근 제어자

자바의 접근 제어자(Access Modifier는 변수나 메소드를 선언할 때 접근을 제어할 수 있는 권한을 설정하는 것이다. 접근 제어자를 통해 객제지향 언어의 중요 특성인 캡슐화(Encapsulation)를 구현할 수 있다.

<캡슐화>
객체에 직접적인 접근을 막아 내부의 정보를 은닉하고, 객체가 제공하는 필드와 메소드를 통해서 접근이 가능하게 한 것

자바의 접근 제어자는 다음과 같이 4가지가 있다.

  • private - 비공개
  • public - 완전 공개
  • default - 패키지 공개
  • protected - 상속 공개

public - protected - default - private 순으로 접근이 점차 제한된다.

private

접근 제어자 중 가장 제한이 강한 제어자로 private이 붙으면 해당 class 내에서만 접근이 가능하다.

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

위 예제의 secret 변수와 getSecret(() 메소드는 오직 Sample 클리스에서만 접근할 수 있다.

public

public으로 선언된 class 멤버는 외부로 공개되며, 해당 객체를 사용하는 프로그램 어디에서나 접근이 가능하다.

default

접근 제어자를 별도로 설정하지 않을 경우 default 접근 제어자로 설정된다. default 접근 제어자는 같은 패키지 내에서만 접근이 가능하다.

house/House_yu.java

package house;

public class House_yu {
	String lastName = "Yu";
}

house/House_kim.java

package house;

public class House_kim {
	String lastName = "Kim";
    
    public static void main(String[] a rgs) {
    	House_yu yu = new House_yu();
        System.out.println(yu.lastName);
        // Houst_yu 클래스의 변수 lastName에 접근 가능
        // Yu
    }
}

위의 예제에서 두 클래스(House_yu, House_kim)의 패키지는 house로 동일하기 때문에 House_yu 클래스 변수 lastName에 접근이 가능했다.

protected

protected 접근 제어자가 접근할 수 있는 영역은 다음과 같다.

  • protected를 선언한 클래스 내부
  • protected를 선언한 클래스가 속한 패키지
  • protected를 선언한 클래스를 상속받은 다른 패키지의 자식 클래스

house/House_yu.java

package house;

public class House_yu {
    protected String lastname = "Yu";
}

house/person/Hyemco.java

package house.person;

import house.House_yu;

public class Hyemco extends House_yu {  // House_yu 상속
    public static void main(String[] args) {
        Hyemco name = new Hyemco();
        System.out.println(name.lastname);  
        // Yu
    }
}

House_yu 클래스와 이 클래스를 상속한 Hyemco 클래스 패키지는 서로 다르지만, House_yu의 변수 lastname이 protected 접근 제어자를 가졌기 때문에 다른 패키지이지만 상속받은 자식 클래스 Hyemco에서 name.lastname 접근이 가능했다.

만약, default 접근 제어자였다면 name.lastname에서 컴파일 오류가 발생할 것이다.

post-custom-banner

0개의 댓글