Java

로컬 클래스 / 바깥 클래스

공부처음하는사람 2024. 7. 6. 00:26

 

로컬 클래스

생성자 또는 메소드 내부에서 선언된 클래스를 로컬 클래스라고 한다.

package ch09.sec04.ex01;

public class A {
    A() {
        // 로컬 클래스 선언
        class B {
        }
        
        // 로컬 객체 생성
        B b = new B();
    }

    void method() {
        // 로컬 클래스 선언
        class B {
        }
        // 로컬 객체 생성
        B b = new B();
    }
}

 

로컬 클래스 B 내부에는 일반 클래스와 같이 필드, 생성자, 메소드 선언이 올 수 있다.

정적 필드와 메소드는 java 17부터 사용가능하니 참고

 

로컬 변수(생성자 또는 메소드의 매개변수 또는 내부에서 선언된 변수)를 로컬 클래스에서 사용할 경우

로컬 변수는 final 특성을 갖게 된다. 로컬 클래스 내부에서 값을 변경하지 못하도록 제한하기 때문이다.

java 8 이후부턴 final이 생략되지만 명시적으로 사용할 수 있다. (java 7에선 final을 반드시 붙여야했다)

 

package ch09.sec04.ex03;

public class A {

    public void method1(int arg) {  // final int arg
        // 로컬 변수
        int var = 1;  // final int var = 1;
        
        // 로컬 클래스
        class B {
            void method2() {
                System.out.println("arg: " + arg);
                System.out.println("var: " + var);
                
                //로컬 변수 수정
                //arg = 2; 불가
                //var = 2; 불가
            }
        }
        // 로컬 객체 생성
        B b = new B();
        b.method2();
    }
}

 

 

바깥 멤버 접근

중첩 클래스는 바깥 클래스와 긴밀한 관계를 맺으면서 바깥 클래스의 멤버에 접근할 수 있다. 하지만 어떻게 선언되었냐에 따라 달라진다.

 

정적 멤버 클래스는 바깥객체가 없어도 사용 가능해야 하므로 바깥 클래스의 인스턴스 멤버를 사용할 수 없다.

 

package ch09.sec05.ex01;

public class A {
    int field1;

    void method1() {
    }

    static int field2;

    static void method2() {
    }

    class B {
        void method() {
            // A의 인스턴스 멤버 사용 가능
            field1 = 10;
            method1();
            field2 = 10;
            method2();
        }
    }

    static class C {
        void method() {
            // A의 인스턴스 멤버 사용
            // field1 = 10; // 불가
            // method1();  // 불가
            field2 = 10;
            method2(); //가능
        }
    }
}

 

정적 멤버 클래스가 바깥 클래스의 인스턴스 멤버를 사용할 수 없는 이유는 정적 멤버 클래스는 독립적으로 존재하기 때문

정적 클래스는 외부 클래스의 static context 내에 정의되고 특정 외부 클래스 인스턴스에 종속되지 않기 때문이다.

 

바깥 클래스의 객체 접근

중첩 클래스 내부에서의 this는 해당 중첩 클래스의 객체를 말한다.

ex) 바깥클래스이름.this -> 바깥 객체

 

package ch09.sec05.ex02;

public class A {
    String field = "A field";

    void method() {
        System.out.println("A method");
    }

    class B {
        String field = "B field";

        void method() {
            System.out.println("B method");
        }

        void print() {
            // B 객체의 멤버 사용
            System.out.println(this.field);
            this.method();

            // A 객체의 멤버 사용
            System.out.println(A.this.field);
            A.this.method();
        }
    }

    void useB() {
        B b = new B();
        b.print();
    }
}

'Java' 카테고리의 다른 글

익명 객체  (0) 2024.07.06
중첩 인터페이스  (0) 2024.07.06
중첩 클래스 / 인스턴스 멤버 클래스 / 정적 멤버 클래스  (0) 2024.07.05
인터페이스 - private 메소드  (0) 2024.07.01
싱글톤  (0) 2024.06.23