Java ‐ 중첩 클래스, 내부 클래스, 지역 클래스, 익명 클래스 - dnwls16071/Backend_Study_TIL GitHub Wiki
📚 정적 중첩 클래스
- 정적 중첩 클래스는
static
이 붙는다.
public class NestedOuter {
private static int outClassValue = 1;
private int outInstanceValue = 2;
static class Nested {
private int nestedInnerInstanceValue = 3;
public void print() {
System.out.println("nestedInnerInstanceValue = " + nestedInnerInstanceValue); // 자신의 멤버 변수에 접근
// System.out.println("outInstanceValue = " + outInstanceValue); // 바깥 클래스의 멤버 변수에 접근 불가능
System.out.println("outClassValue = " + outClassValue); // 바깥 클래스의 클래스 멤버에 접근
}
}
}
📚 내부 클래스
- 정적 중첩 클래스는 바깥 클래스와 서로 관계가 없으나 내부 클래스는 바깥 클래스의 인스턴스를 이루는 요소가 된다.
static
이 붙지 않으며, 바깥 클래스의 인스턴스에 소속된다.
public class InnerOuter {
private static int outClassValue = 1;
private int outInstanceValue = 2;
class Inner {
private int innerInstanceValue = 3;
public void print() {
System.out.println("innerInstanceValue = " + innerInstanceValue); // 자신의 멤버 변수에 접근 가능
System.out.println("outInstanceValue = " + outInstanceValue); // 바깥 클래스 멤버 변수에 접근 가능
System.out.println("outClassValue = " + outClassValue); // 바깥 클래스의 클래스 멤버에 접근 가능
}
}
}
📚 지역 클래스
public class Outer {
private int outInstanceValue = 3;
public void process(int paramVar) {
int localVar = 1;
class Local {
int value = 0;
public void printData() {
System.out.println("outInstanceValue = " + Outer.this.outInstanceValue); // 바깥 클래스 인스턴스 멤버 접근 가능
System.out.println("paramVar = " + paramVar); // 코드 블럭의 매개변수에 접근 가능
System.out.println("localVar = " + localVar); // 코드 블럭의 지역 변수에 접근 가능
System.out.println("value = " + value); // 자신의 인스턴스 변수에 접근 가능
}
}
Local local = new Local();
local.printData();
}
}
❗각 변수의 생명 주기
메서드 영역 :
static
이 붙은 변수(클래스 변수)는 메서드 영역에 존재한다. 프로그램 종료 시까지 관리된다. 힙 영역 : 생성된 인스턴스는 힙 영역에 존재한다. GC 되기 전까지 존재한다. 스택 영역 : 메서드 호출이 끝나면 사라진다.(지역 변수 포함)
지역 변수가 인스턴스 변수보다 생명주기가 매우 짧고 스택 영역에서 메서드가 종료되면 비워지기 때문에 힙 영역의 인스턴스가 스택 영역에 있는 지역 변수를 찾을 수 없는데도 불구하고 정상적으로 동작하는 것을 볼 수 있는데 이는 지역 변수 캡처로 가능한 것이다. 지역 변수 캡처는 인스턴스를 생성할 때 필요한 지역 변수를 복사해서 보관하는 것을 말한다. 정확히 말하면 힙 영역에 있는 인스턴스가 캡처된 지역 변수에 접근하는 것이다. 이 때, 지역 변수는
final
키워드가 붙은 것과 같아 변경이 불가능하다.
📚 익명 클래스
- 익명 클래스는 단 한 번만 인스턴스를 생성할 수 있다.
- 익명 클래스는 이름이 없는 지역 클래스이다.
public class Anonymous {
private static int outerClassValue = 1;
private int outerInstanceValue = 2;
public void process(int paramVar) {
// 선언과 생성을 한 번에(이름 없이)
// Printer : 인터페이스
Printer printer = new Printer() {
int value = 0;
@Override
public void print() {
System.out.println(value);
System.out.println(paramVar);
System.out.println(outerInstanceValue);
System.out.println(outerClassValue);
}
};
printer.print();
}
}