반응형
- 중첩 클래스
- 선언 위치에 따라 다음과 같이 분류된다.
- 멤버 클래스
- 인스턴스 멤버 클래스
- 정적 멤버 클래스
- 로컬 클래스
- 인스턴스 멤버 클래스
- 인스턴스 필드와 인스턴스 메소드, 상수 필드만 선언 가능하다.
- 정적필드와 정적 메소드를 선언할 수 없다.
public class AAA {
// 가능 : 인스턴스 필드, 인스턴스 메소드, 상수
// 불가능 : 정적 필드, 스태틱 블록, 정적 메소드
// 멤버 클래스
class BBB {
public int bb1; // 인스턴스 필드
// static int bb2 = 10; // 정적 필드(X)
static final int BB3 = 10; // 상수
// static {} // 스태틱 블록(X)
public BBB() {
System.out.println("중첩클래스 BBB의 생성자");
}
public void methodBB() { // 인스턴스 메소드
System.out.println("중첩클래스 메소드");
}
// public static void methodCC() {} // 정적 메소드(X)
}
}
===================================================================
메인클래스
import exam03.AAA.BBB; // 동일패키지더라도 반드시 임포트 해야 함
public class AAADemo {
public static void main(String[] args) {
// AAA의 내부 클래스 BBB의 객체를 생성하려면
// 반드시 AAA 객체가 생성되어야 한다.
AAA aaa = new AAA();
BBB b = aaa.new BBB();
System.out.println(b.bb1);
b.methodBB();
System.out.println(BBB.BB3);
}
}
- 정적 멤버 클래스
- 모든 종류의 필드와 메서드를 선언할 수 있다.
public class AAA {
static class CCC { // 정적 멤버 클래스
int ccc;
static int ccc2;
static final int CONT_CC; // 상수
static { // 스태틱 블록
ccc2 = 12345;
CONT_CC = 1000;
}
public CCC() { // 생성자
System.out.println("정적 멤버 클래스 CCC 객체 생성");
}
// 인스턴스 메소드
void methodA() {
System.out.println("정적 멤버 클래스 CCC : 인스턴스 메소드");
}
// 정적 메소드
static void methodAA() {
System.out.println("정적 멤버 클래스 CCC : 정적 메소드");
}
}
}
==================================================================
메인 클래스
public class MainAAA {
public static void main(String[] args) {
System.out.println(AAA.CCC.ccc2);
System.out.println(AAA.CCC.CONT_CC);
AAA.CCC.methodAA(); // 정적 메소드호출
AAA.CCC c = new AAA.CCC();
c.methodA(); // 인스턴스 메소드 호출
c.methodAA(); // 정적 메소드 호출
}
}
- 로컬 클래스
public class AA {
void methodA() {
System.out.println("methodA 호출");
class DD {
int dd; // 인스턴스 필드
// static int dd2; // 정적 필드 X
// static {} // static 블록 X
public DD() {
System.out.println("로컬클래스 DD 객체생성");
}
void methodD() {
System.out.println("로컬 클래스 인스턴스 메소드 : methodD");
}
}
DD dd = new DD(); // 로컬 클래스 객체 생성 : 외부에서 생성 불가능
System.out.println(dd.dd);
dd.methodD();
}
======================================================================
메인 클래스
public class AADemo {
public static void main(String[] args) {
AA a = new AA();
// a.new DD(); 로컬 클래스: 외부에서 생성 불가
a.methodA();
}
}
값
methodA 호출
로컬클래스 DD 객체생성
0
로컬 클래스 인스턴스 메소드 : methodD
- 외부 필드에서 사용 제한
public class AA {
public AA a = new AA();
public static AA aa = new AA();
BB b = new BB();
// static BB bb = new BB(); // static 생성 불가
CC c = new CC();
static CC cc = new CC();
class BB {
public BB() {
System.out.println("인스턴스 클래스: BB객체 생성");
}
}
static class CC {
public CC() {
System.out.println("인스턴스 클래스: CC객체 생성");
}
}
void methodA() {
BB b = new BB(); // 인스턴스 클래스 생성
CC c = new CC(); // 정적 클래스 생성
}
static void methodAA() {
// BB bb = new BB(); // 인스턴스 멤버 클래스 생성 불가
CC c = new CC(); // 정적클래스 객체생성
}
}
- 멤버 클래스에서 사용 제한
public class AA { // AA 클래스 : 외부
int aa = 10; // 외부 클래스의 인스턴스 필드
static int bb = 10; // 외부 클래스의 정적 필드
void methodA() {
System.out.println("외부클래스의 인스턴스 메소드");
}
static void methodAA() {
System.out.println("외부클래스의 정적 메소드");
}
class BB { // BB 클래스 : 내부 인스턴스 클래스
void methodB() {
System.out.println(aa); // 외부 인스턴스 필드로 접근 가능
System.out.println(bb); // 외부 클래스의 정적 필드 접근 가능
methodA(); // 외부 클래스의 인스턴스 메소드 접근가능
methodAA(); // 외부 클래스의 정적 메소드 접근가능
}
}
static class CC { // CC 클래스 : 내부 정적 클래스
void methodC() {
// System.out.println(aa); // 외부 인스턴스 필드로 접근 불가능(X)
System.out.println(bb); // 외부 클래스의 정적 필드 접근 가능
// methodA(); // 외부 클래스의 인스턴스 메소드 접근 불가능(X)
methodAA(); // 외부 클래스의 정적 메소드 접근가능
}
}
}
====================================================================
메인 클래스
public class AAMain {
public static void main(String[] args) {
AA aa = new AA();
BB bb = aa.new BB();
bb.methodB();
}
}
값
10
10
외부클래스의 인스턴스 메소드
외부클래스의 정적 메소드
반응형
'학습 > JAVA' 카테고리의 다른 글
11. 기본 API 클래스(1) (0) | 2022.10.26 |
---|---|
10. 예외처리 (0) | 2022.10.25 |
8. 인터페이스 (0) | 2022.10.17 |
7. 상속(Inheritance) (강제타입 변환, instanceof, 추상(abstract)클래스 (0) | 2022.10.17 |
7. 상속(Inheritance) (Override 불가, 다형성, List<E>) (0) | 2022.10.12 |
댓글