인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

인프런 커뮤니티 질문&답변

sy k님의 프로필 이미지

작성한 질문수

입문자를 위한, HTML&CSS 웹 개발 입문

상속과 접근 제어: 부모 & 자식 클래스에서 서로 다른 값 설정시

작성

·

34

0

안녕하세요. 상속과 접근제어 파트를 듣고 있는데요,

만약에 부모 클래스인 Parent 클래스에서 public int publicValue = 2;라고 설정해놓고,

package extends1.access.parent;

public class Parent {

    public int publicValue = 2;
    protected int protectedValue;
    int defaultValue;
    private int privateValue;

자식 클래스인 Child 클래스에서 publicValue = 1;이라고 설정하면 충돌이 일어나지 않나요?

package extends1.access.child;

import extends1.access.parent.Parent; //자동으로 되네?

public class Child extends Parent { //부모 클래스의 어디까지 접근 가능한가?

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

컴파일 했을 때 Child 클래스에서 설정한 publicValue = 1;로 결과가 나오는데, 왜 그러는 것일까요? Parent 클래스에서 초기화한 값과 Child 클래스에서 초기화한 값이 다르면 컴파일 오류가 날 것 같은데 왜 아닌가요?

 

답변 1

0

인프런 AI 인턴님의 프로필 이미지

안녕하세요, 인프런 AI 인턴입니다.
sy k님, 질문 감사합니다.

상속 관계에서 동일한 필드명을 사용하여 부모 클래스와 자식 클래스에서 다른 값을 설정하는 경우, 실제로는 부모 클래스의 필드가 아니라 자식 클래스의 필드가 사용됩니다. 자식 클래스에서 부모 클래스의 publicValue를 그대로 사용하지 않고, 자신의 publicValue를 설정하기 때문에 충돌은 발생하지 않습니다.

자식 클래스에서 publicValue를 따로 설정하면 자식 클래스의 publicValue가 부모의 publicValue를 “덮어씌우지” 않습니다. 대신 자식 클래스의 publicValue 필드가 상속되지 않은 새로운 변수로 사용됩니다. 즉, Child 클래스의 publicValue = 1;Child의 새로운 값을 설정하는 것이며, 부모 클래스의 publicValue와는 다른 메모리 위치에 저장됩니다.

결과적으로 컴파일 오류가 발생하지 않으며, Child 클래스에서 설정한 publicValue = 1;이 적용됩니다.

이를 해결하거나 명확하게 사용하려면, 자식 클래스에서는 부모 클래스와 다른 이름의 필드를 사용하는 것이 좋습니다. 또한, 코드의 가독성을 위해 이러한 차이를 명확하게 이해하는 것이 중요합니다.

추가적으로 자세한 부분은 Spring Data Repositories 문서에서 동일한 변수 사용시의 권장사항을 참고하는 것도 좋습니다.

도움이 되었기를 바랍니다!

sy k님의 프로필 이미지

작성한 질문수

질문하기