Java 생성자·상속·this/super
상위 부분의 초기화부터 하위 생성자 본문까지 순서를 기록한다.
실기 학습 목표
상위 부분의 초기화부터 하위 생성자 본문까지 순서를 기록한다.
핵심 이론
Java 생성자는 클래스와 이름이 같고 반환형이 없다. 생성자를 하나도 선언하지 않았을 때에만 기본 생성자가 자동 제공된다.
this(...)는 같은 클래스의 다른 생성자, super(...)는 상위 클래스 생성자를 호출한다. 이 자료의 일반 생성자 예시는 Java 21 규칙을 기준으로 생성자 호출을 첫 문장에 둔다.
클래스 초기화 시 상위 클래스의 static 초기화가 먼저 수행된다. 객체 생성에서는 상위 생성자 수행 이후 현재 클래스의 인스턴스 필드 초기화·초기화 블록과 생성자 본문을 순서대로 확인한다.
this.field는 현재 객체의 필드이며 super.field는 상위 클래스에서 선언한 필드를 가리킨다. 생성 중 재정의 메서드를 호출하면 하위 필드가 아직 기본값일 수 있으므로 출력 순서를 주의한다.
객체 생성은 상위 부분부터 완성한다
생성자는 반환형 없이 클래스 이름을 사용하며 객체 초기화에 관여한다. this(...)는 같은 클래스의 다른 생성자, super(...)는 상위 클래스 생성자로 연결한다. 이 자료의 Java 17 예제에서는 명시적인 생성자 연결 호출이 첫 문장에 온다. 아무것도 적지 않은 경우 적용되는 상위 생성자 호출 조건도 확인한다.
일반적인 예제에서 상위 클래스의 필드 초기화·생성자 본문이 먼저 진행되고, 하위 클래스의 필드 초기화·생성자 본문이 이어진다. 다만 상위 생성자에서 오버라이딩된 메서드를 호출하면 하위 객체의 초기화가 끝나기 전에 하위 메서드가 실행될 수 있다. 이때 하위 필드는 아직 기본값일 수 있다.
풀이표에는 ① 기본값 ② 상위 초기화 ③ 상위 생성자 출력 ④ 하위 초기화 ⑤ 하위 생성자 출력을 나눠 적는다. 생성자에서 출력한 글자와 main에서 나중에 출력한 글자를 합쳐 최종 문자열을 만든다.
this는 현재 객체, super는 상위 클래스 쪽의 멤버 접근에 사용한다. 둘을 별도의 객체 두 개로 그리지 않는다. 추상 클래스·인터페이스는 공통 계약을 제공하고 구현 클래스가 구체 동작을 담당한다. 생성 과정의 순서와 호출 결과를 이해하는 것이 목표이며 프레임워크의 객체 생성 관리까지 확장할 필요는 없다.
풀이 예시
다음 Java 17 프로그램이 표준 출력에 기록하는 내용을 쓰시오. 마지막 줄바꿈의 유무는 답안에서 구별하지 않는다.
public class Main {
static class Base {
int recorded;
Base() { recorded = read(); }
int read() { return 6; }
}
static class Child extends Base {
int level = 9;
int read() { return level + 1; }
}
public static void main(String[] args) {
Child c = new Child();
System.out.println(c.recorded + ":" + c.read());
}
}
예시 정답
1:10
풀이 과정
Base 생성자에서 호출한 read도 Child의 재정의 메서드로 연결된다. 이때 Child.level의 명시적 초기화는 아직 수행되지 않아 기본값 0이므로 recorded=1이다. 생성 완료 후 level=9여서 read()는 10이다.
답안 점검
위 풀이 예시의 답을 가린 뒤, 핵심 이론의 규칙을 적용해 직접 풀어 보세요. 코드와 계산 문제는 중간값·단위·최종 출력의 순서를, 용어 문제는 지문의 핵심 단서와 답의 의미를 점검하세요. 해설과 다른 부분이 있으면 어느 조건을 놓쳤는지 확인하고 연결된 실기 문제로 다시 연습하세요.