JAVA) 접근 제어자: public, protected, default, private와 Getter/Setter
접근 제어자 의미
자바는 어떤 클래스와 그 멤버에게 어느정도까지 접근할 수 있는지를 설정할 수 있다.
그 접근 권한을 지정하는것이 접근 제어자다.
사용 이유
접근을 제한하는거니 당연히 보안과 관련있다.
중요하거나 함부로 바꾸면 안되는 값들은 아무나 접근할 수 없어야하고,
누구나 자주사용하는 것은 모두가 사용할 수 있도록 자유롭게 해야한다.
=> 사실상 개발코드 자체가 보안에 신경써야하기 때문에 클래스의 멤벼변수는 대부분 private를 사용한다.
접근 제어자 종류
같은 클래스 | 같은 패키지 | 다른 패키지 | |
public | O | O | O |
protected | O | O | △(상속관계만) |
default | O | X | X |
private | O | X | X |
public
같은 패키지 내에 모든 클래스 O, 다른 패키지 O
protected
같은 패키지 내에 모든 클래스 O, 다른 패키지 상속관계 O,
default
같은 패키지 내에 모든 클래스 O, 다른 패키지 X
접근제어자를 따로 안적으면 기본으로 default가 된다.
private
같은 클래스에서만 접근 가능.
다른 외부클래스에서 접근하려면 다른 메서드를 거쳐서 접근해야한다.
객체지향 특징 중 E(Encapsulation, 캡슐화 = 은닉성)에 해당함.
외부에서의 직접적인 접근을 허용하지 않는 멤버를 설정하여 정보 은닉 구체화
집을 계약할때 안전하게 하기 위해 부동산을 통해 집주인과 접근하는것으로 생각하면 이해하기 쉽다.
class Access_sub01 {
// private접근제한자 int형 변수 선언
private int private_var = 40;
}
public class Access01 {
public static void main(String[] args) {
Access_sub01 as = new Access_sub01();
System.out.println(as.private_var); // 오류발생! 접근 불가능
}
}
Access01클래스가 다른클래스인 Access_sub01의 private에 직접 접근하지못한다.
따라서 Access_sub01안에 메서드를 통해서 접근해야한다.
class Access_sub01 {
private int private_var = 40;
// 메서드는 같은 클래스 안에있으니 private_var에 접근할 수 있다. 부동산 역할
public int private_method() { return private_var; }
}
public class Access01 {
public static void main(String[] args) {
Access_sub01 as = new Access_sub01();
//System.out.println(as.privatevar);
System.out.println(as.private_method()); // 메서드를 통해 간접접근
}
}
주로 클래스 내의 멤버변수는 private접근제한자를 사용하여 외부에서 접근 할 수 없도록 제한하고
public으로 선언된 Getter/Setter 메서드를 통해 간접적으로 멤버변수에 접근할 수 있도록 한다.
클래스의 접근 제어자
클래스 내부(멤버)가 아닌 클래스에 대한 접근제어자에 대해 알아보자.
종류: public, default
public: 다른패키지에서도 모두 접근 가능.
default: 같은 패키지에서만 접근 가능. 생략 가능
주의! 하나의 java파일 안에서 public 클래스는 딱 하나만 올 수 있다.
public인 클래스는 자바파일명과 같은 이름이어야 한다.