8 중첩 클래스, 내부 클래스2

 1  8 중첩 클래스, 내부 클래스2-1
 2  8 중첩 클래스, 내부 클래스2-2
 3  8 중첩 클래스, 내부 클래스2-3
 4  8 중첩 클래스, 내부 클래스2-4
 5  8 중첩 클래스, 내부 클래스2-5
 6  8 중첩 클래스, 내부 클래스2-6
 7  8 중첩 클래스, 내부 클래스2-7
 8  8 중첩 클래스, 내부 클래스2-8
 9  8 중첩 클래스, 내부 클래스2-9
 10  8 중첩 클래스, 내부 클래스2-10
 11  8 중첩 클래스, 내부 클래스2-11
 12  8 중첩 클래스, 내부 클래스2-12
 13  8 중첩 클래스, 내부 클래스2-13
 14  8 중첩 클래스, 내부 클래스2-14
 15  8 중첩 클래스, 내부 클래스2-15
 16  8 중첩 클래스, 내부 클래스2-16
 17  8 중첩 클래스, 내부 클래스2-17
 18  8 중첩 클래스, 내부 클래스2-18
 19  8 중첩 클래스, 내부 클래스2-19
 20  8 중첩 클래스, 내부 클래스2-20
※ 미리보기 이미지는 최대 20페이지까지만 지원합니다.
  • 분야
  • 등록일
  • 페이지/형식
  • 구매가격
  • 적립금
자료 다운로드  네이버 로그인
소개글
8 중첩 클래스, 내부 클래스2에 대한 자료입니다.
본문내용
8. 중첩 클래스, 내부 클래스2
#1.인강/0.자바/3.자바-중급1편
[[/지역 클래스 - 시작]]
[[/지역 클래스 - 지역 변수 캡처1]]
[[/지역 클래스 - 지역 변수 캡처2]]
[[/지역 클래스 - 지역 변수 캡처3]]
[[/익명 클래스 - 시작]]
[[/익명 클래스 활용1]]
[[/익명 클래스 활용2]]
[[/익명 클래스 활용3]]
[[/문제와 풀이1]]
[[/문제와 풀이2]]
[[/정리]]
지역 클래스 - 시작
지역 클래스(Local class)는 내부 클래스의 특별한 종류의 하나이다. 따라서 내부 클래스의 특징을 그대로 가진
다. 예를 들어서 지역 클래스도 내부 클래스이므로 바깥 클래스의 인스턴스 멤버에 접근할 수 있다.
지역 클래스는 지역 변수와 같이 코드 블럭 안에서 정의된다.
**지역 클래스 예**
```java
class Outer {
public void process() {
//지역 변수
int localVar = 0;
//지역 클래스
class Local {...}
Local local = new Local();
}
}
```
**지역 클래스의 특징**
지역 클래스는 지역 변수처럼 코드 블럭 안에 클래스를 선언한다.
지역 클래스는 지역 변수에 접근할 수 있다.
지역 클래스 예제1
```java
package nested.local;
public class LocalOuterV1 {
private int outInstanceVar = 3;
public void process(int paramVar) {
int localVar = 1;
class LocalPrinter {
int value = 0;
public void printData() {
System.out.println("value=" + value);
System.out.println("localVar=" + localVar);
System.out.println("paramVar=" + paramVar);
System.out.println("outInstanceVar=" + outInstanceVar);
}
}
LocalPrinter printer = new LocalPrinter();
printer.printData();
}
public static void main(String[] args) {
LocalOuterV1 localOuter = new LocalOuterV1();
localOuter.process(2);
}
}
```
**실행 결과**
```
value=0
localVar=1
paramVar=2
outInstanceVar=3
```
**지역 클래스의 접근 범위**
자신의 인스턴스 변수인 `value `에 접근할 수 있다.
자신이 속한 코드 블럭의 지역 변수인 `localVar `에 접근할 수 있다.
자신이 속한 코드 블럭의 매개변수인 `paramVar `에 접근할 수 있다. 참고로 매개변수도 지역 변수의 한 종류이
다.
바깥 클래스의 인스턴스 멤버인 `outInstanceVar `에 접근할 수 있다. (지역 클래스도 내부 클래스의 한 종류이
다.)
지역 클래스는 지역 변수 처럼 접근 제어자를 사용할 수 없다.
지역 클래스 예제2
당연한 이야기지만 내부 클래스를 포함한 중첩 클래스들도 일반 클래스처럼 인터페이스를 구현하거나, 부모 클래스를
상속할 수 있다.
지역 클래스를 통해 사용 예를 알아보자.
```java
package nested.local;
public interface Printer {
void print();
}
```
java
package nested.local;
public class LocalOuterV2 {
private int outInstanceVar = 3;
public void process(int paramVar) {
int localVar = 1;
class LocalPrinter implements Printer {
int value = 0;
@Override
public void print() {
System.out.println("value=" + value);
System.out.println("localVar=" + localVar);
System.out.println("paramVar=" + paramVar);
System.out.println("outInstanceVar=" + outInstanceVar);
}
}
Printer printer = new LocalPrinter();
printer.print();
}
public static void main(String[] args) {
LocalOuterV2 localOuter = new LocalOuterV2();
localOuter.process(2);
}
}
```
**실행 결과**
```
value=0
localVar=1
paramVar=2
outInstanceVar=3
```
단순히 `Printer ` 인터페이스만 추가하고 구현했기 때문에 이해하는데 어려움은 없을 것이다.
지역 클래스 - 지역 변수 캡처1
**참고**
지금부터 설명할 지역 변수 캡처에 관한 내용은 너무 깊이있게 이해하지 않아도 된다. 이해가 어렵다면 단순하게
지역 클래스가 접근하는 지역 변수의 값은 변경하면 안된다 정도로 이해하면 충분하다.
지역 클래스를 더 자세히 알아보기 전에 잠시 변수들의 생명 주기에 대해서 정리해보자.
**변수의 생명 주기**
**클래스 변수**: 프로그램 종료 까지, 가장 길다(메서드 영역)
클래스 변수(static 변수)는 메서드 영역에 존재하고, 자바가 클래스 정보를 읽어 들이는 순간부터 프로그램
종료까지 존재한다.
**인스턴스 변수**: 인스턴스의 생존 기간(힙 영역)
인스턴스 변수는 본인이 소속된 인스턴스가 GC 되기 전까지 존재한다. 생존 주기가 긴 편이다.
**지역 변수**: 메서드 호출이 끝나면 사라짐(스택 영역)
지역 변수는 스택 영역의 스택 프레임 안에 존재한다. 따라서 메서드가 호출 되면 생성되고, 메서드 호출이
종료되면 스택 프레임이 제거되면서 그 안에 있는 지역 변수도 모두 제거된다. 생존 주기가 아주 짧다. 참고
로 매개변수도 지역 변수의 한 종류이다.
지역 클래스 예제3
지금까지 작성한 지역 클래스 예제를 약간 수정해서 새로 만들어보자.
```java
package nested.local;
public class LocalOuterV3 {
private int outInstanceVar = 3;
public Printer process(int paramVar) {
int localVar = 1; //지역 변수는 스택 프레임이 종료되는 순간 함께 제거된다.
class LocalPrinter implements Printer {
int value = 0;
@Override
public void print() {
System.out.println("value=" + value);
//인스턴스는 지역 변수보다 더 오래 살아남는다.
System.out.println("localVar=" + localVar);
System.out.println("paramVar=" + paramVar);
System.out.println("outInstanceVar=" + outInstanceVar);
}
}
Printer printer = new LocalPrinter();
//printer.print()를 여기서 실행하지 않고 Printer 인스턴스만 반환한다.
return printer;
}
public static void main(String[] args) {
LocalOuterV3 localOuter = new LocalOuterV3();
Printer printer = localOuter.process(2);
//printer.print()를 나중에 실행한다. process()의 스택 프레임이 사라진 이후에 실행
printer.print();
}
}
```
`process() `는 `Printer ` 타입을 반환한다. 여기서는 `LocalPrinter ` 인스턴스를 반환한다.
여기서는 `LocalPrinter.print() ` 메서드를 `process() ` 안에서 실행하는 것이 아니라 `process() ` 메
서드가 종료된 이후에 `main() ` 메서드에서 실행한다.
**실행 결과**
```
value=0
localVar=1
paramVar=2
outInstanceVar=3
```
이 예제를 실행하면서 뭔가 이상한 느낌이 들었다면 제대로 공부를 하고 있는 것이다.
예제 코드를 메모리 그림과 함께 분석해보자.
**LocalPrinter 인스턴스 생성 직후 메모리 그림**
**지역 클래스 인스턴스의 생존 범위**
지역 클래스로 만든 객체도 인스턴스이기 때문에 힙 영역에 존재한다. 따라서 GC 전까지 생존한다.
`LocalPrinter ` 인스턴스는 `process() ` 메서드 안에서 생성된다. 그리고 `process() `에서 `main() `
으로 생성한 `LocalPrinter ` 인스턴스를 반환하고 `printer ` 변수에 참조를 보관한다. 따라서
`LocalPrinter ` 인스턴스는 `main() `이 종료될 때 까지 생존한다.
`paramVar `, `localVar `와 같은 지역 변수는 `process() ` 메서드를 실행하는 동안에만 스택 영역에서 생존한
다. `process() ` 메서드가 종료되면 `process() ` 스택 프레임이 스택 영역에서 제거 되면서 함께 제거된다.
**LocalPrinter.print() 접근 메모리 그림**
`LocalPrinter ` 인스턴스는 `print() ` 메서드를 통해 힙 영역에 존재하는 바깥 인스턴스의 변수인
`outInstanceVar `에 접근한다. 이 부분은 인스턴스의 필드를 참조하는 것이기 때문에 특별한 문제가 없다.
`LocalPrinter ` 인스턴스는 `print() ` 메서드를 통해 스택 영역에 존재하는 지역 변수도 접근하는 것 처럼 보
인다. 하지만 스택 영역에 존재하는 지역 변수를 힙 영역에 있는 인스턴스가 접근하는 것은 생각처럼 단순하지 않
다.
**process() 메서드의 종료**
지역 변수의 생명주기는 매우 짧다. 반면에 인스턴스의 생명주기는 GC 전까지 생존할 수 있다.
지역 변수
하고 싶은 말
김영한의 실전 자바 중급 1편 김영한의 실전 자바 중급 1편 김영한의 실전 자바 중급 1편