본문 바로가기
Programming/JAVA

Nested Class, Inner Class

by 한 땀; 한 땀; 2020. 12. 8.

Nested Class 관계도

 

아래는 위의 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

댓글