아래는 위의 Nested Class를 구현한 코드이다.
interface Printable {
void print();
}
class Outer {
static int sNum = 10;
int Num = 10;
void print() {
System.out.println("Outer Class");
System.out.printf("%d %d\n", sNum, Num);
}
static class Nested {
void print() {
System.out.println("Nested Class");
System.out.println(sNum);
// System.out.println(Num); // static 클래스는 외부에 있으므로 접근 불가
}
}
class Member {
void print() {
System.out.println("Inner Class");
System.out.printf("%d %d\n",sNum,Num);
}
}
public Printable localFunc(int n) {
class Local implements Printable {
public void print() {
System.out.println("Local Class");
System.out.printf("%d %d %d\n",sNum,Num,n);
}
}
return new Local();
}
public Printable anonymousClass(int n) {
return new Printable() {
public void print() {
System.out.println("Anonymous Class");
System.out.printf("%d %d %d\n",sNum,Num,n);
}
};
}
}
class TestMain {
public static void main(String[] args) {
Outer o= new Outer(); // outer class
o.print();
System.out.println();
Outer.Nested outerNested=new Outer.Nested(); // static nested class
outerNested.print();
System.out.println();
Outer.Member member=o.new Member(); // Member class
member.print();
System.out.println();
Printable local=o.localFunc(30); // local class
local.print();
System.out.println();
Printable anony= o.anonymousClass(40); // Anonymous class
anony.print();
}
}
Member Class
Outer.Member member;
Outer 클래스의 멤버클래스 Member 자료형의 참조변수 member 선언한다.
member = o.new Member();
참조변수 member는 참조변수 o가 참조하는 인스턴스의 멤버클래스 Member 인스턴스를 생성한다.
Local Class
인터페이스를 상속하는 클래스는 인터페이스 자료형으로 클래스의 인스턴스를 참조할 수 있다.
이를 기반으로 로컬클래스를 생성하여 인터페이스를 구현 후, 반환형으로 구현한 인터페이스로 반환하면
인터페이스 참조변수는 로컬클래스를 참조할 수 있다.
이 때, 반환형으로 클래스의 이름이 오면 되지 않을까 하는 궁금증이 있다면 메소드의 특성을 생각해보면 알 수 있다.
자료형을 메소드 내에서 정의 했는데 외부에서 해당 자료형에 어떻게 접근할 수 있겠는가?
Anonymous Class
로컬클래스의 이름은 인스턴스의 참조값을 반환하는 용도외에는 쓸 일이 없다. 따라서 위와 같이 익명클래스를 생성 할 수 있다. 즉, 클래스의 이름을 지우고 반환형을 해당 인터페이스형으로, 그리고 그 인터페이스의 구현을 의미하는 뜻으로 new Printable()로 return을 하면서 구현과 동쉬에 반환을 해준다.
이 때 인터페이스의 인스턴스 생성은 불가능하지만 이처럼 메소드를 구현해준다면 인스턴스 생성이 가능하다.
'Programming > JAVA' 카테고리의 다른 글
Lambda Expression (0) | 2020.12.10 |
---|---|
Set<E> (0) | 2020.12.02 |
Upper Bounded Wildcards (0) | 2020.11.29 |
댓글