10일차
중첩 클래스
- 클래스 내부에 선언한 클래스를 말합니다.
- 중첩 클래스를 사용하면 두 클래스의 멤버들을 서로 쉽게 접근할수 있습니다.
- 코드의 복잡성을 줄일수 있습니다.
- 클래스의 멤버로서 선언되는 중첩 클래스를 멤버 클래스라고 합니다.
인스턴스 멤버 클래스
- 인스턴스 멤버 클래스는 static 키워드 없이 중첩 선언된 클래스를 말합니다.
- 정적필드와 메소드는 선언 할수 없습니다.
class B {
B() { System.out.println("B 객체 생성"); }
int field1;
void method1() { }
}
정적 멤버 클래스
- static 키워드로 선언된 클래스를 말합니다.
- 모든 종류의 필드와 메소드를 선언할수 있습니다.
static class C {
C() { System.out.println("C 객체 생성"); }
int field1;
static int field2;
void method1() { }
static void method2() { }
}
로컬 클래스
- 생성자 또는 메소드 내부에서 선언되는 중첩 클래스를 로컬 클래스라고 합니다.
- 로컬 클래스 내부에는 인스턴스 필드와 메소드만 선언할수 있습니다.
- 메소드를 실행할때만 사용되고 메소드가 종료되면 없어집니다.
void method() {
class D {
D() { System.out.println("D 객체 생성"); }
int field1;
void method1() { }
}
D d = new D();
d.field1 = 3;
d.method1();
}
예제
package sec09.exam01;
class A {
A() {
System.out.println("A 객체 생성");
}
class B {
B() { System.out.println("B 객체 생성"); }
int field1;
void method1() { }
}
static class C {
C() { System.out.println("C 객체 생성"); }
int field1;
static int field2;
void method1() { }
static void method2() { }
}
void method() {
class D {
D() { System.out.println("D 객체 생성"); }
int field1;
void method1() { }
}
D d = new D();
d.field1 = 3;
d.method1();
}
}
package sec09.exam01;
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
A a = new A();
A.B b = a.new B();
b.field1 = 3;
b.method1();
A.C c = new A.C();
c.field1 = 3;
c.method1();
A.C.field2 = 3;
A.C.method2();
a.method();
}
}
중첩 인터페이스
- 클래스의 멤버로 선언된 인터페이스 입니다.
- 하나의 인터페이스 내부에 다른 인터페이스를 정의 하는것을 말합니다.
- 내부 인터페이스를 외부에 노출시키지 않고 논리적으로 관련된 인터페이스를 그룹화하는데 사용할수 있습니다.
예제
Button.java
package sec09.exam01;
public class Button {
OnclickListener listener;
void setOnclickListener(OnclickListener listener) {
this.listener = listener;
}
void touch() {
listener.onClick();
}
static interface OnclickListener {
void onClick();
}
}
CallListener.java
package sec09.exam01;
public class CallListener implements Button.OnclickListener {
@Override
public void onClick() {
System.out.println("전화 거는 중");
}
}
MessageListener.java
package sec09.exam01;
public class MessageListener implements Button.OnclickListener {
@Override
public void onClick() {
System.out.println("메시지를 보냄");
}
}
ButtonExample.java
package sec09.exam01;
public class ButtonExample {
public static void main(String[] args) {
// TODO Auto-generated method stub
Button btn = new Button();
btn.setOnclickListener(new CallListener());
btn.touch();
btn.setOnclickListener(new MessageListener());
btn.touch();
}
}
익명 자식 객체
- 익명 클래스를 사용하여 부모 클래스나 인터페이스를 상속받거나 구현하는 이름이 없는 자식 객체를 말합니다.
- 익명 자식 객채에 새롭게 정의된 필드나 메소드는 익명 자식 객체 내부에서만 사용됩니다.
(외부에서 접근이 안됩니다.) - 아래는 익명 자식 객체를 생성하여 사용하는 방법입니다.
부모 클래스 [필드|변수] = new 부모클래스(매개값, ..) {
//필드
//메소드
}
익명 구현 객체
- 익명 클래스를 사용하여 인터페이스를 구현하는 이름이 없는 객체를 말합니다.
- 구현 클래스가 재사용되지 않고 오로지 특정위치에서 사용하는경우에 익명구현 객체를 생성 하는것이 좋습니다.
인터페이스 [필드|변수] = new 인터페이스() {
//인터페이스에 선언된 추상 메소드의 실체 메소드 선언
//필드
//메소드
}
'학습단 > JAVA 학습단' 카테고리의 다른 글
11. 혼공자 11일차(예외) (0) | 2023.07.17 |
---|---|
2주차 완료 (2) | 2023.07.15 |
9. 혼공자 9일차(인터페이스) (0) | 2023.07.14 |
8. 혼공자 8일차(상속) (0) | 2023.07.13 |
7. 혼공자 7일차(메소드) (0) | 2023.07.11 |