1. 내부 클래스
클래스 내부에 선언된 클래스로 외부 클래스와 밀접한 연관이 있는 경우가 많음
① 인스턴스(instance) 내부 클래스
② 정적(static) 내부 클래스
③ 지역(local) 내부 클래스
④ 익명(anonymous) 내부 클래스
2. 인스턴스 내부 클래스
OutClass outClass = new OutClass();
OutClass.InClass inClass = outClass.new InClass();
3. 인스턴스 내부 클래스 구현
class OutClass { ##### 외부 클래스 ####
private int num = 10;
private static int sNum = 20;
private InClass inClass;
public OutClass(){
inClass = new InClass(); # 내부 클래스 생성
}
class InClass{ ##### 내부 클래스 ####
int inNum = 100;
//static int sInNum = 200; # 내부 클래스는 외부 클래스가 생성된 후에
# 접근 가능하기 때문에 정적 변수를 갖을 수 없음
//static void sTest(){} # 정적 메서드도 마찬가지
void inTest(){
System.out.println("OutClass num = " +num + "(외부 클래스의 인스턴스 변수)");
System.out.println("OutClass sNum = " + sNum + "(외부 클래스의 스태틱 변수)");
System.out.println("InClass inNum = " + inNum + "(내부 클래스의 인스턴스 변수)");
}
}
public void usingClass(){
inClass.inTest(); # 내부 클래스 변수를 사용하여 메서드 호출하기
}
}
public class InnerTest {
public static void main(String[] args) {
OutClass outClass = new OutClass(); # 외부 클래스 인스턴스 생성
outClass.usingClass(); # 내부 클래스 기능 호출
OutClass.InClass inClass = outClass.new InClass(); # 외부 클래스 생성 후에 내부 클래스 생성
}
}
1. 정적 내부 클래스
2. 정적 내부 클래스 구현
class OutClass { ##### 외부 클래스 #####
private int num = 10;
private static int sNum = 20;
private InClass inClass;
public OutClass(){
inClass = new InClass();
}
static class InStaticClass{ ##### 정적 내부 클래스 #####
int inNum = 100;
static int sInNum = 200;
void inTest(){ # 정적 내부 클래스의 메서드
//num += 10; # 외부 클래스의 인스턴스 변수는 사용할 수 없음
System.out.println("InStaticClass inNum = " + inNum + "(내부 클래스의 인스턴스 변수 사용)");
System.out.println("InStaticClass sInNum = " + sInNum + "(내부 클래스의 스태틱 변수 사용)");
System.out.println("OutClass sNum = " + sNum + "(외부 클래스의 스태틱 변수 사용)");
}
static void sTest(){ # 정적 내부 클래스의 static 메서드
//num += 10; # 외부 클래스의 인스턴스 변수는 사용할 수 없음
//inNum += 10; # 내부 클래스의 인스턴스 변수는 사용할 수 없음
System.out.println("OutClass sNum = " + sNum + "(외부 클래스의 스태틱 변수 사용)");
System.out.println("InStaticClass sInNum = " + sInNum + "(내부 클래스의 스태틱 변수 사용)");
}
}
}
public class InnerTest {
public static void main(String[] args) {
# 외부 클래스 생성하지 않고 바로 정적 내부 클래스 생성
OutClass.InStaticClass sInClass = new OutClass.InStaticClass();
sInClass.inTest();
# 정적 내부 클래스의 정적 메소드 사용
OutClass.InStaticClass.sTest();
}
}
3. 정적 내부 클래스에서의 변수 접근