본문 바로가기
코딩/JAVA

<JAVA> 중첩 클래스 (nested class)

by 메모노어 2022. 7. 18.

지금까지 일반 클래스나 추상 클래스, 인터페이스를 단독으로 써왔다면 클래스 안의 클래스를 배울 차례.

중첩클래스는 클래스 안에 또다른 클래스가 하나 이상 존재하는 것을 뜻하며, 바깥에 존재하는 클래스를 Outer 클래스,

안 쪽에 존재한 클래스를 Inner 클래스라고 한다.

 

 

중첩클래스의 특징

  • 중첩 클래스는 하나 이상 존재할 수 있다
  • Outer 클래스 멤버를 Inner 클래스에서 사용할 수 있다.( private 멤버도 가능 )
  • Outer 클래스에서 Inner 클래스 멤버를 사용할 수 없다.

필드나 메소드 특징에 지역 변수 특징을 섞은 느낌

다만 중첩 클래스 역시 하나의 클래스이기 때문에 컴파일하면 바이트 코드 파일(.class)이 별도로 생성된다. Outer 클래스와 Inner 클래스 사이에 '$' 기호가 붙고, 로컬 클래스의 경우 '$숫자' 가 붙는다.

Outer $ Inner .class //멤버 클래스의 경우
Outer $1 Inner .class //로컬 클래스의 경우

 

 

중첩 클래스에는 4대 중첩클래스가 존재한다.

구분 설명
instance member Outer 클래스의 멤버변수나 메소드처럼 정의된 경우
static memeber static 키워드를 사용해 정의된 경우
local Outer 클래스의 메소드 내부에서 정의된 경우
annonymous 익명 클래스를 사용해서 정의된 경우

 

 

1. instance member (인스턴스 멤버 클래스)

가장 일반적인 형태의 중첩 클래스의 형태이다. 클래스의 멤버이자 인스터스화 해야 사용가능하기 때문에 인스턴스 멤버 클래스라고도 한다.

인스턴스 멤버 클래스

 

인스턴스 멤버 클래스 특징

  • 정적 필드와 정적 메소드를 가질 수 없다.
  • Outer 클래스의 객체를 생성해야 사용할 수 있다.

예시

A a = new A();  //Outer 클래스 객체 생성
A.B b = a.new B();  //Inner 클래스 객체 생성
b.field1  //필드 사용
b.method1();  //메소드 사용

 

 

2. static memeber (정적 멤버 클래스)

일반적으로 최상위 클래스에는 static을 붙일 수 없다. 하지만 중첩 클래스는 클래스이지만 일종의 클래스 멤버로써 존재하기 때문에 static을 붙일 수 있다.

정적 멤버 클래스

정적 멤버 클래스 특징

  • 일반적인 필드, 메소드뿐만 아니라 static필드와 메소드도 선언가능
  • Outer 클래스 객체를 생성할 필요없이 Inner 클래스 객체만 생성하면 된다.
  • Outer 클래스 멤버 중 static 멤버만 사용 가능

예시

A.C c = new A.C(); // 정적 멤버 클래스 객체 생성
c.field1 = 3;  //인스턴스 필드 사용
c.method1();  //인스턴스 메소드 사용
A.C.field2 = 3;  //static 필드 사용
A.C.method2();  //static 메소드 사용

 

 

 

 

3. Local (로컬 클래스)

메소드 안에서 선언된 클래스이다. 메소드 내부에서 선언된 변수는 메소드 내부에서만 사용할 수 있듯이 로컬 클래스 역시 메소드 내부에서만 사용할 수 있다.

로컬 클래스

로컬 클래스 특징

  • 외부에서 객체를 생성할 수 없다.
  • static 멤버를 선언할 수 없다.
  • 접근 제한자와 지정 예약어를 사용할 수 없다.

예시

//클래스 멤버 메소드
void method() {
	//로컬 클래스 선언
    class D {
    	D() {}
        int field1;
        void method() {}
    }
    D d = new D();  //메소드 안에서 객체 생성
    d.field1 = 3;  //필드 불러오기
    d.method1();  //메소드 불러오기
    //메소드가 끝나면 객체는 사라진다
}

 

 

 

4. Annonymous (익명 중첩 클래스)

지역 클래스의 변형된 형태이다. 기존 클래스의 메소드를 오버라이딩하여 원하는 형태로 재정의하여 사용한다. 클래스 내부에 기존에 존재하는 클래스의 객체를 생성하여 그 내부에 구현부를 작성하는 형태이다.

로컬 클래스 특징

  • 클래스를 상속하거나 인터페이스를 구현해야 생성 가능
  • 기존의 중첩 클래스와 달리 이미 존재하는 클래스가 있어야 생성 가능
  • 내부 클래스에 생성자를 작성할 수 없다.
  • 외부 멤버 중 final만 사용가능

 

 

 

 

 

참조자료

 

이것이 자바다 - 신용권 (한빛미디어)

 

https://jobjava00.github.io/language/java/basic/nested-class/

 

[Java] 4대 중첩 클래스(nested class)

Web programmer

jobjava00.github.io

https://gyrfalcon.tistory.com/entry/JAVAJ-Nested-Class

 

중첩 클래스(Nested Class) [자바 4대 중첩 클래스]

자바 4대 중첩 클래스 1. 중첩 클래스 (Inner Class) □ 정의    - 하나의 클래스 내부에 또 다른 클래스가 내포되어 있는 상태. (클래스 관리의 효율을 높임.) □ 특징    - 중첩되는 클래스는 하나

gyrfalcon.tistory.com