FreeHand

내부 클래스 본문

Language/Java

내부 클래스

Jinn 2024. 1. 6. 23:15
class A { // 외부 클래스
    // 내부 클래스
    class B { // 인스턴스 클래스 }
    static class C { // 스태틱 클래스 }
    
    void methodA() {
        class D { // 지역 클래스 }
    }
}

내부 클래스는 말 그대로 클래스 안의 클래스를 의미한다.

 

class A {
    int num = 10;
}

class B {
    void printA() {
        A a = new A();
        System.out.println(a.num);
    }
}

public class Main {
    public static void main(String[] args) {
        B b = new B();
        b.printA(); // 10
    }
}

B 클래스에서 A 클래스의 멤버를 사용하려면 B 클래스 안에서 A 객체를 생성해서 사용해야 한다.

 

class A {
    int num = 10;
    
    class B {
        void printA() {
            System.out.println(num);
        }
    }
}

public class Main {
    public static void main(String[] args) {
        B b = new B();
        b.printA(); // 10
    }
}

B 클래스가 A 클래스의 내부 클래스가 되면서 A 클래스의 멤버를 객체 생성 없이 바로 사용할 수 있게 되었다.

또한 다른 클래스에서 B 클래스의 멤버에 바로 접근할 수 없다. (캡슐화)


클래스는 default, public 제어자만 사용할 수 있지만 내부 클래스는 private, protected 제어자도 사용 가능하다.

class A {
    private class InstanceInner {}
    protected static class StaticInner{}
    
    void foo() {
        class LocalInner {}
    }
}

 

static 멤버는 static 클래스만 정의할 수 있다.

class Outer {
    int outerIv = 100; // static 내부 클래스에서 접근 불가능

    class InstanceInner {
        int iv = 10; // instance 변수 가능
        static int cv = 10; // static 변수 선언 불가능
        final static int CONST = 10; // final static은 상수이므로 가능
    }

    static class StaticInner {
        int iv = 10; // instance 변수 가능
        static int cv = 10; // static 변수 가능
        final static int CONST = 10; // final static 가능
    }
    
    void foo() {
        class LocalInner {
            int iv = 10; // instance 변수 가능
            static int cv = 10; // static 변수 선언 불가능
            final static int CONST = 10; // final static은 상수이므로 가능
        }
        
        int iv = LocalInner.CONST; // 가능
    }
    
    public static void main(String[] args) {
        System.out.println(InstanceInner.CONST); // 가능
        System.out.println(StaticInner.cv); // 가능
        System.out.println(LocalInner.CONST); // 불가능
    }
}

 

'Language > Java' 카테고리의 다른 글

함수형 인터페이스  (0) 2024.01.07
익명 클래스  (0) 2024.01.06
SOLID  (0) 2023.11.22
클래스 관계  (0) 2023.11.17
Generics  (0) 2023.08.01