본문 바로가기

일/JAVA

java08.nested

/*

중첩클래스

중첩클래스는 클래스 내부에 선언되는 위치에 따라서 3가지로 분류된다.

1. 클래스멤버 선언되는 중첩클래스 "객체(인스턴스)멤버클래스"라고 하고

2. static으로 선언되는 중첩클래스는 "정적멤버클래스"라고 하며

3. 메서드 내부에 선언되는 중첩클래스는 "로컬멤버클래스"라고 한다.

 

객체멤버클래스는 클래스나 객체가 사용중(생성)이라면 언제든지 사용할 수

있지만 로컬멤버클래스는 매서드가 실행될 때만 사용할 수 있고 메서드가 종료

되면 메모리에서 삭제가 된다.

 

중첩클래스들도 하나의 클래스이기 때문에 컴파일을 하면 바이트코드파일(~.class)

이 각각 생성된다. 다만 바이트코드파일의 이름은 "A$B.class"의 형태로 생성된다.

로컬멤버클래스일 경우에는 "A$1D.class"의 형태로 생성된다.

 

중첩클래스 중에 정적멤버클래스(C)는 static 키워드로 선언된 중첩클래스를 말한다.

정적멤버클래스는 모든 종류의 필드와 메서드를 선언할 수 있다.

 

중첩클래스 중에 로컬멤버클래스는 메서드 내부에 선언된 중첩클래스로서 로컬중첩

클래스는 접근제한자(public, private), static으로 선언할 수가 없다.

그 이유는 로컬클래스는 메서드내에서만 사용되기 때문에 접근을 제한할 필요가

없기 때문이다. 로컬중첩클래스에는 인스턴스필드와 인스턴스메서드만 선언이 가능하고

static키워드를 사용할 수 없다.

 

로컬중첩클래스는 메서드가 실행될 때만 메서드 내부에서 객체를 생성하고 사용할

수 있다. 주로 비동기처리를 위해 쓰레드객체를 만들 때 사용한다.

 

*/

public class A {

//생성자

public A() {System.out.println("A객체생성");}

// 1. 객체멤버인 중첩클래스

// 즉, A가 생성되어야만 사용할 수 있다.

public class B{

// 필드

int b_field;

// static int b_field1;

// 중첩클래스 B가 A의 객체멤버이기 때문에 static 선언불가

// 생성자

public B() {

System.out.println("B객체생성");}

// 메서드

void b_method() {System.out.println("B.b_method()호출"+b_field);

// static void b_method1() {}

}

 

}

 

// 2. 정적(클래스)멤버인 중첩클래스

// 즉, A가 생성되지 않아도 접근할 수 있는 클래스

public static class C{

String c_field1;

static String c_field2;

public C() {System.out.println("C객체생성");}

void c_method1() {System.out.println

("C.c_method1()호출 - c_field1="+c_field1+",c_field2="+c_field2);}

static

void c_method2() {System.out.println("C.b_method2()호출"+c_field2);}

 

}

 

// 3. 로컬중첩클래스

public void a_method() { // 메소드가 호출되어야 D가 생성 가능

class D{

String d_field1;

// static String d_filed2;

public D() {System.out.println("D객체 생성");}

void d_method1() {System.out.println("D.d_method1() 호출");}

// static void d_method2() {}

}

D d = new D();

d.d_field1 = "접근가능";

d.d_method1();

class E{}

class F{}

class G{}

}

 

public void a1_method() {

class D{}

class E{}

class F{}

class G{}

 

}

 

}

 

public class NestedMain {

 

public static void main(String[] args) {

A a = new A();

// 1. 객체중첩클래스(B)

// B b = new B(); // 객체중첩클래스는 직접접근불가

// A.B b = new A.B(); // 객체멤버로 접근불가

A.B b = a.new B();

b.b_field = 10;

b.b_method();

System.out.println();

 

// 2. 정적중첩클래스(C)

// A.C.field1 = "접근불가"; // c_field1은 객체멤버이기 때문에 C 객체생성없이 접근 불가

A.C.c_field2 = "접근가능";

// A.C.c_method1(); // c_method1은 객체멤버이기 때문에 C객체생성없이 접근불가

A.C.c_method2(); // 정적멤버이기 때문에 접근가능

System.out.println();

 

A.C c = new A.C(); //C는 정적클래스이기 때문에 직접접근가능

// A.C c1 = a.new C(); // 접근가능하지만 정적클래스는 클래스명으로 접근

c.c_field1 = "객체생성 후 접근가능";

c.c_field2 = "정적멤버이기 때문에 클래스명으로 접근할 것";

c.c_method1();

c.c_method2(); // 클래스명으로 접근할 것

 

// 3. 로컬중첩클래스

// 로컬중첩클래스는 메서드를 호출한 후에 메서드 내부에서만 생성할 수 있다.

a.a_method();

 

 

}

 

}

public class A {

String a_field;

static String a_field2;

void a_method() {}

static void a_method2() {}

 

// 1. 객체중첩클래스 - 객체멤버, 정적멤버 접근가능

class B{

void b_method() {

a_field = "접근가능";

a_field2 = "접근가능";

 

a_method();

a_method2();

}

}

// 2. 정적중첩클래스 - 정적멤버만 접근가능

static class C{

void c_method() {

// a_field1 = "접근불가"

a_field2 = "접근가능";

 

// a_method1();

a_method2();

}

}

}

' > JAVA' 카테고리의 다른 글

java11.basic_API  (0) 2023.05.25
java09.exception  (0) 2023.05.25
java07.interface  (0) 2023.05.25
java06.inheritance  (0) 2023.05.25
java05.class.package  (0) 2023.05.24