앞서서 우리는 살펴본 중첩 클래스의 분류 중, 멤버 클래스의 한 종류인 인스턴스 멤버 클래스를 살펴보았습니다.
이번에는 남은 멤버 클래스인 정적(static) 멤버 클래스와 로컬 클래스를 살펴보겠습니다.
○ 정적 멤버 클래스
인스턴스 멤버 클래스에서 제약사항은 static 키워드를 쓰는 필드나 메서드를 사용할 수 없다는 점이었습니다. 그렇다면 이번 정적 멤버 클래스에서는 static을 사용할 수 있겠죠? 맞습니다. 아래의 예시를 함께 살펴보겠습니다.
class A {
/ * 정적 멤버 (중첩)클래스 */
static class C {
C() { } // 생성자
int field1; // 인스턴스 필드
void method1(); // 인스턴스 메서드
static int field2; // 정적 필드
static void method2(); // 정적 메서드
}
}
static 클래스의 성격을 갖기 때문에, 위의 정적 멤버 클래스인 C는 C의 인스턴스 생성을 위해 A의 인스턴스를 먼저 생성할 필요가 없습니다. (단, 착각하지 않도록 주의하세요 - 클래스 C의 필드와 메서드 사용을 위해서는 C의 인스턴스는 생성해야 합니다!!) 아래의 예제를 잘 확인해 주세요.
A.C c = new A.C();
// 인스턴스 필드와 메서드 사용
c.field1 = 3;
c.method1();
// 정적 필드와 메서드 사용
A.C.field2 = 3;
A.C.method2();
위 예제에서 볼 수 있듯이, [A.C]라는 클래스 타입은 계속해서 사용해야 합니다.
○ 로컬 클래스
중첩 클래스의 종류 분류 중 멤버 클래스에 대해서 위에서 살펴보았습니다. 두 가지 모두 클래스의 '멤버'로서 선언된 클래스인데, 중첩 클래스를 메서드 안에서도 선언이 가능합니다. 즉, 메서드가 실행될 때 메서드 내에서 객체를 생성하고 사용해야 하는 클래스이죠. 응용하여 사용할 때는 스레드(thread) 객체를 메서드 안에서 생성하고 비동기 처리를 진행하기 위해서 사용하게 되는데, 이는 나중에 스레드를 학습하면서 살펴볼 예정입니다.
로컬 클래스는 다음과 같은 특성을 갖습니다.
· 로컬 클래스는 접근 제한자(public, private) / static을 붙이지 않는다.
: 메서드 내에서만 사용되므로 접근 제한을 선언할 필요가 없음
· 정적 필드와 메서드는 선언할 수 없다.
void method() {
/* 로컬 클래스 */
class D {
D() { }
int field1;
void method1() { }
}
/ * 로컬 클래스의 사용 */
D d = new D();
d.field1 = 3;
d.method1();
}
예제를 한번 살펴보겠습니다. 다음 예제에서는 일반 클래스(바깥 클래스)A와 그 안의 인스턴스 멤버 클래스 B, 그리고 정적 멤버 클래스 C를 생성합니다. 그리고 클래스 A의 메서드 안에 로컬 클래스 D를 선언하고 이 클래스들을 호출하는 형태를 만들어 보겠습니다.
public class A {
// 클래스 A의 생성자
A() {
System.out.println("A 인스턴스 생성");
}
// A의 인스턴스 멤버 클래스
class B {
// 클래스 B의 생성자
B() {
System.out.println("B인스턴스 생성");
}
int field1;
void method1() {}
}
// A의 정적 멤버 클래스
static class C {
C() {
System.out.println("C인스턴스 생성");
}
int field1;
static int field2;
void method1() {}
static void method2() {}
}
// 클래스 A의 메서드
void method() {
class D {
D() {
System.out.println("D인스턴스 생성");
}
int field1;
void method1() {}
}
D d = new D();
d.field1 = 3;
d.method1();
}
}
public class ExampleMain {
public static void main(String[] args) {
A a = new A();
// 인스턴스 멤버 클래스 B 객체 생성
A.B b = a.new B();
b.field1 = 3;
b.method1();
// 정적 멤버 클래스 C 객체 생성
A.C c = new A.C();
c.field1 = 3;
c.method1();
A.C.field2 = 3;
A.C.method2();
// 로컬 클래스 객체 생성을 위한 메서드 호출
a.method();
}
}
/* 출력
A 인스턴스 생성
B인스턴스 생성
C인스턴스 생성
D인스턴스 생성
*/
'Programming > JAVA' 카테고리의 다른 글
중첩 클래스&인터페이스(3) - 중첩 클래스의 접근 제한자 2 (0) | 2023.04.06 |
---|---|
중첩 클래스&인터페이스(3) - 중첩 클래스의 접근 제한자 1 (0) | 2023.04.04 |
중첩 클래스&인터페이스(2) - 중첩 클래스의 종류 1 : 인스턴스 멤버 클래스 (0) | 2023.04.02 |
중첩 클래스&인터페이스(1) (0) | 2023.03.31 |
인터페이스(13) - 디폴트 메서드가 있는 인터페이스의 상속 (0) | 2023.03.30 |