프로그래밍언어/Java

[Java 기본] 상속과 접근 제어

배세 2024. 7. 16. 13:30

상속과 접근 제어


접근제어자 protected는 패키지가 달라도 상속 관계의 호출을 허용한다. 

 

 

예제


access.parent 패키지 생성.

 

Parent.java

package extends1.access;

public class Parent {

    public int publicValue;
    protected int protectedValue;
    int detaultValue;
    private int privateValue;

    public void publicMethod() {
        System.out.println("Parent.publicMethod");
    }
    protected void protectedMethod() {
        System.out.println("parent.protectedMethod");
    }
    void defuailtMethod() {
        System.out.println("Parent.defueltMethod");
    }
    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("detaultValue = " + detaultValue);
        System.out.println("privateValue = " + privateValue);

        // 부모 메서드 안에서 모두 접근 가능
        defuailtMethod();
        privateMethod();
    }

}

 

 

access.child 패키지 생성. 위의 parent와 패키지를 다르게 해서 상속과 접근제어자의 관계를 확인해보자 

Child.java

package extends1.access.child;

import extends1.access.Parent;

public class Child extends Parent {

    public void call() {
        publicValue = 1;
        protectedValue = 1; //상속 관계 or 같은 패키지
        // defaultValue = 1; //다른 패키지 접근 불가, 컴파일 오류
        // privateValue = 1; // 접근 불가, 컴파일 오류

        publicMethod();
        protectedMethod();
        //defauiltMethod();
        //privateMethod();

        printParent();
    }

}

 

access 패키지에서 main 메서드를 만들어서 child를 호출해보자. 

package extends1.access;

import extends1.access.child.Child;

public class ExtendsAccessMain {

    public static void main(String[] args) {
        Child child = new Child();
        child.call();
    }
}

 

실행결과

 

 

접근 제어와 메모리 구조


본인 타입에 없으면 부모 타입에서 기능을 찾는데, 이때 접근 제어자가 영향을 준다. 객체 내부에서 자식과 부모가 구분되어 있기 때문이다. 결국 자식 타입에서 부모 타입의 기능을 호출할 때, 부모 입장에서 보면 외부에서 호출한 것과 같다. 

 

 

* 인프런 '김영한의 실전 자바 - 기본편'을 참고하여 작성하였습니다.