4년 넘게 개발하면서 이제야 중요성을 인식하는 것중 하나가 바로 접근제어자이다. 이 접근제어자를 제대로 쓸 줄 알아야 정보은닉, 캡슐화 등 객체지향 프로그래밍의 주요 개념들을 제대로 사용할 수 있다고 생각한다.
자바의 접근제어자는 클래스, 메소드, 인스턴스 변수, 클래스 변수를 선언할때 사용한다. 접근제어자는 public, protected, package-private, private 4가지가 있다. 이중에서 protected와 private는 클래스 안에서만 쓸 수 있다. 클래스를 선언할때 쓸 수 없다.
- public
- 같은 클래스에서 접근 가능
- 같은 패키지에서 접근 가능
- 다른 패키지에서 접근 가능
- 상속받았을때 접근 가능
- protected
- 같은 클래스에서 접근 가능
- 같은 패키지에서 접근 가능
- 상속받았을때 접근 가능
- package-private
- 같은 클래스에서 접근 가능
- 같은 패키지에서 접근 가능
- private
- 같은 클래스에서 접근 가능
위에서 아래로 접근할수 있는 범위가 좁아진다.(public > protected > package-private > private)
javastudy>com>molt 패키지에 AccessInClass.java 파일을 만들었다.
package com.molt;
public class AccessInClass {
public static void main(String[] args) {
AccessInClass accessTest = new AccessInClass();
accessTest.publicAccess();
accessTest.protectedAccess();
accessTest.packagePrivateAccess();
accessTest.privateAccess();
}
public void publicAccess () {
System.out.println("public");
}
protected void protectedAccess () {
System.out.println("protected");
}
void packagePrivateAccess () {
System.out.println("packagePrivate");
}
private void privateAccess () {
System.out.println("private");
}
}
// 결과
public
protected
packagePrivate
private
같은 클래스 안에서는 모든 접근제어자에 접근 가능하다.
이번에는 같은 패키지에 AccessInPackage.java 파일을 만든다.
package com.molt;
public class AccessInPackage {
public static void main(String[] args) {
AccessInClass accessInClass = new AccessInClass();
accessInClass.publicAccess();
accessInClass.protectedAccess();
accessInClass.packagePrivateAccess();
}
}
// 결과
public
protected
packagePrivate
같은 패키지 안에 있지만, 다른 클래스에서는 private 접근 제어자를 가진 메소드 자체를 쓸 수가 없다.
이번에는 javastudy > com 패키지에 AccessOutPackage.java를 만들었다. 자바에서 패키지는 상하관계가 아니라 같은 패키지에 속했는지 아닌지만 중요하다고 했다. 다시 말해 com 패키지 안에 molt 패키지가 있지만, 서로 다른 패키지라는것을 이해하고 보자.
package com;
import com.molt.AccessInClass;
public class AccessOutPackage {
public static void main(String[] args) {
AccessInClass accessInClass = new AccessInClass();
accessInClass.publicAccess();
}
}
// 결과
public
결과는 서로 다른 패키지에 있을때는 public 접근제어자만 접근 할 수 있다.
마지막으로 상속받았을 경우를 확인해 보자.
package com;
import com.molt.AccessInClass;
public class AccessExtends extends AccessInClass {
public static void main(String[] args) {
AccessExtends accessExtends = new AccessExtends();
accessExtends.call();
}
public void call(){
super.publicAccess();
super.protectedAccess();
}
}
//결과
public
protected
상속받은 클래스에서 부모에 있는것을 사용할때는 super 키워드를 쓴다. 이때 public, protected 접근제어자가 붙은것만 사용할 수 있다.
이렇게 접근제어자를 사용하면 정보를 선택적으로 노출할 수 있다. 변수를 직접 변경할수 없도록 지정할 수 있고, 특정 로직을 해당 클래스 안에서만 쓸수 있도록 제한할 수 있다.
클래스 접근 제어자 선언시 유의사항
- 클래스를 선언할때는 반드시 파일 이름에 해당하는 클래스가 있어야 한다.
- 만약 파일 하나에 클래스가 두개 있는데, 파일이름에 해당하는 클래스는 public이 아니고 public으로 선언된 다른 클래스가 있다면 이 파일은 컴파일 되지 않는다.
'Java' 카테고리의 다른 글
[자바의 신] Object (0) | 2020.10.21 |
---|---|
[자바의 신] 상속 (0) | 2020.10.06 |
[자바의 신] 패키지 (0) | 2020.10.01 |
[자바의 신] 참조 자료형 - 메소드 (0) | 2020.09.27 |
[자바의 신] 참조 자료형 - 생성자 (0) | 2020.09.21 |