한 번에 끝내는 Java/Spring 웹 개발 마스터
inner Class
class OutClass {
private int num = 10;
private static int sNum = 20;
private InClass inClass;
public OutClass() {
inClass = new InClass();
}
/*private*/ class InClass { // Private선언시 내부에서만 사용 가능!
int iNum = 100;
//static int sInNum = 500;는 사용할 수 없다. 정적 변수는 InClass내부에서 사용 불가능
void inTest() {
System.out.println("OutClass Num = " + num + " (외부 클래스의 인스턴스 변수)");
System.out.println("OutClass sNum = " + sNum + " (외부 클래스의 Static 변수)");
System.out.println("InClass uNum = " + iNum + " (내부 클래스의 인스턴스 변수)");
}
}
public void usingClass() {
inClass.inTest();
}
}
public class InnerTest {
public static void main(String[] args) {
OutClass outClass = new OutClass();
outClass.usingClass();
//문법적으로는 가능하지만 잘 사용하지 않는 방식
OutClass.InClass inner = outClass.new InClass();
inner.inTest();
}
}
내부적으로 사용할 클래스를 선언하는 것이고, Private으로 사용하기를 권장한다고 한다.
Private으로 사용할 경우에는,
OutClass.InClass inner = outClass.new InClass();
inner.inTest();
부분에서 오류가 나기 때문에 주의해야 한다.
Static 변수는 내부 클래스에서는 사용할 수 없다.
static class InStaticClass {
int iNum = 100;
static int sInNum = 200;
void inTest() {
//정적 클래스에서는 외부 클래스의 인스턴스 변수 사용 불가능 (외부와 상관없이 사용될수도 있기 때문)
// System.out.println("OutClass Num = " + num + " (외부 클래스의 인스턴스 변수)");
System.out.println("InClass uNum = " + iNum + " (내부 클래스의 인스턴스 변수)");
System.out.println("OutClass sNum = " + sNum + " (외부 클래스의 Static 변수)");
System.out.println("InClass sInNum = " + sInNum + " (내부 클래스의 Static 변수)");
}
static void sTest() {
// 생성되지 않았을 수도 있기 때문에 내부 클래스의 인스턴스 변수 사용 불가능
// System.out.println("InClass uNum = " + iNum + " (내부 클래스의 인스턴스 변수)");
System.out.println("OutClass sNum = " + sNum + " (외부 클래스의 Static 변수)");
System.out.println("InClass sInNum = " + sInNum + " (내부 클래스의 Static 변수)");
}
}
public class InnerTest {
public static void main(String[] args) {
OutClass.InStaticClass sInClass = new OutClass.InStaticClass();
sInClass.inTest();
}
}
인스턴스 내부 클래스와는 다르게 정적 내부 클래스는 외부와 상관없이 생성되기 때문에, 외부의 인스턴스 변수를 사용 불가능하다.
내부 클래스의 인스턴스 변수 또한, 정적 메소드에서는 생성이 되기 전에 실행이 될수도 있기 때문에 사용이 불가능하다는 것을 알게 되었다.