사용자가 굳이 알 필요가 없는 정보는 사용자로부터 숨겨야 한다는 개념
객체에 대한 구체적인 정보를 노출시키지 않도록 하는 기법
이 중 캡슐화를 이뤄내기 위해 사용하는 것이 접근제어자 이다.
객체지향언어에서 클래스, 메서드, 변수 등의 멤버에 대한 접근 권한을 지정하는 키워드
접근 제어자가 private으로 설정되었다면 private이 붙은 변수나 메서드는 해당 클래스 안에서만 접근이 가능하다.
public class Example {
private String malz;
private String getMalz() {
return this.malz;
}
}
변수 malz
와 함수 getMalz()
오직 Example
클래스에서만 접근이 가능하고 다른 클래스에서는 접근이 불가능하다.
접근 제어자를 별도로 설정하지 않는다면 변수나 메서드는 default 접근 제어자가 자동으로 설정되고 동일한 패키지 안에서만 접근이 가능하다.
SubSub/Malz.java
package SubSub;
public class Malz {
String nickName = "malz"; // nickName은 default 접근제어자로 설정된다.
...
}
SubSub/Rio.java
package SubSub; // 패키지가 동일하다.
public class Rio {
public static void main(String[] args) {
Malz malz = new Malz();
System.out.println(malz.nickName); // Malz 클래스의 nickName 변수를 사용할 수 있다.
}
}
malz
Malz
와 Rio
의 패키지는 subsub
으로 동일하다. 따라서 Rio
클래스에서 default
접근 제어자로 설정된 Malz
의 nickName
변수에 접근이 가능하다.
접근 제어자가 protected로 설정되었다면 protected가 붙은 변수나 메서드는 동일 패키지의 클래스 또는 해당 클래스를 상속받은 클래스에서만 접근이 가능하다.
subsub/member.java
package subsub;
public class Member {
protected String teamName = "subsub";
protected String part = "server";
}
subsub/member/malz.java
package subsub.member; // 패키지가 서로 다르다.
import subsub.Member;
public class Malz extends Member { // member상속
public static void main(String[] args) {
Malz malz = new Malz();
System.out.println(malz.teamName); // 상속한 클래스의 protected 변수는 접근이 가능하다.
}
}
subsub
member
클래스를 상속한 Malz
클래스의 패키지는 subsub.member
로, Member
클래스의 패키지인 subsub
과 다르지만 Member
의 teamName
변수가 protected
이기때문에 malz.teamName
과 같은 접근이 가능하다
접근 제어자가 public
으로 설정되었다면 public
접근 제어자가 붙은 변수나 메서드는 어떤 클래스에서도 접근이 가능하다.
package subsub;
public class malz {
protected String lastName = "Kim";
public String nickName = "malz";
}
malz
의 nickName
변수는 public 접근 제어자가 붙어 있으므로 어떤 클래스라도 접근이 가능하다. 그래서 다음과 같이 작성할 수 있다.
import subsub.malz;
public class Sample {
public static void main(String[] args) {
Malz malz = new Malz();
System.out.println(housePark.nickName);
// System.out.println(housePark.lastName); 컴파일 에러
}
}
malz