Java 내부클래스

LIM JAEHO·2022년 7월 2일
0

Java 학습

목록 보기
14/19

Inner Class 내부 클래스

'내부 클래스' 란 말 그대로 클래스 안에 있는 클래스이다.

멤버에 대한 접근 권한은 스코프랑 똑같이 생각하면 되고, 구체적으로 아래와 같다.

  • 내부에서 외부로 멤버 접근 가능하다.
  • 외부에서 내부로 멤버 접근 불가능하다.

내부 클래스의 종류

  • 인스턴스 클래스
  • 정적 클래스
  • 익명 클래스
  • 지역 클래스

인스턴스 클래스

일반적인 형태의 내부 클래스이다.

class Outer {
    static int num;
    public void print() {
        System.out.println("Outer class");
    }

    class Inner {
        public void print() {
            Outer.this.print();
            System.out.println("Inner Class");
        }
    }
}

public class Test {
    public static void main(String[] args) throws IOException {
        
        /* 인스턴스 클래스 */
        Outer.Inner innerClass = new Outer().new Inner();
        innerClass.print();
    }
}

정적 클래스

내부 클래스에 static 키워드를 적용해 바깥클래스의 객체가 생성되지 않아도 메모리에 상주해 미리 사용가능하다.

class Outer {
    static int num;
    public void print() {
        System.out.println("Outer class");
    }

    static class InnerStatic {
        void print() {
            // Outer.this.num = 1; => error
            // Outer.this.print(); => error
            // InnerStatic 은 static 이라서 바로 메모리에 올라간다.
            // 하지만 클래스 Outer 는 static 이 아니라 객체가 생성되기 전까지는 메모리에 올라가지 못한다.
            // 따라서 외부클래스의 멤버로 접근이 불가하다.
            // Outer.this 객체로의 접근 자체가 막혀있다.
            System.out.println("Inner Static Class not static print()");
        }

        static void staticPrint() {
            System.out.println("Inner Static Class static print()");
        }
    }
}

public class Test {
    public static void main(String[] args) throws IOException {

        /* 정적 클래스 */
        Outer.InnerStatic.staticPrint();

        Outer.InnerStatic innerStatic = new Outer.InnerStatic();
        innerStatic.print();

    }
}

익명 클래스

이름이 없는 클래스로 선언과 동시에 객체를 생성하는 일회용 클래스이다.

abstract class AbstractClass {
    public void print1(){
        System.out.println("not abstract print");
    }
    abstract public void print2();
}

public class Test {
    public static void main(String[] args) throws IOException {
        
        /* 익명 클래스 -> AbstractClass 클래스의 인스턴스가 아니다. */
        AbstractClass abstractClass = new AbstractClass() {
            @Override
            public void print2() {
                System.out.println("abstract print");
            }
        };
        abstractClass.print1();
        abstractClass.print2();
    }
}

지역 클래스

클래스 내의 메서드 안에 있는 클래스이다.

0개의 댓글