중첩 클래스 Nested Class
- 클래스 내부에 선언한 클래스
- 두 클래스의 멤버들을 서로 쉽게 접근할 수 있다.
- 외부에는 불필요한 관계 클래스를 감춰서 코드의 복잡성을 줄일 수 있다.
class ClassName {
class NestedClassName {
// 중첩 클래스
}
}
클래스 내부에 선언되는 위치에 따라서 두가지로 분류
- 멤버 클래스 : 클래스 멤버로서 선언되는 중첩 클래스
- 클래스나 객체가 사용중이라면 언제든지 재사용이 가능
- 멤버 클래스도 하나의 클래스 -> 컴파일하면 바이트코드 파일(.class) 별도 생성
- 파일의 이름은
A $ B .class (A: 바깥 클래스, B : 멤버클래스)
- 인스턴스 멤버 클래스
classA {
classB {
...
}
}
- 정적 멤버 클래스
classA {
static classB {
...
}
}
- 로컬 클래스 : 메소드 내부에서 선언되는 중첩 클래스
- 메소드 실행시에만 사용되고, 메소드가 실행 종료되면 없어진다.
- 로컬 클래스도 하나의 클래스 -> 컴파일하면 바이트코드 파일(.class) 별도 생성
- 파일의 이름은
A $1 B .class (A: 바깥 클래스, B : 로컬클래스)
classA {
void method() {
class B {
...
}
}
}
인스턴스 멤버 클래스
- static 키워드 없이 선언된 클래스
class A {
class B {
B() { } // 생성자
int field1; //인스턴스 필드
void method1() { }; // 인스턴스 메소드
}
}
- 인스턴스 필드와 메소드만 선언이 가능하고 정적 필드와 메소드는 선언할 수 없다.
- 중첩 클래스 안에 static변수나 static 메소드를 만들 수 없다는 뜻.
- A클래스 외부에서 인스턴스 멤버 클래스 B의 객체를 생성하려면
- 먼저 A 객체를 생성한 후
- B 객체를 생성해야 한다.
A a = new A();
A.B b = a.new B();
b.field1 = 3; // 변수에 값을 할당함
b.method1(); // 메소드를 호출함
정적 멤버 클래스
- static 키워드로 선언된 클래스
class A {
static class C {
C() { } // 생성자
static int field1; //인스턴스 필드
static void method1() { }; // 인스턴스 메소드
int field2; //인스턴스 필드
void method2() { } // 인스턴스 메소드
}
}
- 모든 종류의 필드와 메소드 선언 가능
- A클래스 외부에서 정적 멤버 클래스를 생성하기 위해서 A객체를 생성할 필요는 없다.
A.C c = new A.C();
c.field1 = 3; // 인스턴스 변수에 값을 할당함
c.method1(); // 인스턴스 메소드를 호출함
A.C.field2 = 3; // 정적 필드 사용
A.C.method2(); // 정적 메소드 호출
로컬 클래스
- 메소드 내에서도 선언할 수 있는 것을
local class라 한다.
- public, private, static을 붙일 수 없다. (메소드와 인스턴스 필드도)
- 로컬 클래스는 메소드 내부에서만 사용되기 때문에 접근을 제한할 필요가 없기 때문이다.
void method() {
// 아래부터 로컬 클래스
class D {
D() { } // 생성자
int field1; // 인스턴스 필드
void method; //
}
D d = new D();
d.field1 = 3;
d.method1();
}
- 메소드가 실행될 때 메소드 내에서 객체를 생성하고 사용해야 한다.
- 주로 비동기 처리를 위해 스레드 객체를 만들 때 사용한다.
void method() {
class DownloadThread extends Thread { ... }
DownloadThread thread = new DownloadThread();
thread.start();
}
중첩 인터페이스
class ClassName {
interface NestedInterfaceName {
// 중첩 인터페이스
}
}
- 주로 UI프로그래밍에서 이벤트를 처리할 목적으로 많이 활용됨
Comments