//중첩 클래스 : 클래스 속 클래스
/*
* Inner Class 내부 클래스
* 클래스 내부에 선언된 클래스입니다. = 두 클래스가 서로 긴밀한 관계
*
* 장점
* 내부 클래스에서 외부 클래스의 멤버들을 휩게 접근할 수 있습니다.
* 캡슐화, 코드의 복잡성을 줄여줍니다.
*
* 보통의 클래스들
* class A{}
* class B{}
*
* 내부 클래스는
*
* class A{
* class B{
*
* }
* }
*
* 종류
* 스테틱 클래스 : 외부 클래스의 멤버 변수 위치에 선언.
* 외부 클래스의 스테틱 멤버처럼 다뤄집니다.
* 주로 외부 클래스의 스테틱 멤버, 특히 스테틱 메소드에서 사용될 목적으로 선언.
*
* 멤버 클래스 : 외부 클래스의 멤버 변수 위치에 선언.
* 외부 클래스의 인스턴스 멤버처럼 사용합니다.
* 주로 외부 클래스의 인스턴스 멤버들과 관련된 작업에 활용됩니다.
*
* 지역 클래스 : 외부 클래스의 메소드나 초기화 블럭 안에서 선언합니다.
* 선언된 영역 내부에서만 사용가능합니다.
*
* 익명 클래스 : 클래스 선언과 객체 생성을 동시에 하는 이름이 없는 클래스(일회용)
*
* */
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
|
class A {
public A() {
System.out.println("A클래스가 생성됨.");
}
class B {public int field1;
// 인스턴스 멤버 클래스
public B() {
int field1;
int field2;
System.out.println("B객체가 생성됨.");
}
public void methodB() {
// public static void methodB2() { static 붙이면 안된다.
}// class B
}
static class C {
int field1;
static int field2;
public C() {
System.out.println("C 객체가 만들어짐");
}
public void methodC() {
}
public static void methodC2() {
}
}// class C
public void method() { // A의 메소드()
// 로컬영역
int num = 10; // 지역 변수
class D {// 지역 클래스
int field1;
public D() {
System.out.println("D 객체가 생성됨.");
}
public void methodD() {
}
// public static void methodD2(){}
}// class D
D d = new D();// 인스턴스 생성
d.field1 = 3;
d.methodD();
}// method
}// class A
public class Inner01 {
public static void main(String[] args) {
A a = new A();
A.B b = a.new B();
b.field1= 1;
b.methodB();
A.C c = new A.C();
c.field1 = 1;
c.methodC();
A.C.methodC2();//static method
a.method();
}
}
|
cs |
A클래스가 생성됨.
B객체가 생성됨.
C 객체가 만들어짐
D 객체가 생성됨.
Inner02
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
package com.sukgi.inner;
class Button{
OnClickListener listener;
void setOnClickListener(OnClickListener listener) {
this.listener = listener;
}
void touch(){
listener.onClick();
}
static interface OnClickListener{
void onClick();
}
}
public class Inner02 implements Button.OnClickListener{
public static void main(String[] args) {
}
@Override
public void onClick() {
}
}
|
cs |
Button 클래스:
Button 클래스는 이벤트 처리를 위한 리스너를 가지고 있습니다. 이벤트가 발생하면 등록된 리스너의 onClick 메소드가 호출됩니다. OnClickListener는 onClick 메소드를 정의한 인터페이스입니다.
Inner02 클래스:
Inner02 클래스는 Button.OnClickListener 인터페이스를 구현합니다.
Inner02 클래스에서 Button.OnClickListener 인터페이스를 구현하고, onClick 메소드를 재정의합니다. 이 메소드에서는 이벤트가 발생했을 때 수행할 동작을 정의할 수 있습니다.
main 메소드에서는 Button 객체를 생성하고, 해당 객체에 리스너로 Inner02 객체를 등록하는 등의 작업을 수행할 수 있습니다.
Inner03
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
package com.sukgi.inner;
public class Inner03 {
public static void main(String[] args) {
Button button = new Button();
button.setOnClickListener(new Inner02());
button.touch();
}
}
|
cs |
Inner03 클래스:
- main 메소드를 가지고 있는 클래스입니다.
- Button 객체를 생성하고, setOnClickListener 메소드를 사용하여 이벤트 리스너로 Inner02 객체를 등록합니다.
- touch 메소드를 호출하여 이벤트를 발생시킵니다.
Inner04
/*익명개체(익명 클래스)
* 클래스 명이 없는 클래스, 선언과 동시에 인스턴스 생성을 하나로 통합한 클래스
* 클래스를 인수값으로 사용하는 클래스
* 객체를 한 번만 사용할 경우에 씁니다.
*
* 클래스의 선언부가 없기때문에 이름이 없습니다 = 생성자를 가질 수 없습니다.
* 슈퍼 클래스의 이름이나 구현할 인터페이스를 구현하거나 둘 이상의 인터페이스를 구현할 수 없습니다.
* 오직 하나의 클래스를 상속받거나 하나의 인터페이스만 구현 가능합니다.
*
* 코드 블럭에 클래스를 선언하는 점만 제외하고는 생성자를 호출하는 것과 동일합니다.
* 객체를 구성하는 new문장 뒤에 클래스의 블록{} 즉, 메소드를 구현한 블록이 있고 블록 끝에는 세미콜론이 붙습니다.
* new 뒤에 오는 생성자명이 기존 클래스명이면 익명 클래스고 자동으로 클래스의 하위 클래스가 됩니다.
*
* 인터페이스인 경우에는 인터페이스를 상속하는 부모 클래스가 Object가 됩니다.
*
* */
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
package com.sukgi.inner;
import java.util.ArrayList;
import java.util.List;
class Anonymous {
public void print() {
System.out.println("출력합니다.");
}
}
public class Inner04 {
public static void main(String[] args) {
List<Integer> list = new ArrayList<Integer>();
Anonymous any = new Anonymous() {
@Override
public void print() {
System.out.println("프린트 합니다.");
}
};
any.print();
}
}
|
cs |
'2023.11.21-2024.05.31' 카테고리의 다른 글
240103 JAVA IO(OutputStream,InputStream) (1) | 2024.01.03 |
---|---|
240103 JAVA Stack (0) | 2024.01.03 |
240103 JAVA Queue01 (0) | 2024.01.03 |
240103 JAVA Thread (2) | 2024.01.03 |
231228 HTML BoardDAO.java (0) | 2024.01.02 |