UML 표기법
- + : public
- # : protected
- ~ : default
- - : private
접근 제어자의 종류
- private : 모든 외부 호출을 막는다.
- default : 같은 패키지 안에서 호출은 허용한다.
- protected : 같은 패키지 안에서 호출은 허용한다. 패키지가 달라도 상속 관계의 호출은 허용한다.
- public : 모든 외부 호출을 허용한다.
public class Parent {
public int publicValue;
protected int protectedValue;
int defaultValue;
private int privateValue;
public void publicMethod() {
System.out.println("Parent.publicMethod");
}
protected void protectedMethod() {
System.out.println("Parent.protectedMethod");
}
void defaultMethod() {
System.out.println("Parent.defaultMethod");
}
private void privateMethod() {
System.out.println("Parent.privateMethod");
}
public void printParent() {
System.out.println("==Parent 메서드 안==");
System.out.println("publicValue = " + publicValue);
System.out.println("protectedValue = " + protectedValue);
System.out.println("defaultValue = " + defaultValue);
System.out.println("privateValue = " + privateValue);
// 부모 메서드 안에서 모두 접근 가능
defaultMethod();
privateMethod();
}
}
public class Child extends Parent {
public void call() {
publicValue = 1;
protectedValue = 1; // 상속 관계 or 같은 패키지
// defaultValue = 1; // 다른 패키지에 접근 불가 -> 컴파일 오류
// privateValue = 1; // 접근 불가 -> 컴파일 오류
publicMethod();
protectedMethod(); // 상속 관계 or 같은 패키지
// defaultMethod(); // 다른 패키지에 접근 불가 -> 컴파일 오류
// privateMethod(); // 접근 불가 -> 컴파일 오류
printParent();
}
}
public class ExtendsAccessMain {
public static void main(String[] args) {
Child child = new Child();
child.call();
}
}
접근 제어자와 메모리 구조
본인 타입에 없으면 부모 타입에서 기능을 찾는데, 이때 접근 제어자가 영향을 준다. 객체 내부에서는 자식과 부모가 구분되어 있기 때문이다. 자식 타입에서 부모 타입의 기능을 호출할 때 부모 입장에서 보면 외부에서 호출한 것과 같다.
공부 내용: [인프런] 김영한의 실전 자바 - 기본편
'Java' 카테고리의 다른 글
[인프런] 다형성 (0) | 2024.05.27 |
---|---|
[인프런] super (0) | 2024.05.27 |
[인프런] 상속과 메서드 오버라이딩 (0) | 2024.05.27 |
[인프런] 상속 (0) | 2024.05.27 |
[인프런] final 변수와 상수 (0) | 2024.05.27 |