회원가입

상속 - 접근 제어

Beany 2024-10-06

ChatGPT 요약

상속 관계와 접근 제어에 대해 UML 표기법을 이용하여 설명하며, 접근 제어자의 종류와 사용 방법을 소개함. Parent 클래스와 Child 클래스를 통해 다양한 접근 제어자를 사용하는 예제를 제시하고, 각각의 접근 가능 여부를 설명함. 결론적으로, 부모 클래스의 필드와 메서드에 대한 자식 클래스의 접근 권한을 설명함.

접근 제어


상속 관계와 접근 제어에 대해 알아보자. 참고로 접근 제어를 자세히 설명하기 위해 부모와 자식의 패키지를 따로 분리하였다.
이 부분에 유의해서 예제를 만들어보자.

접근 제어자를 표현하기 위해 UML 표기법을 일부 사용했다.

  • + : public
  • # : protected
  • ~ : default
  • - : private

 

접근 제어자를 잠시 복습해보자.

접근 제어자의 종류

  • private: 모든 외부 호출을 막는다.
  • deafault(package-private): 같은 패키지안에서 호출은 허용한다.
  • protected: 같은 패키지안에서 호출은 허용한다. 패키지가 달라도 상속 관계의 호출은 허용한다.
  • public: 모든 외부 호출을 허용한다.

순서대로 private 이 가장 많이 차단하고, public 이 가장 많이 허용한다.

private -> default -> protected -> public

 

그림과 같이 다양한 접근 제어자를 사용하도록 코드를 작성해보자.

package access.parent;

public class Parent {
    public int publicValue;
    protected int protectedValue;
    int defaultValue;
    private int privateValue;

    public void publicMethod() {
        System.out.println("public method");
    }

    protected void protectedMethod() {
        System.out.println("protected method");
    }

    void defaultMethod() {
        System.out.println("default method");
    }

    private void privateMethod() {
        System.out.println("private method");
    }

    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();
    }
}
package access.child;

import access.parent.Parent;

public class Child  extends Parent {
    public void call() {
        publicValue = 1;
        protectedValue = 2;  // 상속 관계 or 같은 패키지에서만 접근 가능
        // defaultValue = 3;  // 다른 패키지에서 접근 불가, 컴파일 오류
        // privateValue = 4; // 접근 불가, 컴파일 오류

        publicMethod();
        protectedMethod();  // 상속 관계 or 같은 패키지에서만 접근 가능
        // defaultMethod();  // 다른 패키지에서 접근 불가, 컴파일 오류
        // privateMethod(); // 접근 불가, 컴파일 오류

        printParent();
    }
}
package access;

import access.child.Child;

public class ExtendsAccessMain {
    public static void main(String[] args) {
        Child child = new Child();
        child.call();
    }
}
public method
protected method
==Parent 메서드 안==
publicValue = 1
protectedValue = 2
defaultValue = 0
privateValue = 0
default method
private method

둘의 패키지가 다르다는 부분에서 유의하자.

 

자식 클래스인 Child에서 부모 클래스인 Parent 에 얼마나 접근할 수 있는지 확인해보자.

  • publicValue = 1: 부모의 public 필드에 접근한다. public 이므로 접근할 수 있다.
  • protectedValue = 2: 부모의 protected 필드에 접근한다. 자식과 부모는 다른 패키지이지만, 상속 관계이므로 접근할 수 있다.
  • defaultValue = 1: 부모의 default 필드에 접근한다. 자식과 부모가 다른 패키지이므로 접근할 수 없다.
  • privateValue = 1: 부모의 private 필드에 접근한다. private 은 모든 외부 접근을 막으므로 자식이라도 호출할 수 없다.

메서드의 경우도 앞서 설명한 필드와 동일하다.

0 0
JAVA
이 공간은 개인 공부를 통해 얻은 정보를 체계적으로 정리하고 공유하는 곳입니다. 학습한 내용, 발견한 지식, 그리고 문제 해결 방법 등을 기록하여 나만의 학습 자료를 구축하고, 필요할 때 쉽게 참고할 수 있는 유용한 자원으로 활용할 수 있도록 합니다.
Yesterday: 456
Today: 205