정보처리기사 실기 - 2023년 1회 자바 기출 풀이(상속과 생성자 호출 순서, 필드 섀도잉(Field Shadowing) 문제)

Alchemist·2025년 10월 5일

정보처리기사

목록 보기
72/114

✨ 문제

class Parent {
    int x = 100;

    Parent() {
        this(500);
    }

    Parent(int x) {
        this.x = x;
    }

    int getX() {
        return x;
    }
}

class Child extends Parent {
    int x = 4000;

    Child() {
        this(5000);
    }

    Child(int x) {
        this.x = x;
    }
}

public class Main {
    public static void main(String[] args) {
        Child obj = new Child();
        System.out.println(obj.getX());
    }
}

🎯 출제 의도

  • 상속 관계에서 생성자 호출 순서를 이해
  • this()와 super() 호출 흐름 구분
  • 필드 섀도잉(field shadowing) — 부모와 자식 클래스의 동일 변수명이 가려지는 현상 파악

📘 개념 정리

1. 생성자 호출 순서

Child obj = new Child(); // 자식 생성자 호출
  • 1단계: Child() 호출
  • 2단계: Child() 내부에서 this(5000) → Child(int x) 호출
  • 3단계: 자식 생성자의 첫 줄에서 암묵적으로 super() 호출 → 부모 Parent() 실행
  • 4단계: Parent() → 내부에서 this(500) 호출 → Parent(int x) 실행

📌 호출 순서 요약

Child() → Child(int) → Parent() → Parent(int)

2. 필드 섀도잉(Field Shadowing)

class Parent { int x = 100; }
class Child extends Parent { int x = 4000; }
  • Child에도 같은 이름의 x가 선언됨 → 부모의 x는 가려짐
  • 하지만 getX()는 부모 클래스의 메서드이므로 Parent의 x 참조

3. 최종 값 계산 흐름

  1. Parent() → 내부에서 this(500) 호출
Parent(int x) { this.x = x; }  // Parent의 x = 500
  1. Child() → 내부에서 this(5000) 호출
Child(int x) { this.x = x; }   // Child의 x = 5000
  1. obj.getX() 호출 시
Parent의 getX() → Parent.x 반환 (500)

📝 풀이 과정

단계코드/위치동작Parent.xChild.x
1new Child()자식 생성자 호출1004000
2Parent() → this(500)부모 필드 설정5004000
3Child() → this(5000)자식 필드 설정5005000
4obj.getX()부모 메서드 실행 → Parent.x 반환5005000

✅ 최종 출력 결과

500

💡 정리

이 문제에서 꼭 알아야 할 개념:

  • super() → 부모 생성자 실행 후 부모 필드 값 변경 (Parent.x = 500)
  • this() → 자식 생성자 실행 후 자식 필드 값 변경 (Child.x = 5000)
  • 메서드의 선언 위치 기준으로 필드 참조 결정
    → getX()는 부모 메서드 → Parent.x 사용
  • 따라서 출력은 500
profile
html_programming_language

0개의 댓글