
클래스 내에 선언된 클래스.
두 클래스가 서로 긴밀한 관계에 있을 때 사용.
내부 클래스 장점
- 내부 클래스에서 외부 클래스의 멤버들을 쉽게 접근이 가능하다.
- 코드의 복잡성을 줄일 수 있다.
- 해당 클래스에서만 내부 클래스를 사용할 수 있게 클래스를 감출 수 있다. (캡슐화)
new SuperClass() {
@Override
void method(){}
}
또는
new InterfaceImpClass() {
}
public class Outer {
private int outIv = 1;
InstanceClass ic = new InstanceClass();
static StaticClass sc = new StaticClass();
private class InstanceClass { //인스턴스 클래스
private int iv;
final static int CONST = 100;
public InstanceClass() {
iv = 1;
outIv = 2;
}
public void hello() {
System.out.println("Hello instanceClass" + outIv); //외부 클래스 멤버 변수(outIv) 사용
}
public int getIv() {
return iv;
}
public void setIv(int num) {
iv = num;
}
}
static class StaticClass { //스태틱 클래스
private static int cv;
public StaticClass() {
cv = 2;
}
public void hello() {
System.out.println("Hello instanceClass");
}
public int getCv() {
return cv;
}
public void setCv(int num) {
cv = num;
}
}
public void method() {
int count = ic.getIv();
ic.hello();
class LocalClass { //지역 클래스
final static int C = 3;
public void hello(int num) {
count = 1; // ERROR! .. count는 실제로 final int count = ic.getIv() 로 지역 클래스 메서드가 해당 메서드의 지역변수를 사용 해야하는 경우 final로 되어 상수화 됨.
for (int i = 0; i < num+count; i++) {
System.out.println("Hello");
}
}
}
LocalClass instanceClass = new LocalClass(); //해당 메서드 안에서만 사용 가능.
instanceClass.hello(LocalClass.C);
}
public void anonymousMethod() {
Object lv = new Object() { //익명 클래스
@Override
public String toString() {
return "Anonymous!!";
}
};
System.out.println(lv);
AnonyMousInterface anonyMousInterface = new AnonyMousInterface() { //익명 클래스, AnonyMousInterface 구현
@Override
public void method() {
System.out.println("Anonymous Interface!!");
}
};
anonyMousInterface.method();
}
}