빈 ꡬ멍 μ±„μš°κΈ°

[Java] 클래슀 μ•ˆμ˜ 클래슀 / Static Nested Class, Member Inner Class, Local Inner class, Anonymous Inner Class

⭐⭐기둝 2024. 8. 19. 13:03

좜처

ChatGPT


Nested Class ꡬ쑰

Nested class

⨽ Static Nested Class

⨽ Inner class

    ⨽ Memeber Inner Class (Non-static Inner Class, Inner Class)

    ⨽ Local Inner class (Local Class)

    ⨽ Anonymouse Inner class (Anonymouse Class)

 

1. Outer class

  • μ™ΈλΆ€ ν΄λž˜μŠ€λŠ” λͺ¨λ“  쀑첩 클래슀(nested class)의 μ»¨ν…Œμ΄λ„ˆ 역할을 ν•œλ‹€.
  • μ€‘ν…λœ λͺ¨λ“  ν΄λž˜μŠ€λŠ” μ™ΈλΆ€ 클래슀 내뢀에 μ •μ˜λœλ‹€.

2. Static Nested Class

class OuterClass {
    static class StaticNestedClass {
        // Static Nested Class code
    }
}

쑴재 이유

1. λ©”λͺ¨λ¦¬ 관리

static nested classλŠ” μ™ΈλΆ€ 클래슀의 μΈμŠ€ν„΄μŠ€μ™€ 독립적이기 λ•Œλ¬Έμ— μ™ΈλΆ€ 클래슀의 μΈμŠ€ν„΄μŠ€λ₯Ό λ§Œλ“€μ§€ μ•Šκ³ λ„ μ‚¬μš©ν•  수 μžˆλ‹€. μ΄λŠ” λ©”λͺ¨λ¦¬ μ‚¬μš©μ„ μ΅œμ ν™”ν•˜λŠ” 데 μœ μš©ν•˜λ‹€. μ™ΈλΆ€ 클래슀의 μΈμŠ€ν„΄μŠ€λ₯Ό ν•„μš”λ‘œ ν•˜μ§€ μ•ŠλŠ” 경우, λ©”λͺ¨λ¦¬ νš¨μœ¨μ„±μ„ 높일 수 μžˆλ‹€.

2. 응집도 ν–₯상

κ΄€λ ¨ μžˆλŠ” ν΄λž˜μŠ€λ“€μ„ ν•˜λ‚˜μ˜ 논리적인 λ‹¨μœ„λ‘œ λ¬Άμ–΄ 관리할 수 있게 ν•©λ‹ˆλ‹€. μ™ΈλΆ€ ν΄λž˜μŠ€μ™€ λ…Όλ¦¬μ μœΌλ‘œ 관련이 μžˆμ§€λ§Œ, μ™ΈλΆ€ 클래슀의 μΈμŠ€ν„΄μŠ€μ™€λŠ” μƒκ΄€μ—†λŠ” 클래슀λ₯Ό μ •μ˜ν•  λ•Œ static nested classκ°€ μ ν•©ν•©λ‹ˆλ‹€.

3. μΊ‘μŠν™”

static nested classλŠ” μ™ΈλΆ€ 클래슀의 λΉ„κ³΅κ°œ 멀버에 μ ‘κ·Όν•  수 μ—†κΈ° λ•Œλ¬Έμ—, 논리적인 관계λ₯Ό μœ μ§€ν•˜λ©΄μ„œλ„ μ™ΈλΆ€ ν΄λž˜μŠ€μ™€μ˜ λΆˆν•„μš”ν•œ 결합을 ν”Όν•  수 μžˆμŠ΅λ‹ˆλ‹€.

4. μœ ν‹Έλ¦¬ν‹° 클래슀

μœ ν‹Έλ¦¬ν‹° 역할을 ν•˜λŠ” ν΄λž˜μŠ€λŠ” μ™ΈλΆ€ ν΄λž˜μŠ€μ™€μ˜ μΈμŠ€ν„΄μŠ€ 관계가 ν•„μš” μ—†μœΌλ―€λ‘œ static nested class둜 μ„ μ–Έν•˜λŠ” 것이 μ μ ˆν•©λ‹ˆλ‹€.

 

 

νŠΉμ§•

  • static ν‚€μ›Œλ“œλ₯Ό κ°€μ§€λ©° μ™ΈλΆ€ 클래슀의 μΈμŠ€ν„΄μŠ€μ™€ λ…λ¦½μ μœΌλ‘œ μ‘΄μž¬λ‹€.
  • μ™ΈλΆ€ 클래슀의 μΈμŠ€ν„΄μŠ€ 없이 생성 κ°€λŠ₯ν•˜λ‹€.
OuterClass.StaticNestedClass nestedObject = new OuterClass.StaticNestedClass();

 

  • μ™ΈλΆ€ 클래슀의 비정적 멀버에 직접 μ ‘κ·Όν•  수 μ—†λ‹€. λ‹€λ§Œ, μ™ΈλΆ€ 클래슀의 static λ©€λ²„μ—λŠ” 접근이 κ°€λŠ₯ν•˜λ‹€.

 

μ™ΈλΆ€ ν΄λž˜μŠ€μ—μ„œ μ°Έμ‘° κ°€λŠ₯ν•œ λ³€μˆ˜λ“€

  • μ°Έμ‘° κ°€λŠ₯: μ™ΈλΆ€ 클래슀의 static λ³€μˆ˜
  • μ°Έμ‘° λΆˆκ°€: μ™ΈλΆ€ 클래슀의 μΈμŠ€ν„΄μŠ€ λ³€μˆ˜

 

클래슀 λ‘œλ“œμ™€ 생성 μ‹œ λ©”λͺ¨λ¦¬ λ™μž‘

 

3. Inner class

  • λ‚΄λΆ€ ν΄λž˜μŠ€λŠ” μ™ΈλΆ€ 클래슀의 μΈμŠ€ν„΄μŠ€μ— 쒅속적이닀.
  • μ™ΈλΆ€ 클래슀의 μΈμŠ€ν„΄μŠ€κ°€ μžˆμ–΄μ•Όλ§Œ μ‚¬μš©λ  수 있으며, μ™ΈλΆ€ 클래슀의 비정적 멀버에 μ ‘κ·Όν•  수 μžˆλ‹€.

3.1 Memeber Inner Class (Inner Class)

class OuterClass {
    class InnerClass {
        // Non-static Inner Class code
    }
}

 

쑴재 이유

  • Non-static Inner ClassλŠ” μ™ΈλΆ€ 클래슀의 μΈμŠ€ν„΄μŠ€μ™€ κ°•ν•˜κ²Œ κ²°ν•©λ˜μ–΄ μ™ΈλΆ€ 클래슀의 μΈμŠ€ν„΄μŠ€κ°€ μƒμ„±λœ ν›„μ—λ§Œ 생성될 수 μžˆλ‹€. λ”°λΌμ„œ μ™ΈλΆ€ 클래슀의 λ°μ΄ν„°λ‚˜ λ©”μ„œλ“œμ™€ λ°€μ ‘ν•˜κ²Œ μ—°κ²°λœ μž‘μ—…μ„ μˆ˜ν–‰ν•  λ•Œ μœ μš©ν•˜λ‹€.
  • μ™ΈλΆ€ 클래슀의 μ„ΈλΆ€ κ΅¬ν˜„μ„ Non-static Inner Classλ₯Ό 톡해 은닉할 수 μžˆλ‹€. 예λ₯Ό λ“€μ–΄, νŠΉμ • μž‘μ—…μ΄λ‚˜ λ‘œμ§μ„ λ‚΄λΆ€ ν΄λž˜μŠ€μ—μ„œλ§Œ μ²˜λ¦¬ν•˜λ„λ‘ ν•˜μ—¬ μ™ΈλΆ€μ—μ„œ 직접 μ ‘κ·Όν•˜μ§€ λͺ»ν•˜κ²Œ ν•  수 μžˆλ‹€.
  • μ½”λ“œ ꡬ쑰λ₯Ό λͺ¨λ“ˆν™”ν•˜λŠ” 데 도움을 μ€€λ‹€. ν•œ 클래슀 내뢀에 κ΄€λ ¨λœ μ„œλΈŒ κΈ°λŠ₯듀을 κ°€μ§€λŠ” 클래슀λ₯Ό μ •μ˜ν•˜λ©΄ 가독성과 μœ μ§€λ³΄μˆ˜μ„±μ΄ λ†’μ•„μ§„λ‹€.

νŠΉμ§•

  • μ™ΈλΆ€ 클래슀의 μΈμŠ€ν„΄μŠ€μ— μ ‘κ·Όν•  수 있으며, μ™ΈλΆ€ 클래슀 μΈμŠ€ν„΄μŠ€μ™€ μ—°κ΄€λ˜μ–΄ λ™μž‘ν•œλ‹€.
  • μ™ΈλΆ€ 클래슀의 μΈμŠ€ν„΄μŠ€κ°€ μ‘΄μž¬ν•΄μ•Όλ§Œ 생성할 수 μžˆλ‹€.
  • μ™ΈλΆ€ 클래슀의 private 멀버에도 μ ‘κ·Όν•  수 μžˆλ‹€.
  • 주둜 μ™ΈλΆ€ 클래슀의 μΈμŠ€ν„΄μŠ€ λ©”μ„œλ“œλ‚˜ μƒμ„±μž λ‚΄μ—μ„œ μ‚¬μš©λœλ‹€. ...? μ˜ˆμ‹œ ν•„μš”...?

 

μ™ΈλΆ€ ν΄λž˜μŠ€μ—μ„œ μ°Έμ‘° κ°€λŠ₯ν•œ λ³€μˆ˜λ“€

  • μ°Έμ‘° κ°€λŠ₯: μ™ΈλΆ€ 클래슀의 μΈμŠ€ν„΄μŠ€ λ³€μˆ˜, static λ³€μˆ˜

 

μ‚¬μš© μ˜ˆμ‹œ

  • GUI μ• ν”Œλ¦¬μΌ€μ΄μ…˜: 이벀트 ν•Έλ“€λŸ¬λ‚˜ UI μ»΄ν¬λ„ŒνŠΈμ™€ 같은 κΈ°λŠ₯이 μ™ΈλΆ€ ν΄λž˜μŠ€μ™€ κ°•ν•˜κ²Œ μ—°κ²°λ˜μ–΄ μžˆμ„ λ•Œ Non-static Inner Classλ₯Ό μ‚¬μš©ν•œλ‹€.
class Outer {
    private String name;

    class Inner {
        void showName() {
            System.out.println("Name: " + name);  // μ™ΈλΆ€ 클래슀의 ν•„λ“œμ— μ ‘κ·Ό κ°€λŠ₯
        }
    }
}

 

클래슀 λ‘œλ“œμ™€ 생성 μ‹œ λ©”λͺ¨λ¦¬ λ™μž‘

 

3.2 Local Inner class (Local Class)

class OuterClass {
    void someMethod() {
        class LocalClass {
            // Local class inside a method
        }
    }
}

 

쑴재 이유

  • Local ClassλŠ” λ©”μ„œλ“œ 내뢀에 μ„ μ–Έλ˜μ–΄ λ©”μ„œλ“œμ˜ νŠΉμ • μž‘μ—…μ„ μΊ‘μŠν™”ν•œλ‹€. 둜직이 λ³΅μž‘ν•΄μ§ˆ λ•Œ, ν•΄λ‹Ή λ‘œμ§μ„ λ©”μ„œλ“œ λ‚΄λΆ€μ—μ„œ 클래슀 ν˜•νƒœλ‘œ 뢄리해 μž‘μ„±ν•  수 μžˆλ‹€.
  • νŠΉμ • λ©”μ„œλ“œ λ‚΄μ—μ„œλ§Œ μ˜λ―Έκ°€ μžˆλŠ” 클래슀λ₯Ό μ •μ˜ν•  수 μžˆμ–΄ μ½”λ“œμ˜ ꡬ쑰화와 가독성을 높일 수 μžˆλ‹€.
  • νŠΉμ • λ¦¬μ†ŒμŠ€λ‚˜ λ°μ΄ν„°μ˜ μ²˜λ¦¬κ°€ ν•˜λ‚˜μ˜ λ©”μ„œλ“œμ—λ§Œ κ΅­ν•œλ  λ•Œ, Local Class둜 μ„ μ–Έν•˜μ—¬ μ½”λ“œμ˜ λͺ¨λ“ˆμ„±μ„ 높이고 ν•„μš” μ—†λŠ” μ „μ—­ 접근을 ν”Όν•  수 μžˆλ‹€.

 

νŠΉμ§•

  • Local classλŠ” λ©”μ„œλ“œ 내뢀에 μ •μ˜λœ ν΄λž˜μŠ€μ΄λ‹€.
  • Local ClassλŠ” λ©”μ„œλ“œλ‚˜ μƒμ„±μžμ˜ λ‚΄λΆ€μ—μ„œ μ„ μ–Έλ˜λ―€λ‘œ, ν•΄λ‹Ή λ©”μ„œλ“œλ‚˜ μƒμ„±μžκ°€ 싀행될 λ•Œμ—λ§Œ μœ νš¨ν•˜λ‹€.
  • λ³΅μž‘ν•œ λ‘œμ§μ„ μ²˜λ¦¬ν•˜κΈ° μœ„ν•΄ λ©”μ„œλ“œ 내뢀에 클래슀λ₯Ό μ„ μ–Έν•˜μ—¬ μ‚¬μš©ν•˜λŠ” κ²½μš°κ°€ λ§Žλ‹€.
  • μ™ΈλΆ€ 클래슀의 멀버에 μ ‘κ·Όν•  수 μžˆλ‹€.
  • λ©”μ„œλ“œμ— μ„ μ–Έλ˜ 둜컬 λ³€μˆ˜λ₯Ό μ°Έμ‘°ν•  수 μžˆμœΌλ‚˜, 참쑰된 λ³€μˆ˜λŠ” final λ˜λŠ” effectively final이어야 ν•œλ‹€.
  • Local classκ°€ μ°Έμ‘°ν•˜λŠ” λ©”μ„œλ“œ μ•ˆ 둜컬 λ³€μˆ˜κ°€ final λ˜λŠ” effectively final 이어야 ν•˜λŠ” 이유
더보기

Local classκ°€ μ°Έμ‘°ν•˜λŠ” λ©”μ„œλ“œ μ•ˆ 둜컬 λ³€μˆ˜κ°€ final λ˜λŠ” effectively final 이어야 ν•˜λŠ” 이유

 

Local calssμ—μ„œ 둜컬 λ³€μˆ˜λ₯Ό μ°Έμ‘°ν•  수 μžˆμ§€λ§Œ, 참쑰된 λ³€μˆ˜λŠ” final λ˜λŠ” effectively final이어야 ν•œλ‹€λŠ” κ·œμΉ™μ˜ μ΄μœ λŠ” μžλ°”μ˜ λ©”λͺ¨λ¦¬ λͺ¨λΈκ³Ό 관련이 μžˆλ‹€.

 

1. 둜컬 λ³€μˆ˜μ˜ 생λͺ… 주기와 클래슀의 생λͺ… μ£ΌκΈ°

 

  • 둜컬 λ³€μˆ˜λŠ” λ©”μ„œλ“œκ°€ μ’…λ£Œλ˜λ©΄ λ©”λͺ¨λ¦¬μ—μ„œ 사라진닀. 즉, μŠ€νƒ λ©”λͺ¨λ¦¬μ—μ„œ μ œκ±°λœλ‹€.
  • ν•˜μ§€λ§Œ 둜컬 ν΄λž˜μŠ€λŠ” λ©”μ„œλ“œκ°€ μ’…λ£Œλœ 이후에도 싀행될 수 μžˆλ‹€. λ©”μ„œλ“œκ°€ μ’…λ£Œλœ 후에도 둜컬 ν΄λž˜μŠ€κ°€ λ©”λͺ¨λ¦¬ μ•ˆμ—μ„œ 살아남아 ν•΄λ‹Ή λ³€μˆ˜λ₯Ό μ°Έμ‘°ν•˜λ €λŠ” 경우, 이미 λ©”λͺ¨λ¦¬μ—μ„œ 사라진 λ³€μˆ˜μ— μ ‘κ·Όν•˜λ €κ³  ν•˜κ²Œ λ˜μ–΄ λ¬Έμ œκ°€ λ°œμƒν•œλ‹€.

둜컬 ν΄λž˜μŠ€κ°€ λ©”μ„œλ“œκ°€ μ’…λ£Œλœ 이후에도 싀행될 수 μžˆλŠ” 상황에 λŒ€ν•œ μ˜ˆμ‹œ

둜컬 ν΄λž˜μŠ€κ°€ λ©”μ„œλ“œ λ‚΄λΆ€μ—μ„œ μ •μ˜λ˜μ—ˆμ§€λ§Œ, ν•΄λ‹Ή 클래슀의 μΈμŠ€ν„΄μŠ€κ°€ λ©”μ„œλ“œ μ™ΈλΆ€μ—μ„œλ„ μž‘λ™ν•  수 μžˆλŠ” 상황을 μ˜ˆμ‹œλ‘œ 듀을 것이닀.

μ•„λž˜ μ˜ˆμ œλŠ” java.lang.Runnable μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ‚¬μš©ν•˜λŠ” λ©€ν‹°μŠ€λ ˆλ“œ ν”„λ‘œκ·Έλž¨μ΄λ‹€. 이 ν”„λ‘œκ·Έλž¨μ—μ„œλŠ” λ©”μ„œλ“œ 내뢀에 둜컬 클래슀λ₯Ό μ •μ˜ν•˜κ³ , κ·Έ 클래슀의 μΈμŠ€ν„΄μŠ€κ°€ λ©”μ„œλ“œκ°€ μ’…λ£Œλœ 후에도 μ‹€ν–‰λ˜λŠ” 상황을 보여쀀닀.

public class LocalClassExample {

    public void startThread() {
        // λ©”μ„œλ“œ λ‚΄λΆ€μ—μ„œ 둜컬 클래슀 μ •μ˜
        class Task implements Runnable {
            @Override
            public void run() {
                // λ©”μ„œλ“œκ°€ μ’…λ£Œλœ 후에도 싀행될 둜직
                System.out.println("Task is running...");
            }
        }

        // 둜컬 클래슀의 μΈμŠ€ν„΄μŠ€ 생성
        Task task = new Task();
        // μƒˆλ‘œμš΄ μŠ€λ ˆλ“œλ₯Ό μ‹œμž‘ν•˜λ©΄μ„œ 둜컬 클래슀 μΈμŠ€ν„΄μŠ€ μ‹€ν–‰
        Thread thread = new Thread(task);
        thread.start(); // μŠ€λ ˆλ“œκ°€ μ‹œμž‘λ˜λ©΄ λ©”μ„œλ“œκ°€ μ’…λ£Œλœ 후에도 Taskκ°€ 싀행됨
    }

    public static void main(String[] args) {
        LocalClassExample example = new LocalClassExample();
        example.startThread();

        System.out.println("Main method finished.");
    }
}

 

μ‹€ν–‰ κ²°κ³Ό

Main method finished.
Task is running...

 

μ„€λͺ…

 

  • startThread() λ©”μ„œλ“œ λ‚΄λΆ€μ—μ„œ TaskλΌλŠ” μ΄λ¦„μ˜ 둜컬 클래슀λ₯Ό μ •μ˜ν•œλ‹€. 이 ν΄λž˜μŠ€λŠ” Runnable μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•˜μ—¬ μŠ€λ ˆλ“œμ—μ„œ 싀행될 수 μžˆλ‹€.
  • Task 클래슀의 μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν•˜κ³ , ν•΄λ‹Ή μΈμŠ€ν„΄μŠ€λ₯Ό Thread 객체에 μ „λ‹¬ν•œ λ’€ thread.start()λ₯Ό ν˜ΈμΆœν•œλ‹€. 이둜 인해 μƒˆλ‘œμš΄ μŠ€λ ˆλ“œκ°€ μ‹œμž‘λ˜κ³ , Task 클래슀의 run() λ©”μ„œλ“œκ°€ μ‹€ν–‰λœλ‹€.
  • startThread() λ©”μ„œλ“œλŠ” μŠ€λ ˆλ“œκ°€ μ‹€ν–‰λ˜λŠ” 도쀑에 μ’…λ£Œλ˜μ§€λ§Œ, Task ν΄λž˜μŠ€λŠ” μŠ€λ ˆλ“œ λ‚΄μ—μ„œ μ‹€ν–‰λ˜λ―€λ‘œ λ©”μ„œλ“œκ°€ μ’…λ£Œλœ 후에도 Task의 run() λ©”μ„œλ“œκ°€ κ³„μ†ν•΄μ„œ μ‹€ν–‰λœλ‹€.

이 μ˜ˆμ‹œμ—μ„œμ²˜λŸΌ, 둜컬 ν΄λž˜μŠ€λŠ” λ©”μ„œλ“œ λ‚΄λΆ€μ—μ„œ μ •μ˜λ˜μ§€λ§Œ, κ·Έ μΈμŠ€ν„΄μŠ€λŠ” λ©”μ„œλ“œκ°€ μ’…λ£Œλœ 후에도 싀행될 수 μžˆλ‹€.

 

 

2. 캑쳐된 λ³€μˆ˜ 볡사

  • μžλ°”μ—μ„œλŠ” μ΄λŸ¬ν•œ 문제λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄ 둜컬 λ³€μˆ˜μ˜ 값을 λ³΅μ‚¬ν•΄μ„œ 둜컬 ν΄λž˜μŠ€κ°€ ν•΄λ‹Ή 값을 μ‚¬μš©ν•˜κ²Œ ν•œλ‹€. μ΄λ•Œ, 값이 λ³€κ²½λ˜λ©΄ λ³΅μ‚¬λœ κ°’κ³Ό μ›λž˜ λ³€μˆ˜μ˜ 값이 μΌμΉ˜ν•˜μ§€ μ•Šκ²Œ λ˜λŠ” λ¬Έμ œκ°€ 생긴닀. 이λ₯Ό λ°©μ§€ν•˜κΈ° μœ„ν•΄ ν•΄λ‹Ή λ³€μˆ˜λŠ” finalμ΄κ±°λ‚˜ effectively final이어야 ν•œλ‹€λŠ” μ œν•œμ΄ μ μš©λœλ‹€. μ΄λ ‡κ²Œ ν•¨μœΌλ‘œμ¨, 둜컬 ν΄λž˜μŠ€κ°€ μ°Έμ‘°ν•˜λŠ” 값이 λ³€κ²½λ˜μ§€ μ•ŠμŒμ„ 보μž₯ν•œλ‹€.

 

3. final λ˜λŠ” effectively final의 의미

 

  • final: ν•΄λ‹Ή λ³€μˆ˜κ°€ ν•œ 번만 μ΄ˆκΈ°ν™”λ˜κ³  λ³€κ²½λ˜μ§€ μ•ŠμŒμ„ μ˜ν•œλ‹€. 즉, 둜컬 ν΄λž˜μŠ€κ°€ μ°Έμ‘°ν•˜λŠ” 값이 λΆˆλ³€ν•˜κ²Œ 보μž₯λœλ‹€.
  • effectively final: final ν‚€μ›Œλ“œκ°€ λͺ…μ‹œμ μœΌλ‘œ μ„ μ–Έλ˜μ§€ μ•Šμ•˜μ§€λ§Œ, ν•΄λ‹Ή λ³€μˆ˜κ°€ μ½”λ“œμ—μ„œ λ³€κ²½λ˜μ§€ μ•ŠμŒμ„ μ˜λ―Έν•œλ‹€. μ΄λŠ” μžλ°” 8 이후뢀터 λ„μž…λœ κ°œλ…μœΌλ‘œ, λ³€μˆ˜μ˜ 값이 ν•œ 번 μ„€μ •λœ ν›„ λ³€κ²½λ˜μ§€ μ•ŠλŠ”λ‹€λ©΄ effectively final둜 κ°„μ£Όλœλ‹€.

 

 

κ²°λ‘ 

둜컬 ν΄λž˜μŠ€μ—μ„œ μ°Έμ‘°λ˜λŠ” λ³€μˆ˜λŠ” λ©”λͺ¨λ¦¬ λͺ¨λΈκ³Ό λ™μž‘μ— λŒ€ν•œ 일관성을 μœ μ§€ν•˜κΈ° μœ„ν•΄ final λ˜λŠ” effectively final둜 μ œν•œλœλ‹€. 이둜써, λ©”λͺ¨λ¦¬μ—μ„œ μ‚¬λΌμ§€κ±°λ‚˜ λ³€μ§ˆλœ λ³€μˆ˜λ₯Ό μ°Έμ‘°ν•˜λ €λŠ” μœ„ν—˜μ„ λ°©μ§€ν•˜κ³ , μ•ˆμ •μ μΈ μ½”λ“œ λ™μž‘μ„ 보μž₯ν•œλ‹€.

 

μ™ΈλΆ€ ν΄λž˜μŠ€μ—μ„œ μ°Έμ‘° κ°€λŠ₯ν•œ λ³€μˆ˜λ“€

  • μ°Έμ‘° κ°€λŠ₯: μ™ΈλΆ€ 클래슀의 μΈμŠ€ν„΄μŠ€ λ³€μˆ˜/static λ³€μˆ˜, μ™ΈλΆ€ λ©”μ„œλ“œμ˜ final λ˜λŠ” effectively final λ³€μˆ˜

 

μ‚¬μš© μ˜ˆμ‹œ

  • 이벀트 기반 ν”„λ‘œκ·Έλž˜λ°: 이벀트 μ²˜λ¦¬μ— ν•„μš”ν•œ λ‘œμ§μ„ λ©”μ„œλ“œ λ‚΄λΆ€μ—μ„œ μ²˜λ¦¬ν•΄μ•Ό ν•  λ•Œ Local Classκ°€ μœ μš©ν•˜λ‹€.
class Outer {
    public void someMethod() {
        class Local {
            void print() {
                System.out.println("This is a local class");
            }
        }
        Local local = new Local();
        local.print();
    }
}

 

클래슀 λ‘œλ“œμ™€ 생성 μ‹œ λ©”λͺ¨λ¦¬ λ™μž‘

 

3.3 Anonymouse Inner class (Anonymouse class)

class OuterClass {
    void someMethod() {
        Runnable r = new Runnable() {
            public void run() {
                // Anonymous inner class code
            }
        };
    }
}

 

쑴재 이유

  • μΈν„°νŽ˜μ΄μŠ€λ‚˜ 좔상 클래슀의 κ°„λ‹¨ν•œ κ΅¬ν˜„μ²΄κ°€ ν•„μš”ν•œ 경우, λ³„λ„μ˜ 클래슀λ₯Ό μ„ μ–Έν•˜μ§€ μ•Šκ³  읡λͺ… 클래슀λ₯Ό μ‚¬μš©ν•˜μ—¬ λΉ λ₯΄κ²Œ μ½”λ“œλ₯Ό μž‘μ„±ν•  수 μžˆλ‹€.
  • νŠΉμ • 객체가 ν•œ 번만 μ‚¬μš©λ˜κ±°λ‚˜ 맀우 μ œν•œλœ λ²”μœ„μ—μ„œ μ‚¬μš©λ  λ•Œ μœ μš©ν•˜λ‹€. 주둜 콜백, 이벀트 λ¦¬μŠ€λ„ˆ, μŠ€λ ˆλ“œ μž‘μ—… λ“±μ—μ„œ μ‚¬μš©λœλ‹€.
  • νŠΉμ • λ©”μ„œλ“œλ₯Ό ν•œ 번만 μ˜€λ²„λΌμ΄λ“œν•΄μ„œ μ‚¬μš©ν•  λ•Œ λ³„λ„μ˜ 클래슀λ₯Ό μ •μ˜ν•˜λŠ” λŒ€μ‹  읡λͺ… 클래슀λ₯Ό 톡해 ν•΄λ‹Ή λ©”μ„œλ“œλ₯Ό μž¬μ •μ˜ν•  수 μžˆλ‹€.

νŠΉμ§•

  • 읡λͺ… ν΄λž˜μŠ€λŠ” 이름이 μ—†λŠ” λ‚΄λΆ€ ν΄λž˜μŠ€λ‹€.
  • 클래슀 μ •μ˜μ™€ λ™μ‹œμ— μΈμŠ€ν„΄μŠ€ν™”λœλ‹€.
  • 주둜 μΈν„°νŽ˜μ΄μŠ€λ‚˜ 좔상 클래슀λ₯Ό κ΅¬ν˜„ν•  λ•Œ μ‚¬μš©ν•œλ‹€.
  • μΌμ‹œμ μœΌλ‘œ ν•œ 번만 μ‚¬μš©ν•˜κ³  버렀진닀. μž¬μ‚¬μš©λ˜μ§€ μ•ŠλŠ”λ‹€.
  • μž¬μ‚¬μš©μ„±μ΄ μ—†κ³  ν™•μž₯성을 ν™œμš©ν•˜λŠ” 것이 μœ μ§€λ³΄μˆ˜μ— 더 λΆˆλ¦¬ν•  λ•Œ μ‚¬μš©ν•œλ‹€.

 

μ™ΈλΆ€ ν΄λž˜μŠ€μ—μ„œ μ°Έμ‘° κ°€λŠ₯ν•œ λ³€μˆ˜λ“€

  • μ°Έμ‘° κ°€λŠ₯: μ™ΈλΆ€ 클래슀의 μΈμŠ€ν„΄μŠ€ λ³€μˆ˜, μ™ΈλΆ€ 클래슀의 static λ³€μˆ˜, μ™ΈλΆ€ λ©”μ„œλ“œμ˜ final λ˜λŠ” effectively final λ³€μˆ˜

 

μ‚¬μš© μ˜ˆμ‹œ

  • 이벀트 λ¦¬μŠ€λ„ˆ: λ²„νŠΌ 클릭, 마우슀 이벀트 λ“± 이벀트 기반 ν”„λ‘œκ·Έλž˜λ°μ—μ„œ κ°„λ‹¨ν•˜κ²Œ 이벀트 ν•Έλ“€λŸ¬λ₯Ό μ •μ˜ν•˜λŠ” 데 μœ μš©ν•˜λ‹€.
button.addActionListener(new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent e) {
        System.out.println("Button clicked!");
    }
});

 

클래슀 λ‘œλ“œμ™€ 생성 μ‹œ λ©”λͺ¨λ¦¬ λ™μž‘

 

정리

  • Static nested classλŠ” μ™ΈλΆ€ 클래슀의 μΈμŠ€ν„΄μŠ€ 없이도 μ‚¬μš©ν•  수 있기 λ•Œλ¬Έμ— λ©”λͺ¨λ¦¬ νš¨μœ¨μ„±μ„ 높이고, μ™ΈλΆ€ ν΄λž˜μŠ€μ™€μ˜ 결합을 μ€„μ΄λ©΄μ„œ 논리적 응집도λ₯Ό μœ μ§€ν•˜λŠ” 데 μœ λ¦¬ν•˜λ‹€.
  • Member inner classλŠ” μ™ΈλΆ€ 클래슀의 μΈμŠ€ν„΄μŠ€μ™€ λ°€μ ‘ν•œ 관계λ₯Ό κ°€μ§€λ©°, μ™ΈλΆ€ 클래슀의 μƒνƒœλ₯Ό μ‰½κ²Œ μ°Έμ‘°ν•˜κ±°λ‚˜ λ³€κ²½ν•  수 μžˆλŠ” ꡬ쑰이닀.
  • Local class와 Anonymous classλŠ” νŠΉμ • μ»¨ν…μŠ€νŠΈμ—μ„œλ§Œ μ‘΄μž¬ν•˜λŠ” μΌμ‹œμ μΈ 클래슀둜, μ½”λ“œμ˜ 가독성과 λͺ…λ£Œμ„±μ„ 높이기 μœ„ν•œ μš©λ„λ‘œ μ‚¬μš©λœλ‹€.