private static 변수의 특징public class NestedOuter {
private static int outClassValue = 3;
private int outInstanceValue = 2;
// 정적 중첩 클래스는 다른 클래스를 단순히 중첩해 둔 것일 뿐임.
// 쉽게 이야기해서, 둘은 아무런 관계가 없음.
// 같은 클래스에 있으니, 정적 중첩 클래스에서 외부클래스의 private에 접근할 수 있다는 특징이 있을 뿐임.
static class Nested {
private int nestedInstanceValue = 1;
public void print() {
// 자신의 멤버에 접근
System.out.println(nestedInstanceValue);
// 바깥 클래스의 인스턴스 멤버는 접근할 수 없음 (인스턴스를 모르므로)
// System.out.println(outInstanceValue);
// 바깥 클래스의 클래스 멤버에는 접근할 수 있음
System.out.println(outClassValue);
}
}
}
private static int outClassValue와 같은 변수는 다음과 같은 특징을 가집니다.
static 키워드:
NestedOuter 클래스가 JVM의 메서드 영역(Method Area)에 로드될 때 단 한 번 생성됩니다.NestedOuter 클래스의 인스턴스(객체)를 생성하지 않고도 NestedOuter.outClassValue와 같이 클래스 이름을 통해 직접 접근할 수 있습니다.private 접근 제어자:
NestedOuter 클래스 내부에서만 접근이 허용됩니다.NestedOuter 클래스 자체의 메서드뿐만 아니라, 그 안에 선언된 중첩 클래스(예: static class Nested)도 포함합니다.NestedOuter.java 코드에서 Nested 클래스의 print() 메서드가 outClassValue에 접근할 수 있었던 이유가 바로 이것입니다.결론:
private static변수는 클래스 외부에서는 접근할 수 없지만, 클래스 내부의 어디서든 객체 생성 없이 접근할 수 있습니다.
public class NestedOuter {
private static int outClassValue = 3;
private int outInstanceValue = 2;
// 정적 중첩 클래스는 다른 클래스를 단순히 중첩해 둔 것일 뿐임.
// 쉽게 이야기해서, 둘은 아무런 관계가 없음.
// 같은 클래스에 있으니, 정적 중첩 클래스에서 외부클래스의 private에 접근할 수 있다는 특징이 있을 뿐임.
static class Nested {
private int nestedInstanceValue = 1;
public void print() {
// 자신의 멤버에 접근
System.out.println(nestedInstanceValue);
// 바깥 클래스의 인스턴스 멤버는 접근할 수 없음 (인스턴스를 모르므로)
// System.out.println(outInstanceValue);
// 바깥 클래스의 클래스 멤버에는 접근할 수 있음
System.out.println(outClassValue);
}
}
}
public class NestedOuterMain {
public static void main(String[] args) {
// NestedOuter outer = new NestedOuter(); // 필요x
NestedOuter.Nested nested = new NestedOuter.Nested();
nested.print();
System.out.println("nestedClass = " + nested.getClass());
}
}
static class Nested와 같은 정적 중첩 클래스는 다음과 같은 특징을 가집니다.
바깥 클래스 인스턴스와의 독립성:
static 키워드가 붙었기 때문에, 정적 중첩 클래스는 바깥 클래스(NestedOuter)의 특정 '인스턴스'에 종속되지 않습니다.outInstanceValue)에 직접 접근할 수 없다는 것을 의미합니다. (접근하려면 바깥 클래스의 인스턴스를 명시적으로 전달받아야 합니다.)객체 생성 방법:
new NestedOuter.Nested()와 같이 바깥 클래스 이름을 통해 직접 생성합니다.static이 없는 일반 내부 클래스(Inner Class)였다면, NestedOuter outer = new NestedOuter(); outer.new Inner();와 같이 바깥 클래스의 인스턴스를 통해 생성해야 합니다.결론: 정적 중첩 클래스는 바깥 클래스의 인스턴스와 무관하게 독립적으로 존재하며 생성될 수 있습니다.
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();
} // end of process
public static void main(String[] args) {
LocalOuterV1 localOuter = new LocalOuterV1();
localOuter.process(2);
}
}
process() 메서드 내부에 선언된 class LocalPrinter와 같은 지역 클래스는 다음과 같은 특징을 가집니다.
스코프(Scope)의 한정:
int localVar)와 동일한 스코프 규칙을 따릅니다.접근 제어자 사용 불가:
public, private, protected와 같은 접근 제어자를 사용할 수 없습니다.결론: 지역 클래스는 스코프가 메서드 내부로 한정되어 있으므로, 외부에서의 접근을 제어하는 접근 제어자가 필요 없으며 사용할 수도 없습니다.