728x90
반응형
문제
다음은 자바 코드이다. 출력 결과를 쓰시오.
class A {
private int a;
public A(int a) {
this.a = a;
}
public void display() {
System.out.println("a=" + a);
}
}
class B extends A {
public B(int a) {
super(a);
super.display();
}
}
public class good {
public static void main(String[] args) {
B obj = new B(10);
}
}
정답
a = 10
해설
✔ 코드 전체 흐름
이 코드는 크게 3개의 부분으로 나뉘어 있습니다.
- 클래스 A: 인스턴스 변수 a와 이를 초기화하는 생성자 및 값을 출력하는 display() 메서드를 가진 부모 클래스입니다.
- 클래스 B: 클래스 A를 상속받아 부모 클래스의 기능을 확장하고 있는 자식 클래스입니다.
- 클래스 good: 자바 애플리케이션이 실행되는 진입점인 main() 메서드를 포함한 실행 클래스입니다.
이 프로그램의 실행 흐름은 main() 메서드에서 시작됩니다. 이때 B 클래스의 객체가 생성되고, 그 과정에서 부모 클래스 A의 생성자와 메서드가 호출됩니다.
코드 흐름 순서 :
- 클래스 good : B obj = new B(10);에서 클래스 B의 객체가 생성됩니다.
- 클래스 B : 클래스 B의 생성자가 호출됩니다. 이때 super(a)를 통해 부모 클래스 A의 생성자가 호출되어 a가 10으로 초기화됩니다.
- 클래스 A : 부모 클래스 A의 display() 메서드가 호출되어 a = 10이 출력됩니다.
✔ 코드 세부 설명
📌 class A
class A {
private int a;
public A(int a) {
this.a = a;
}
public void display() {
System.out.println("a=" + a);
}
}
1. class A {
- 자바에서 **클래스(Class)**는 **객체(Object)**를 정의하는 일종의 설계도 또는 청사진이라고 할 수 있습니다. 객체지향 프로그래밍에서 객체는 클래스에 정의된 속성(변수)과 기능(메서드)을 가진 실체이며, 클래스는 이러한 객체를 생성하기 위한 구조와 동작 방식을 정의합니다.
- class A는 자바에서 클래스 A를 정의하는 부분입니다. 클래스 A는 앞으로 이 프로그램에서 하나의 데이터 타입처럼 사용될 수 있습니다.
2. private int a;
- 클래스 A의 속성 중 하나인 a를 선언한 부분입니다. private으로 선언했기 때문에, 클래스 외부에서 직접 접근할 수 없습니다. 클래스 내부에서만 사용 가능하며, 외부에서 값을 설정하거나 가져오려면 메서드를 통해 접근해야 합니다.
- 인스턴스 변수란 객체가 생성될 때 각각의 객체마다 따로 저장되는 변수입니다. 즉, 객체가 여러 개 생성되면, 각각의 객체마다 자신만의 a 값을 가지게 됩니다.
- 클래스와 객체의 관계
- 클래스는 객체를 만드는 틀이고, 객체는 이 틀을 기반으로 만들어진 실제 데이터와 동작을 담고 있는 실체입니다. 예를 들어, 클래스를 통해 자동차라는 개념을 정의하면, 객체는 실제로 존재하는 특정 자동차입니다. 클래스 A는 a라는 속성을 가지고 있으며, 이 클래스의 객체를 생성하면 그 객체는 자신만의 a 값을 가지게 됩니다.
- 아래 코드에서 obj1과 obj2는 각각 다른 값을 가지는 객체입니다. obj1.display()를 호출하면 a = 10이 출력되고, obj2.display()를 호출하면 a = 20이 출력됩니다.
A obj1 = new A(10); // 첫 번째 객체, a = 10
A obj2 = new A(20); // 두 번째 객체, a = 20
3. public A(int a) {
- 생성자(Constructor):
- 이 줄은 클래스 A의 생성자를 정의한 부분입니다. 생성자는 객체가 생성될 때 자동으로 호출되며, 객체의 초기 상태를 설정하는 역할을 합니다. 여기서는 객체가 생성될 때 매개변수로 받은 값을 인스턴스 변수 a에 저장하도록 되어 있습니다.
- 예를 들어, A obj = new A(10);처럼 객체를 생성하면, 생성자 A(int a)가 호출되어 a에 10이 저장됩니다.
4. this.a = a;
- this 키워드:
- this.a는 클래스 A의 인스턴스 변수 a를 나타냅니다. this는 현재 객체를 가리키는 특별한 키워드로, 인스턴스 변수와 매개변수의 이름이 같을 때 혼동을 방지하기 위해 사용됩니다.
- 이 코드는 매개변수 a의 값을 현재 객체의 인스턴스 변수 a에 저장하는 역할을 합니다. 즉, 전달된 값으로 객체의 속성 a를 초기화합니다.
5. public void display() {
- 메서드 display():
- 이 메서드는 인스턴스 변수 a의 값을 출력하는 역할을 합니다. void는 이 메서드가 반환값을 가지지 않는다는 의미입니다.
- 메서드 display()를 호출하면, 인스턴스 변수 a에 저장된 값이 System.out.println("a=" + a);을 통해 출력됩니다.
- System.out.println("a=" + a);
- 이 줄은 출력문입니다. System.out.println()은 콘솔에 값을 출력하는 역할을 하며, "a=" + a는 문자열과 변수 a의 값을 결합하여 출력합니다. 예를 들어, a의 값이 10이라면, a=10이라는 문자열이 출력됩니다.
반응형
📌 class B
class B extends A {
public B(int a) {
super(a);
super.display();
}
}
1. class B extends A {
- 이 줄은 클래스 B를 정의하고 있습니다. extends A는 클래스 B가 클래스 A를 상속받는다는 것을 의미합니다. 상속은 객체지향 프로그래밍에서 부모 클래스의 속성과 메서드를 자식 클래스가 물려받아 사용할 수 있도록 하는 기능입니다. 즉, 상속을 통해 클래스 B가 클래스 A의 모든 필드와 메서드를 사용할 수 있다는 의미이며 B는 부모 클래스 A의 속성을 물려받고, 필요에 따라 기능을 확장하거나 수정할 수 있습니다.
2. public B(int a) {
- 클래스 B의 생성자입니다. 클래스 A의 생성자와 동일하게 매개변수 a를 전달받으며, 이 값을 부모 클래스에 전달하여 초기화합니다.
- 생성자는 객체가 생성될 때 호출되는 특별한 메서드입니다. 클래스 B의 객체가 만들어질 때 B obj = new B(10);와 같이 생성자가 호출되며, 이때 매개변수로 전달된 값(여기서는 10)이 a로 전달됩니다.
3. super(a);
- super(a) 호출:
- super 키워드는 자식 클래스에서 부모 클래스의 생성자나 메서드를 호출할 때 사용합니다. 여기서 super(a)는 부모 클래스 A의 **생성자 A(int a)**를 호출하는 코드입니다.
- 이 호출은 자식 클래스 B가 부모 클래스 A를 상속받았으므로, 부모 클래스 A의 생성자 A(int a)를 호출하여, 부모 클래스의 필드 a를 초기화합니다.
- super(a)의 역할:
- 클래스 B가 생성될 때, super(a)를 통해 클래스 A의 생성자가 먼저 호출되고, A 클래스의 인스턴스 변수 a가 초기화됩니다.
- 즉, 부모 클래스의 생성자가 먼저 실행되어, 클래스 A의 인스턴스 변수 a에 전달된 값(여기서는 10)이 저장됩니다.
4. super.display();
- 부모 클래스 A의 display() 메서드 호출:
- **super.display();**는 부모 클래스 A의 display() 메서드를 호출하는 코드입니다. 상속을 통해 클래스 B는 부모 클래스 A의 모든 메서드를 상속받았으므로, super 키워드를 통해 명시적으로 부모 클래스의 메서드를 호출할 수 있습니다.
- super.display();를 호출하면, A 클래스의 display() 메서드가 실행되어 인스턴스 변수 a의 값이 출력됩니다. 즉, 부모 클래스 A의 display() 메서드를 호출하여 이를 통해 System.out.println("a=" + a);가 실행되며, 현재 a의 값이 출력됩니다. 이 경우 부모 클래스에서 저장한 a의 값인 10이 출력됩니다.
- 상속된 메서드 호출:
- 자식 클래스 B에서 부모 클래스의 메서드를 호출할 때 **super**를 사용하면, 부모 클래스에서 정의된 동작을 그대로 실행할 수 있습니다. 이 경우, B 클래스는 A 클래스의 동작을 확장하면서도, A 클래스에서 정의된 기능을 그대로 재사용합니다.
728x90
📌 class good
public class good {
public static void main(String[] args) {
B obj = new B(10);
}
}
good 클래스는 자바 프로그램의 **진입점(entry point)**인 main() 메서드를 포함한 부분입니다. 자바 애플리케이션은 항상 main() 메서드로부터 실행이 시작되기 때문에, 이 부분이 프로그램의 실행 흐름을 결정하는 중요한 역할을 합니다.
1. public class good {
- 클래스 good은 실행할 수 있는 메인 클래스입니다. public 접근 제어자는 어디서든 이 클래스를 사용할 수 있다는 의미입니다. 자바 프로그램에서 main 메서드를 포함한 클래스는 프로그램의 시작점을 나타냅니다.
2. public static void main(String[] args) {
- 이 줄은 자바 애플리케이션의 실행이 시작되는 지점인 main() 메서드를 정의한 부분입니다. 자바 프로그램은 항상 main() 메서드를 찾아서 실행하며, main()이 없으면 프로그램은 실행되지 않습니다.
- public: 이 메서드는 어디서든 접근할 수 있도록 공개 범위를 설정합니다.
- static: 이 메서드는 프로그램 실행 시 클래스의 인스턴스를 생성하지 않고도 호출될 수 있음을 의미합니다. 즉, good 클래스의 객체를 만들지 않아도 main() 메서드를 바로 실행할 수 있습니다.
- void: 이 메서드는 반환값이 없음을 나타냅니다. main() 메서드는 프로그램의 진입점이므로, 반환값이 필요 없습니다.
3. B obj = new B(10);
- 객체 생성 (new 키워드):
- 이 코드는 클래스 B의 새로운 객체를 생성하는 과정입니다.
- new B(10)은 B 클래스의 생성자를 호출하여 객체를 생성하고, 이 객체는 obj라는 이름으로 사용됩니다.
- 즉, **B obj**는 "B 클래스에서 생성된 객체를 가리키는 변수"입니다.
- 생성자 호출:
- **new B(10)**은 **B 클래스의 생성자 B(int a)**를 호출합니다. 이때 정수 값 10이 인수로 전달됩니다.
- super(10) 호출:
- B 클래스의 생성자가 실행되면서, **super(10)**을 호출하여 부모 클래스 A의 생성자가 실행됩니다.
- 이때, **A 클래스의 인스턴스 변수 a**는 10으로 초기화됩니다.
- 출력:
- **super.display()**가 호출되어 부모 클래스 A의 display() 메서드가 실행됩니다.
- 이 메서드는 인스턴스 변수 a의 값인 **a = 10**을 출력합니다.
이 코드의 결과로 **a = 10**이 출력됩니다.
✔ 정리
- 클래스 A 생성자 호출:
- new B(10)이 실행되면서 먼저 클래스 B의 생성자가 호출됩니다.
- 클래스 B의 생성자 안에서 super(a)가 호출되어 클래스 A의 생성자가 실행됩니다.
- 이때 부모 클래스 A의 생성자는 전달받은 값 10을 this.a에 저장하게 됩니다. 즉, 부모 클래스 A의 인스턴스 변수 a가 10으로 초기화됩니다.
- 클래스 A의 display() 메서드 호출:
- 부모 클래스의 생성자가 완료된 후, super.display()가 호출됩니다.
- 이 메서드는 클래스 A의 display() 메서드를 호출하여 a의 값을 출력합니다.
- 결과적으로 **a = 10**이 콘솔에 출력됩니다.
더 간단하게 정리하자면
- 클래스 A는 a라는 인스턴스 변수를 가지고 있으며, 이를 출력하는 display() 메서드를 가지고 있습니다.
- 클래스 B는 클래스 A를 상속받아, 객체 생성 시 부모 클래스 A의 생성자와 display() 메서드를 호출하여 a 값을 출력합니다.
- B obj = new B(10);에서 객체가 생성될 때, 부모 클래스 A의 생성자가 먼저 실행되고, 그 후 a = 10이 출력됩니다.
이 코드의 전체적인 동작은 상속을 활용하여 부모 클래스의 생성자와 메서드를 호출해 값을 출력하는 과정입니다.
"이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다."
728x90
반응형
'코딩일기 > 자격증' 카테고리의 다른 글
[정보처리기사] EAI(Enterprise Application Integration) 구축 유형 | 정보처리기사 실기 기출문제 (0) | 2024.10.29 |
---|---|
[정보처리기사] [ C ] while문 | 2020년 정보처리기사 기출문제 (0) | 2024.10.16 |
[정보처리기사] LOD (Linked Open Data)란? | 정보처리기사 실기 기출문제 (0) | 2024.10.14 |
[정보처리기사] 운영체제 기본 명령어(UNIX/LINUX)| chmod 명령어 | 정보처리기사 실기 기출문제 (0) | 2024.10.14 |
[정보처리기사] SQL Injection이란? | 정보처리기사 실기 기출문제 (0) | 2024.10.14 |