방송대 Java프로그래밍 4강: 공유 상태와 상속 구조
클래스가 많아지면 “어느 객체의 값인가?”, “같은 이름의 메소드 중 무엇이 실행되는가?”, “부모와 자식 중 누가 먼저 준비되는가?”를 함께 판단해야 한다. 이 글은 static과 필드 초기화부터 포함·상속 관계, 오버로딩·오버라이딩, this·super, 생성자와 메소드 체이닝까지를 하나의 관계 지도로 연결해 코드의 상태와 실행 결과를 추적하도록 돕는다.
클래스 코드는 세 질문으로 위치를 찾는다
클래스의 필드나 메소드를 볼 때 문법 표식만 외우면 서로 다른 규칙이 뒤섞인다. 먼저 소유자가 클래스인지 객체인지, 다음으로 연결 방향이 포함인지 상속인지, 마지막으로 실제 호출할 구현을 언제 결정하는지 묻는 편이 정확하다.
| 추적 질문 | 주요 문법 | 코드에서 확인할 것 | 잘못 읽었을 때 생기는 혼동 |
|---|---|---|---|
| 상태와 동작의 소유자는 누구인가? | static, 인스턴스 필드 | 클래스에 하나인지 객체마다 하나인지 | 한 객체의 변경이 왜 다른 객체에서도 보이는지 설명하지 못한다. |
| 두 클래스는 어떻게 연결되는가? | 필드 포함, extends | has-a 관계인지 is-a 관계인지 | 단순히 기능을 쓰고 싶다는 이유로 부적절한 상속을 선택한다. |
| 어느 이름과 구현을 선택하는가? | 오버로딩, 오버라이딩, this, super | 매개변수 목록, 실제 객체, 부모·현재 객체의 경계 | 컴파일 시 선택과 실행 시 선택을 같은 현상으로 오해한다. |
| 객체는 어떤 순서로 준비되는가? | 초기화 블록, 생성자, this(), super() | 클래스당 한 번과 객체마다 한 번을 구분 | 초깃값이 덮어써지는 순서나 생성자 호출 실패를 놓친다. |
관계 지도의 출발점: 멤버의 이름보다 먼저 “클래스 소유인가, 객체 소유인가”를 표시하고, 클래스 사이에는 “가지고 있다”와 “일종이다” 중 어느 문장이 자연스러운지 적는다.
static은 객체별 상태를 클래스의 공유 상태로 바꾼다
static 필드는 클래스에 하나만 존재하며 그 클래스에서 만든 객체들이 공유한다. 반면 static이 없는 인스턴스 필드는 객체마다 별도의 저장 공간을 가진다. 객체 수를 세는 값처럼 모든 객체가 함께 보아야 하는 정보는 클래스 필드가 자연스럽고, 반지름처럼 객체마다 다른 정보는 인스턴스 필드가 자연스럽다.
다음은 강의의 원 개념을 확인하기 위해 직접 구성한 학습용 예다. created는 새 객체가 만들어질 때마다 같은 저장 공간에서 증가하지만 radius는 각 객체에 따로 저장된다.
class Circle {
static int created = 0;
double radius;
Circle(double radius) {
this.radius = radius;
created++;
}
}
public class Main {
public static void main(String[] args) {
Circle small = new Circle(2.0);
Circle large = new Circle(5.0);
small.radius = 3.0;
System.out.println(large.radius); // 5.0
System.out.println(Circle.created); // 2
}
}
small.radius를 바꾸어도 large.radius에는 영향이 없지만, 두 생성자는 모두 Circle.created를 증가시킨다. 클래스 필드는 Circle.created처럼 클래스 이름으로 접근하면 공유 관계가 분명해진다.
static 메소드도 특정 객체가 아니라 클래스에 속하므로 객체를 만들기 전에도 호출할 수 있다. 그러나 “어느 객체인지”를 나타내는 this가 없으므로 인스턴스 필드나 인스턴스 메소드를 직접 사용할 수 없다. 필요하다면 객체 참조를 매개변수로 받아 그 객체를 통해 접근해야 한다.
final은 공유 여부가 아니라 변경 가능성을 제한한다
static과 final은 서로 다른 축이다. static은 소유자를 정하고, final은 한 번 정해진 값을 다시 대입하거나 메소드 구현을 자식 클래스에서 바꾸지 못하게 한다. 따라서 static final double PI = 3.14;는 클래스가 공유하는 하나의 값이며 재대입할 수 없다.
final 필드는 선언할 때 초기화할 수도 있고, 인스턴스의 경우 생성이 끝날 때까지 생성자에서 한 번 값을 정할 수도 있다. 핵심은 사용 가능한 모든 생성 경로에서 값이 정확히 한 번 정해져야 한다는 점이다. final 메소드는 상속될 수 있지만 자식 클래스가 같은 시그니처로 오버라이딩할 수 없다.
final 참조 변수에 객체를 대입한 경우 참조가 다른 객체를 가리키도록 재대입할 수 없다는 뜻이다. 참조 대상 객체 내부의 모든 필드가 자동으로 불변이 된다는 뜻은 아니다. 이 경계는 “변수에 다시 넣는 값”과 “그 변수가 가리키는 객체의 상태”를 분리하면 이해할 수 있다.
초기화는 클래스당 한 번과 객체마다 한 번으로 나눠 추적한다
초기화 코드를 단순히 위에서 아래로만 읽으면 static 초기화와 객체 초기화를 섞기 쉽다. 클래스가 처음 사용될 때 클래스 변수의 선언 초기화와 정적 초기화 블록이 실행되고, 객체를 만들 때마다 인스턴스 필드의 선언 초기화, 인스턴스 초기화 블록, 생성자 몸체가 차례로 실행된다.
class InitTrace {
static int shared = 10;
int value = 1;
static {
shared = 20;
}
{
value = 2;
}
InitTrace() {
value = 3;
shared++;
}
}
| 시점 | 실행 부분 | shared | 새 객체의 value |
|---|---|---|---|
| 클래스 첫 사용 | 정적 필드 선언 초기화 | 10 | 아직 객체 없음 |
| 클래스 첫 사용 | 정적 초기화 블록 | 20 | 아직 객체 없음 |
| 첫 객체 생성 | 인스턴스 필드 → 인스턴스 블록 → 생성자 | 21 | 1 → 2 → 3 |
| 둘째 객체 생성 | 인스턴스 필드 → 인스턴스 블록 → 생성자 | 22 | 1 → 2 → 3 |
두 번째 객체를 만들 때 정적 초기화는 반복되지 않는다. 반면 각 객체의 value는 다시 1, 2, 3의 순서로 덮어써진다. 마지막 값을 맞히는 문제에서는 대입문을 발견할 때마다 값을 갱신하되, 그 코드가 클래스당 한 번인지 객체마다 한 번인지 옆에 표시하면 된다.
강의의 Rectangle 예처럼 생성자가 여러 개일 수도 있다. 매개변수 없는 생성자는 원점을 (0, 0)으로 만들고, 다른 생성자는 전달받은 원점·너비·높이를 저장한다. 어떤 생성자가 선택되는지는 호출할 때 전달한 인수의 개수와 자료형으로 결정된다.
오버로딩과 오버라이딩은 같은 이름을 푸는 시점이 다르다
오버로딩은 한 클래스 안에서 같은 메소드 이름을 쓰되 매개변수의 개수나 자료형을 다르게 선언하는 것이다. 컴파일러는 호출문의 인수 목록을 보고 맞는 선언을 고른다. 반환형만 바꾸고 매개변수 목록을 그대로 두면 호출만으로 둘을 구분할 수 없으므로 오버로딩이 아니다.
오버라이딩은 자식 클래스가 부모에게 상속받은 인스턴스 메소드와 같은 매개변수 목록으로 새 구현을 제공하는 것이다. 부모형 변수로 호출하더라도 실제로 가리키는 객체가 자식 객체라면 자식의 재정의된 구현이 실행된다.
| 판정 축 | 오버로딩 | 오버라이딩 |
|---|---|---|
| 관계 | 같은 이름의 여러 매개변수 목록 | 부모 선언과 자식 구현의 관계 |
| 구분 기준 | 매개변수 개수 또는 자료형 | 같은 이름과 매개변수 목록, 호환되는 반환형 |
| 선택의 핵심 | 호출문의 인수에 맞는 선언 | 실제 객체가 제공하는 재정의 구현 |
| 성립하지 않는 예 | 반환형만 다른 두 메소드 | private 메소드나 final 메소드의 재정의 |
| 접근 범위 | 각 선언에 맞게 지정 | 부모 메소드보다 접근 범위를 좁힐 수 없음 |
강의의 도형 예에서 Shape t = new Triangle();이면 변수의 선언형은 Shape이지만 실제 객체는 Triangle이다. t.getArea(3.0, 4.0)는 재정의된 삼각형 계산을 실행하여 3.0 × 4.0 × 0.5 = 6.0을 출력한다. 이것은 인수가 달라 다른 선언을 고르는 오버로딩이 아니라, 실제 객체에 맞는 구현을 고르는 오버라이딩이다.
has-a와 is-a는 재사용의 방향을 결정한다
다른 클래스의 기능이 필요하다고 모두 상속할 필요는 없다. 한 객체가 다른 객체를 부품처럼 필드로 가지면 포함 관계(has-a)다. 강의의 원기둥 예에서 Cylinder가 Circle 객체를 필드로 가지고 원의 넓이를 이용해 부피를 구하는 방식이 이에 해당한다.
한 클래스가 다른 클래스의 더 구체적인 종류라면 상속 관계(is-a)를 고려한다. Triangle은 Shape의 한 종류라고 말할 수 있으므로 상속 관계가 자연스럽다. “원기둥은 원을 가진다”는 말은 자연스럽지만 “원기둥은 원의 한 종류다”라고 하면 개념이 맞지 않는다. 이 경우 단순 코드 재사용을 이유로 Cylinder extends Circle을 선택하기 전에 모델의 의미를 다시 확인해야 한다.
관계 선택 절차: A가 B를 부품으로 사용하면 “A has a B”로 포함하고, A를 B가 필요한 자리에 의미상 대체할 수 있는 더 구체적인 종류라면 “A is a B”로 상속한다. 문장이 어색하면 재사용 편의보다 관계의 의미를 우선한다.
Java 클래스는 하나의 직접 부모 클래스만 상속하며 extends 뒤에 부모 클래스를 적는다. 한편 인터페이스끼리는 여러 인터페이스를 확장할 수 있다. 인터페이스와 다형성은 다음 차시의 본격적인 범위이므로 여기서는 클래스의 단일 상속과 구분하는 경계로만 기억하면 된다.
상속은 부모의 private 경계를 없애지 않는다
자식 객체는 부모 부분을 포함하지만, 부모가 private로 선언한 멤버를 자식 클래스 코드가 이름으로 직접 접근할 수 있는 것은 아니다. 강의 예에서 자식 객체를 통해 부모의 public 필드 f2와 공개 메소드 setPrivate()는 사용할 수 있지만, 부모의 private 필드 f1과 private 메소드 mPrivate()에는 직접 접근할 수 없다.
여기서 “부모의 private 필드는 자식 객체 안에 존재하지 않는다”라고 결론 내리면 틀린다. 부모 부분의 상태로 존재하지만 접근 권한이 부모 클래스 내부로 제한된 것이다. 공개된 부모 메소드가 그 필드를 변경할 수 있는 이유도 이 때문이다. 자식 클래스가 새로 선언한 private 필드 역시 외부의 main()에서 직접 접근할 수 없다.
오류를 진단할 때는 “상속되었는가?”와 “현재 위치에서 이름으로 접근할 수 있는가?”를 분리한다. 객체 구조에 포함된다는 사실이 접근 제어를 우회하는 권한을 주지는 않는다.
this와 super는 같은 이름이 가리키는 층을 지정한다
this는 현재 실행 중인 인스턴스 메소드나 생성자가 속한 객체를 가리킨다. 매개변수와 필드 이름이 같을 때 this.radius = radius;라고 쓰면 왼쪽은 현재 객체의 필드, 오른쪽은 매개변수라는 경계가 분명해진다. this.getArea()처럼 현재 객체의 메소드를 명시할 수도 있다.
super는 현재 객체 안의 부모 클래스 부분을 기준으로 멤버를 찾는다. 자식이 부모와 같은 이름의 필드나 메소드를 선언했을 때 this.x는 자식 쪽 필드, super.x는 부모 쪽 필드를 뜻한다. 재정의된 메소드 안에서 부모 구현을 일부 재사용하려면 super.getArea()처럼 호출한다.
class Parent {
double x;
}
class Child extends Parent {
double x;
Child(double value) {
this.x = value;
super.x = value * 10;
}
double parentValue() {
return super.x;
}
}
Child item = new Child(10.0);
System.out.println(item.x); // 10.0
System.out.println(item.parentValue()); // 100.0
생성자에서 먼저 자식 필드에 10.0을 저장하고 부모 필드에는 100.0을 저장한다. item.x는 자식에서 같은 이름으로 선언한 필드를 선택하며, 부모 필드는 메소드 내부의 super.x를 통해 읽는다. 같은 객체 안에 이름이 같은 두 저장 공간이 있으므로 “가장 가까운 선언”과 “명시한 기준점”을 함께 보아야 한다.
생성자 연결은 반드시 첫 문장에서 위임한다
this()는 같은 클래스의 다른 생성자를, super()는 부모 클래스의 생성자를 호출한다. 둘 다 생성자 몸체의 첫 문장에만 올 수 있으므로 한 생성자에서 두 호출을 나란히 직접 적을 수 없다. 같은 클래스 생성자에 먼저 위임했다면 그 생성자가 다시 부모 생성자를 호출하는 식으로 연결된다.
생성자에 super(...)를 쓰지 않으면 컴파일러는 첫 문장에 매개변수 없는 super()를 넣는다. 따라서 부모에게 접근 가능한 매개변수 없는 생성자가 없는데 자식이 다른 부모 생성자를 명시하지 않으면 컴파일 오류가 난다. “아무것도 안 쓰면 부모 생성자는 호출되지 않는다”는 생각과 정반대다.
class Circle {
private double radius;
Circle(double radius) {
this.radius = radius;
}
double getArea() {
return radius * radius * 3.14;
}
}
class Cylinder extends Circle {
private double height;
Cylinder(double radius, double height) {
super(radius);
this.height = height;
}
double getVolume() {
return super.getArea() * height;
}
}
new Cylinder(3, 10)을 실행하면 먼저 super(3)가 부모 부분의 반지름을 준비하고, 그 뒤 자식 생성자가 높이 10을 저장한다. 부피는 3 × 3 × 3.14 = 28.26인 밑면 넓이에 높이 10을 곱해 282.6이 된다. 초기화 추적에서는 부모 준비가 끝난 뒤 자식 생성자 몸체가 진행된다는 방향을 놓치지 않는다.
메소드 체이닝은 호출 결과가 다음 수신자가 될 때 성립한다
메소드 체이닝은 한 메소드 호출의 반환 객체에 다음 메소드를 연이어 호출하는 표현이다. 세터가 void를 반환하면 p.setName(...).setAge(...)에서 첫 호출 뒤 다음 메소드를 받을 객체가 없으므로 연결할 수 없다. 현재 객체인 this를 반환하면 다음 호출의 수신자가 다시 같은 객체가 된다.
class Profile {
private String name;
private int age;
Profile setName(String name) {
this.name = name;
return this;
}
Profile setAge(int age) {
this.age = age;
return this;
}
}
Profile learner = new Profile();
learner.setName("민준").setAge(24);
실행 흐름은 learner.setName("민준")이 learner 자신을 반환하고, 그 반환값에 setAge(24)를 호출하는 순서다. 단지 점을 여러 개 찍는 문법이 아니라 각 중간 메소드의 반환형과 반환값이 다음 호출을 가능하게 하는 구조다.
체이닝 점검: 왼쪽부터 호출한 뒤 반환값의 자료형을 적는다. 그 자료형에 다음 메소드가 있고 실제 반환값이 null이 아니라면 연결이 계속된다.
오류는 소유자·관계·선택·순서의 어느 층인지 진단한다
긴 코드에서 문제를 발견하면 모든 문법을 동시에 떠올릴 필요가 없다. 다음 순서로 경계를 좁히면 강의의 여러 개념을 한 번에 적용할 수 있다.
- 소유자 확인: 클래스 멤버인지 객체 멤버인지 표시하고, 정적 문맥에서 객체 멤버를 직접 부르는지 본다.
- 관계 확인: 필드로 포함한 객체인지 상속한 부모 부분인지 확인하고, 접근 제어가 현재 위치의 접근을 허용하는지 본다.
- 선택 확인: 같은 이름이면 인수 목록으로 오버로딩을 판정하고, 상속 관계에서는 실제 객체의 오버라이딩 구현과
super사용을 확인한다. - 순서 확인: 정적 초기화, 인스턴스 초기화, 부모 생성자, 자식 생성자 몸체의 실행 시점을 구분한다.
- 반환 연결 확인: 체이닝된 각 메소드가 다음 호출을 받을 객체를 반환하는지 확인한다.
예를 들어 정적 메소드에서 this.x를 사용한 오류는 상속 문제가 아니라 소유자 문제다. 반환형만 다른 같은 이름의 메소드 두 개가 충돌한 것은 오버라이딩 문제가 아니라 오버로딩의 구분 기준 문제다. 부모의 매개변수 없는 생성자가 없어서 자식 생성이 실패한 것은 필드 초기화값보다 생성자 연결 순서를 먼저 살펴야 한다.
핵심 개념 정리
static은 클래스가 공유하는 멤버를 만들고,final은 필드의 재대입이나 메소드의 재정의를 제한한다.- 정적 필드와 정적 블록은 클래스 초기화 때 한 번, 인스턴스 필드·블록과 생성자는 객체를 만들 때마다 실행된다.
- 오버로딩은 인수 목록에 맞는 선언을 고르는 문제이고, 오버라이딩은 상속 관계에서 실제 객체의 구현을 고르는 문제다.
- 포함은 has-a, 상속은 is-a로 검사하며, 상속받은 객체 구조와 현재 위치의 접근 권한은 별도로 판단한다.
this는 현재 객체,super는 그 객체의 부모 부분을 기준으로 같은 이름의 멤버를 구분한다.- 생성자 위임은 첫 문장에서 이루어지고, 메소드 체이닝은 각 호출이 다음 수신자 객체를 반환할 때 이어진다.
클래스 코드를 만나면 멤버의 소유자를 표시하고 → 클래스 사이의 has-a·is-a 관계를 그린 뒤 → 접근 가능한 경계를 확인하고 → 같은 이름은 오버로딩·오버라이딩·this·super 중 어느 규칙으로 선택되는지 판정하고 → 클래스 초기화에서 부모·자식 생성과 반환 연결까지 시간 순서로 추적한다. 이 흐름을 적용하면 한 문법을 따로 암기하는 데서 벗어나 객체가 어떻게 준비되고 협력하는지를 설명할 수 있다.
예상문제 10선
1. static 필드에 대한 설명으로 옳은 것은?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ③
- ① 오답: 접근 위치는 접근 제어자와 문맥에 따라 정해지며 생성자에 한정되지 않는다.
- ② 오답: 객체마다 독립적인 저장 공간을 갖는 것은 인스턴스 필드다.
- ③ 정답:
static은 멤버의 소유자를 개별 객체가 아니라 클래스로 정한다. - ④ 오답: 공유 여부를 정하는
static과 재대입을 제한하는final은 별도 지정자다.
2. 한 클래스가 처음 사용된 뒤 첫 객체를 생성할 때 초기화 흐름으로 옳은 것은?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ①
- ① 정답: 클래스 초기화를 먼저 마친 뒤 객체별 초기화와 생성자 몸체가 실행된다.
- ② 오답: 생성자 몸체는 필드와 초기화 블록보다 먼저 실행되지 않는다.
- ③ 오답: 객체별 인스턴스 블록보다 클래스의 정적 초기화가 앞선다.
- ④ 오답: 정적 블록을 객체 생성의 마지막 단계로 미룰 수 없다.
3. 다음 중 메소드 오버로딩을 성립시키는 변경은?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ④
- ① 오답: 이름이 다르면 서로 다른 일반 메소드이며 같은 이름을 재사용하는 오버로딩이 아니다.
- ② 오답: 반환형은 호출 인수만으로 구분할 수 없으므로 반환형만 다른 선언은 허용되지 않는다.
- ③ 오답: 상속 관계에서 같은 시그니처의 구현을 바꾸는 것은 오버라이딩이다.
- ④ 정답: 오버로딩은 같은 이름과 서로 구별되는 매개변수 목록을 필요로 한다.
4. Shape s = new Triangle();이고 Triangle이 getArea(h, w)를 h * w * 0.5로 오버라이딩했다. s.getArea(6.0, 5.0)의 결과는?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ②
- ① 오답: 높이와 너비를 더하는 계산이 아니며 주어진 구현의 곱셈을 적용해야 한다.
- ② 정답: 실제 객체가
Triangle이므로 재정의 구현을 실행해6.0 × 5.0 × 0.5 = 15.0이다. - ③ 오답:
h * w만 계산한 값으로 삼각형의 0.5 계수를 누락했다. - ④ 오답: 부모형 참조가 자식 객체를 가리키고 재정의 메소드를 호출하는 것은 허용된다.
5. Car가 Engine 객체를 부품으로 사용하도록 모델링할 때 가장 자연스러운 선언은?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ①
- ① 정답: 자동차가 엔진을 가진다는 has-a 관계는 엔진 객체를 필드로 포함해 표현한다.
- ② 오답: 자동차는 엔진의 한 종류가 아니므로 is-a를 뜻하는 상속이 의미에 맞지 않는다.
- ③ 오답: 엔진 역시 자동차의 한 종류가 아니며 관계 방향도 요구와 반대다.
- ④ 오답:
static을 더해도 부적절한 is-a 관계가 has-a 관계로 바뀌지 않는다.
6. 부모 클래스의 private int balance;를 자식 클래스 메소드에서 balance = 10;으로 직접 대입했을 때의 진단은?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ③
- ① 오답: 자식 객체에는 부모 부분이 포함되며 문제는 객체 존재 여부가 아니라 접근 권한이다.
- ② 오답: 같은 패키지 여부와 관계없이
private접근은 선언한 클래스 내부로 제한된다. - ③ 정답: 상속된 객체 구조와 소스 코드에서의 직접 접근 가능성은 별개의 판단이다.
- ④ 오답: 상속은 부모가 선언한 접근 제어자를 자동으로 변경하지 않는다.
7. 자식 클래스에 부모와 같은 이름의 필드 x가 있을 때 this.x와 super.x의 의미로 옳은 것은?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ②
- ① 오답:
this는 현재 객체에서 보이는 자식 선언을 기준으로 찾는다. - ② 정답: 두 키워드는 같은 객체 안에서 멤버를 찾는 기준 층을 각각 현재 클래스와 부모 클래스로 지정한다.
- ③ 오답: 두 표현 모두 객체의 필드를 한정하며 지역 변수나 정적 여부를 자동 지정하지 않는다.
- ④ 오답:
this와super는 특정 객체가 없는 정적 문맥에서 사용할 수 없다.
8. 부모 클래스에 Parent(int n)만 있고 매개변수 없는 생성자는 없다. 자식 생성자가 정상 컴파일되기 위해 첫 문장에서 해야 할 일은?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ④
- ① 오답: 자식 생성자 몸체가 진행되기 전에 부모 생성자 호출이 먼저 성립해야 한다.
- ② 오답:
super()계열 호출은 생성자의 첫 문장에만 올 수 있고 해당 부모 생성자도 존재하지 않는다. - ③ 오답: 묵시적으로 삽입되는
super()가 호출할 매개변수 없는 부모 생성자가 없어 오류가 난다. - ④ 정답: 첫 문장에서 실제 존재하는
Parent(int)생성자에 필요한 값을 전달해야 한다.
9. profile.setName("서연").setAge(22)가 가능하도록 setName()이 갖춰야 할 핵심 조건은?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ③
- ① 오답:
void는 다음 호출의 수신자 객체를 제공하지 못하므로 체이닝이 끊긴다. - ② 오답: 정수 반환값에는
Profile의setAge()를 호출할 수 없다. - ③ 정답: 보통
return this;로 현재 객체를 반환하여 다음 인스턴스 메소드를 이어 호출한다. - ④ 오답: 필드 변경과 반환값은 별개이며 반환할 객체가 없으면 점 뒤의 호출을 연결할 수 없다.
10. 상속 코드의 실행 결과를 추적하는 순서로 가장 적절한 것은?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ①
- ① 정답: 공간적 관계를 먼저 확정하고 실제 구현 선택과 시간적 실행 순서를 뒤이어 추적하는 절차다.
- ② 오답: 이름만 보면
static, 오버라이딩과 같은 이름 가림을 구별할 근거가 부족하다. - ③ 오답: 클래스 멤버와 접근 제어를 무시하면 컴파일 가능 여부부터 잘못 판정한다.
- ④ 오답: 반환형만으로 오버로딩하지 못하고 정적 초기화는 클래스당 한 번이며 부모 생성자는 생략되지 않는다.
참고 자료와 작성 기준
이 글은 해당 차시 강의자료를 바탕으로 학습 목적에 맞게 재구성한 비공식 학습자료입니다. 개념 관계, 예제와 문제 해설은 학습자의 이해를 돕도록 구성하고 검토했습니다.
- 작성·편집: 올에이클래스 학습연구팀
- 주요 근거: 한국방송통신대학교 컴퓨터과학과 Java프로그래밍 4강 「클래스와 상속(2)」 강의자료(교재 3장-2, PDF 메타데이터 기준 2024년)
- 보충 자료: 외부 보충 자료를 사용하지 않음
- 편집 원칙: 올에이클래스 편집 정책
- 최종 내용 검토: 2026-09-01
댓글
댓글 쓰기