
출력결과 상세하게 단계별 설명
이 코드는 자바에서 **익명 클래스(Anonymous Class)**와 **변수의 스코프(Scope)**를 활용한 예제입니다. 출력 결과를 단계별로 분석해 보겠습니다.
---
## 코드 분석
### 1. 클래스와 변수 선언
- `Test` 클래스에는 `public final int a = 10;`가 선언되어 있습니다.
- 이는 `Test` 클래스의 인스턴스 변수이며, 상수처럼 동작합니다.
- `final`로 선언되었기 때문에 변경할 수 없습니다.
### 2. `runIt()` 메서드 내부
- `runIt()` 메서드에서 지역 변수 `int a = 20;`가 선언됩니다.
- 이 변수는 메서드의 로컬 스코프에 속합니다.
- 익명 클래스가 생성됩니다:
```java
Runnable b = new Runnable() {
public final int a = 30;
public void run() {
int a = 40;
System.out.println(this.a);
}
};
```
- 익명 클래스 내부에는 또 다른 `a` 변수가 있습니다:
- `public final int a = 30;`: 익명 클래스의 인스턴스 변수입니다.
- `int a = 40;`: 익명 클래스의 `run()` 메서드 내부에 선언된 지역 변수입니다.
### 3. `b.run()` 호출
- `b.run()`을 호출하면 익명 클래스의 `run()` 메서드가 실행됩니다.
- 이 메서드에서 실행되는 코드는 다음과 같습니다:
```java
System.out.println(this.a);
```
- 여기서 `this.a`는 익명 클래스의 인스턴스 변수인 `public final int a = 30;`을 참조합니다.
- 이유: 자바에서 `this`는 현재 객체(익명 클래스)를 참조하므로, 해당 객체의 멤버 변수를 가리킵니다.
---
## 단계별 실행 과정
1. **`Test` 클래스의 객체 생성**
```java
Test c = new Test();
```
- 새로운 객체가 생성되고, `a = 10`이 초기화됩니다.
2. **`runIt()` 메서드 호출**
```java
c.runIt();
```
- 지역 변수 `a = 20;`이 선언되지만, 이는 이후 코드에서 사용되지 않습니다.
- 익명 클래스가 생성되며, 해당 클래스에는 인스턴스 변수 `a = 30;`이 정의됩니다.
3. **익명 클래스의 `run()` 실행**
```java
b.run();
```
- 익명 클래스 내부에서 지역 변수 `a = 40;`이 선언되지만, 출력문에서는 사용되지 않습니다.
- 출력문에서 사용된 것은 익명 클래스의 인스턴스 변수인 `this.a`, 즉 `30`입니다.
---
## 출력 결과
```
30
```
---
## 추가 설명: 변수 우선순위
자바에서는 동일 이름을 가진 변수가 여러 스코프에 존재할 경우, 다음과 같은 우선순위로 참조됩니다:
1. **메서드 내부 지역 변수** (가장 가까운 스코프)
2. **현재 객체의 인스턴스 변수** (`this` 키워드 사용 시)
3. **외부 클래스의 인스턴스 변수** (`OuterClassName.this` 형식으로 참조 가능)
따라서 위 코드에서는:
- 지역 변수 `int a = 40;`은 무시되고,
- 익명 클래스의 인스턴스 변수인 `this.a = 30;`이 출력됩니다.
'도전기 > PE' 카테고리의 다른 글
java 결과 해석 (0) | 2025.04.13 |
---|---|
ER다이어그램을 관계모델로 (0) | 2025.03.13 |
파이썬코드 출력 결과 (1) | 2025.03.10 |
ITIL4.0 7대 원칙 (0) | 2025.03.10 |
코드 리팩토링 유형 (0) | 2025.03.07 |