중첩 클래스
클래스의 멤버로서 선언되는 중첩 클래스를 멤버 클래스라고 하고, 메소드 내부에서 선언되는 중첩 클래스를 로컬 클래스라고 한다.,
인스턴스 멤버 클래스
인스턴스 멤버 클래스는 인스턴스 필드와 메소드만 선언이 가능하고 정적 필드와 메소드는 선언할 수 없다.
class A {
//인스턴스 멤버 클래스
Class B {
B() {} //생성자
int field1; //인스턴스 필드
//static int field2; //정적 필드(X)
void method1() {} //인스턴스 메소드
//static void method2() {} //정적 메소드 (X)
}
}
A a = new A();
A.B b = a.new B();
b.field1 = 3;
b.method1();
정적 멤버 클래스
정적 멤버 클래스는 모든 종류의 필드와 메소드를 선언할 수 있다.
class A {
//정적 멤버 클래스
static Class C {
C() {} //생성자
int field1; //인스턴스 필드
static int field2; //정적 필드 (O)
void method1() {} //인스턴스 메소드
static void method2() {} //정적 메소드 (O)
}
}
A.C c = news A.C();
c.field1 = 3;
c.method1();
A.C.field2 = 3;
A.C.method2();
로컬 클래스
로컬 클래스는 접근 제한자 및 static을 붙일 수 없다. 로컬 클래스는 메소드 내부에서만 사용되므로 접근을 제한할 필요가 없기 때문이다.
로컬 클래스에서 사용 제한
로컬 클래스에서 사용된 매개 변수와 로컬 변수는 모두 final 특성을 갖는다. 자바7까지는 반드시 final 키워드를 붙여야 하지만 8버전 부터는 붙이지 않아도 final 특성을 가지고 있음을 주목해야 한다.
중첩 인터페이스
중첩 인터페이스는 클래스의 멤버로 선언된 인터페이스를 말한다. 인터페이스를 클래스 내부에 선언하는 이유는 해당 클래스와 긴밀한 관계를 맺는 구현 클래스를 만들기 위해서이다. 특히 UI프로그래밍에서 이벤트를 처리할 목적으로 많이 활용된다.
package sec04.exam01_nestedinterface;
public class Button {
OnClickListener listener; // 인터페이스 타입 필드
void setOnClickListener(OnClickListener listener) { // 매개 변수의 다형성
this.listener = listener;
}
void touch() {
listener.onClick(); // 구현 객체의 onClick() 메소드 호출
}
interface OnClickListener { // 중첩 인터페이스
void onClick();
}
}
익명 객체
익명 객체는 이름이 없는 객체를 말한다.
-익명 객체는 단독 생성 불가
클래스를 상속하거나 인터페이스를 구현해야만 생성이 가능하다.
사용 위치
- 필드의 초기값, 로컬 변수의 초기값, 매개변수의 매개값으로 주로 대입
- UI이벤트 처리 객체나, 스레드 객체를 간편하게 생성할 목적으로 주로 활용한다.
익명 자식 객체 생성
1) 부모 타입으로 필드나 변수를 선언하고 자식 객체를 초기값으로 대입할 경우
- 자식 클래스가 재사용되지 않고, 오로지 해당 필드와 변수의 초기값으로만 사용할 경우라면 익명 자식 객체를 생성해서 초기값으로 대입하는 것이 좋은 방법이다.
- 주의할 점은 하나의 실행문이므로 끝에는 세미콜론(;)을 반드시 붙어야 한다.
- 일반 클래스와의 차이점은 생성자를 선언할 수 없다는 것이다.
// 기본형
부모클래스 [필드|변수] = new 부모클래스(매개값,...) {
// 필드
// 메소드
};
// 기본적인 방법
class Child extends Parent {} // 자식 클래스 선언
class A {
Parent field = new Child(); // 필드에 자식 객체를 대입, 다형성(객체의 부품화)을 위함.
void method() {
Parent localVar = new Child(); // 로컬 변수에 자식 객체를 대입
}
}
// 익명 자식 객체 생성해서 초기값으로 대입하는 방법
class A {
Parent field = new Parent() { // A 클래스의 필드 초기값으로 익명 자식 객체를 생성해서 대입한다.
int childField;
void childMethod() {}
@Override
void parentMethod() {}
};
}
2) 익명 객체에 새롭게 정의된 필드와 메소드
- 익명 객체 내부에서만 사용
- 외부에서는 익명 객체의 필드와 메소드에 접근할 수 없음 --> 이유 : 익명 객체는 부모 타입 변수에 대입되므로 부모 타입에 선언된 것만사용 가능
익명 구현 객체 생성
- 구현 클래스가 재사용되지 않고, 오로지 해당 필드와 변수의 초기값으로만 사용하는 경우라면 익명 구현 객체를 초기값으로 대입하는 것이 좋다.
// 기본형
인터페이스 [필드|변수] = new 인터페이스() {
// 인터페이스에 선언된 추상 메소드의 실체 메소드 선언
// 필드
// 메소드
};
// 일반적인 구현 객체를 초기값으로 대입하는 경우
class TV implements RemoteControl { }
class A {
RemoteControl field = new TV(); // 필드에 구현 객체를 대입
void method() {
RemoteControl localVar = new TV(); // 로컬 변수에 구현 객체를 대입
}
}
// 익명 구현 객체를 초기값으로 대입하는 경우
class A {
RemoteControl field = new RemoteControl() { // 필드 선언
@Override
void turnOn() {}
};
void method() {
RemoteControl localVar = new RemoteControl() { // 로컬 변수 선언
@Override
void turnOn() {}
};
}
void method1(RemoteControl rc) {}
void method2() {
method1(
new RemoteControl() { // method1()의 매개값으로 익명 구현 객체를 대입
@Override
void turnOn() {}
}
);
}
}
'교육 | 외부활동 > 이론_JAVA' 카테고리의 다른 글
KH_JAVA_13_예외처리 (0) | 2022.11.21 |
---|---|
KH_JAVA_11_인터페이스 (0) | 2022.11.18 |
KH자바수업_10_추상 클래스 (2) | 2022.11.17 |
KH자바수업_9_다형성 (0) | 2022.11.14 |
KH자바수업_8_상속 (0) | 2022.11.14 |