본문 바로가기

2023.11.21-2024.05.31

240103 JAVA Inner

 

//중첩 클래스 : 클래스 속 클래스

/*
 * 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