안녕하세요 알통몬입니다. 공감 및 댓글은 포스팅 하는데 아주아주 큰 힘이 됩니다!! 포스팅 내용이 찾아주신 분들께 도움이 되길 바라며 더 깔끔하고 좋은 포스팅을 만들어 나가겠습니다^^
|
클래스 내부에서 선언되는 위치에 따라 두 가지로 분류됩니다.
멤버 클래스 : 클래스의 멤버로서 선언되는 중첩 클래스.
로컬 클래스 : 메서드 내부에서 선언되는 중첩 클래스
멤버 클래스와 로컬 클래스의 차이
멤버 클래스 : 클래스나 객체가 사용 중이라면, 언제든지 재사용이 가능하지만,
로컬 클래스 : 메서드 샐행 시에만 사용되고 메서드가 실행 종료되면 없어집니다.
멤버 클래스도 하나의 클래스이기 때문에 컴파일하면 .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();
}
'자바' 카테고리의 다른 글
JAVA 자바 중첩 클래스: 중첩 클래스의 접근 제한 - 로컬 클래스에서 사용 제한 / 중첩 클래스에서 바깥 클래스 참조 얻기 (0) | 2017.03.13 |
---|---|
JAVA 자바 중첩 클래스 : 중첩 클래스의 접근 제한 - 바깥 필드와 메서드에서 사용 제한, 멤버 클래스에서 사용 제한 (0) | 2017.03.13 |
JAVA - 중첩 클래스와 중첩 인터페이스의 개념 (0) | 2017.03.13 |
JAVA 자바 디폴트 메서드와 인터페이스 확장- 디폴트 메서드가 있는 인터페이스 상속 (0) | 2017.03.13 |
JAVA 자바 디폴트 메서드와 인터페이스 확장 - 디폴트 메서드의 필요성 (0) | 2017.03.13 |