자바

JAVA 자바 중첩 클래스: 인스턴스 멤버 클래스, 정적 멤버 클래스, 로컬 클래스

알통몬_ 2017. 3. 13. 10:21
반응형


안녕하세요 알통몬입니다.

공감 및 댓글은 포스팅 하는데 아주아주 큰 힘이 됩니다!!

포스팅 내용이 찾아주신 분들께 도움이 되길 바라며

더 깔끔하고 좋은 포스팅을 만들어 나가겠습니다^^

 

중첩 클래스

클래스 내부에서 선언되는 위치에 따라 두 가지로 분류됩니다. 

멤버 클래스 : 클래스의 멤버로서 선언되는 중첩 클래스.

로컬 클래스 : 메서드 내부에서 선언되는 중첩 클래스


멤버 클래스와 로컬 클래스의 차이

멤버 클래스 : 클래스나 객체가 사용 중이라면, 언제든지 재사용이 가능하지만, 

로컬 클래스 : 메서드 샐행 시에만 사용되고 메서드가 실행 종료되면 없어집니다.


멤버 클래스도 하나의 클래스이기 때문에 컴파일하면 .class 파일이 별도로 생성됩니다.                                               A        $       B    . class

             바깥클래스      멤버클래스


로컬 클래스일 경우에는 아래와 같이 $1이 포함된 바이트 코드 파일이 생성됩니다.                                                     A        $1       B    . class

             바깥클래스        로컬클래스


인스턴스 멤버 클래스

static 키워드 없이 선언된 클래스. 

인스턴트 멤버 클래스는 인스턴트 필드와 메서드만 선언이 가능하고

정적 필드와 메서드는 선언할 수 없습니다.

/**바깥 클래스**/

class A {

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

/**인스턴스 멤버 클래스**/

public class B {

B() { System.out.println("B 객체가 생성됨"); } //생성자

 int field1;  //인스턴트 필드 

//static int field2;  //정적필드 선언 불가

void method1() { } // 인스턴트 메서드

//static void method2() { } // 정적메서드 선언 불가

}

}

A클래스 외부에서 인스턴트 멤버 클래스인 B의 객체를 생성하려면 

먼저 A객체를 성생하고 B객체를 생성해야 합니다.

public class Main {

public static void main(String[] args) {

A a = new A(); // A 객체를 먼저 생성합니다.

//인스턴스 멤버 클래스 객체 생성

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

b.field1 = 3;

b.method1();

}


정적 멤버 클래스

static 키워드가 선언된 클래스. 

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

class A {

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

/**정적 멤버 클래스**/ 

                static class C { 

                  C() { System.out.println("C 객체가 생성됨"); }//생성자

                  int field1; // 인스턴스 필드

                  static int field2;  // 정적 필드

                  void method1() { } //인스턴스 메서드

                  static void method2() { } // 정적 메서드 모두 선언가능

      }

}

인스턴스 멤버 클래스와는 다르게 A클래스 외부에서 C클래스의 객체를 생성하기 위해서는 A객체를 생성할 필요없이 바로 C객체를 생성하면 됩니다.

public class Main {

 

public static void main(String[] args) {

//정적 멤버 클래스 객체 생성

A.C c = new A.C();

c.field1 = 3;

c.method1();

A.C.field2 = 3;

 

A.C.method2();

       }

}

로컬 클래스

메서드 내에서 선언한 중첩  클래스. 

접근 제한자(public , private) 및 static 키워드를 붙일 수 없다.

메서드 내부에서만 사용되기 때문에 접근을 제한할 필요가 없다. 

내부에는 인스턴스 필드와 메서드만 선언이 가능하고, 

정적 필드와 메서드는 선언이 불가능하다.


/**바깥 클래스**/

class A {

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

void method() {

/**로컬 클래스**/

class D {

D() { System.out.println("D 객체가 생성됨"); }//생성자

int field1; //인스턴스 필드

//static int field2; //정적 필드 선언 불가

void method1() { } //인스턴스 메서드

//static void method2() { } // 정적 메서드 선언 불가

}

D d = new D();

d.field1 = 3;

d.method1();

}

 

}

메서드가 실행될 때 메서드 내에서 객체를 생성하고 사용해여 합니다. 

주로 비동기 처리를 위한 스레드 객체를 만들 때 사용된다고 합니다.

우선 스레드가 무엇인지는 다음에 공부하고 예제 코드를 보겠습니다.

void method() {

      class DownloadThread extends Thread { ... }

      DownloadThread thread = new DownloadThread();

      thread.start();

}

반응형