로컬 클래스 / 바깥 클래스

2024. 7. 6. 00:26·Java

 

로컬 클래스

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

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' 카테고리의 다른 글

익명 객체  (1) 2024.07.06
중첩 인터페이스  (0) 2024.07.06
중첩 클래스 / 인스턴스 멤버 클래스 / 정적 멤버 클래스  (0) 2024.07.05
인터페이스 - private 메소드  (0) 2024.07.01
싱글톤  (0) 2024.06.23
'Java' 카테고리의 다른 글
  • 익명 객체
  • 중첩 인터페이스
  • 중첩 클래스 / 인스턴스 멤버 클래스 / 정적 멤버 클래스
  • 인터페이스 - private 메소드
공부처음하는사람
공부처음하는사람
  • 공부처음하는사람
    lazzzykim
    공부처음하는사람
  • 전체
    오늘
    어제
    • 분류 전체보기 (129) N
      • Kotlin (31)
      • Java (55)
      • Spring (20) N
      • Algorithm (3)
      • TroubleShooting (1)
      • 내일배움캠프 프로젝트 (14)
      • Setting (2)
      • ... (1)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
    • 글쓰기
  • 링크

  • 인기 글

  • 태그

    생성자 주입
    김영한의 실전 자바
    래퍼클래스
    김영한의 실전자바
    빈 생명주기
    캡슐화
    다형성
    Di
    배열
    OCP
    spring
    내일배움캠프
    언체크예외
    @Component
    java
    싱글톤
    김영한
    kotlin
    제네릭
    중첩클래스
  • hELLO· Designed By정상우.v4.10.3
공부처음하는사람
로컬 클래스 / 바깥 클래스
상단으로

티스토리툴바