IT/Java

[Java] 중첩 클래스(Nested Class)

Huitopia 2024. 3. 12. 22:28
728x90

중첩 클래스(Nested Class)

  • 클래스 내부에 선언한 클래스로 클래스 안에 또 다른 클래스가 정의된 것이다.
  • 관련 있는 것을 하나로 묶고 싶을 때 사용한다.
  • 특정 클래스를 자신의 클래스 내부적인 용도로만 사용하고자 할 때 효율적이다.
  • 두 클래스의 멤버들을 서로 쉽게 접근할 수 있다.
  • 외부에 불 필요한 관계 클래스를 감추어 코드의 복잡성을 줄일 수 있다.
  • 클래스의 멤버로 선언되는 중첩 클래스는 멤버 클래스이며, 메소드 내부에 선언되는 중첩 클래스를 로컬 클래스라 한다.
선언 위치에 따른 분류 선언 위치 객체 생성 조건
멤버 클래스 인스턴스 멤버 클래스 class A {
    class B {...}
}
A 객체를 생성해야
B 객체를 생성할 수 있다.
정적 멤버 클래스 class A {
    static class B {...}
}
A 객체를 생성하지 않아도
B 객체를 생성할 수 있다.
로컬 클래스 class A {
    void method(){
        class B {...}
    }
}
method가 실행할 때만
B 객체를 생성할 수 있다.

 

 

1. 인스턴스 멤버 클래스

[public] class A {
	// 인스턴스 멤버 클래스
	[public | private]class B { ... }
}
구분 접근 범위
public class B { } 다른 패키지에서 B 클래스 사용 가능
clss B { } 같은 패키지에서만 B 클래스 사용 가능
private class B { } A 클래스 내부에서만 B 클래스 사용 가능
  • 인스턴스 필드와 메소드 선언이 가능하고 정적 필드와 메소드는 Java17부터 선언할 수 있다.
  • 인스턴스 멤버 클래스 B는 A 클래스 내부의 인스턴스 필드값, 생성자, 인스턴스 메소드에만 생성 가능하다.
  • A 객체가 있어야 B 객체도 생성 가능하며, A 객체를 먼저 생성한 다음 B 객체를 생성한다.
  • B 객체를 A 클래스 외부에 생성하려면 default or public 접근 제한을 가진다.

 

 

2. 정적 멤버 클래스

[public] class A {
	// 정적 멤버 클래스
	[public | private] static class B { ... }
}

// B 객체 생성
A.B b = new A.B();
구분 접근 범위
public static class B { } 다른 패키지에서 B 클래스 사용 가능
static clss B { } 같은 패키지에서만 B 클래스 사용 가능
private static class B { } A 클래스 내부에서만 B 클래스 사용 가능
  • static 키워드로 선언된 클래스이다.
  • 모든 종류의 필드와 메소드 선언이 가능하다.
  • 내부에서 사용되기도 하지만 외부에서 사용될 때는 default or public 접근 제한을 가진다.
  • B 객체는 A 클래스 내부 어디든 객체를 생성할 수 있다.
  • A 클래스 외부에서 B 객체 생성시, A 객체 생성 없이 A 클래스로 접근해서 B 객체를 생성할 수 있다.

 

 

3. 로컬 클래스

[public] class A {
	// 생성자
	public A(){
    	class B { } // 로컬 클래스
    }
    
    // 메소드
    public void method() {
    	class B { } // 로컬 클래스
    }
}
  • 메소드 내에 선언된 클래스를 로컬(local) 클래스라 한다.
  • 메소드 내부에서만 사용되기에 접근 제한자 및 static을 붙일 수 없다.
  • 생성자와 메소드가 실행될 동안에만 객체를 생성한다.
  • 로컬 클래스 내부에는 인스턴스 필드와 메소드만 선언 가능하고, 정적 필드와 정적 메소드는 Java 17부터 선언 가능하다.
  • 주로 비동기 처리를 위해 스레드 객체를 만들 때 사용한다.

 

3-1 로컬 변수

  • 생성자 또는 메소드의 매개변수 또는 내부에서 선언된 변수
  • 로컬 클래스에서 사용할 경우 final 특성을 가져 값 읽기만 가능하고 수정은 불가능하다.

 

 

 

 

728x90