λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°

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

[Java] Anonymouse class의 λ©”λͺ¨λ¦¬ λ‘œλ“œ 및 생성

좜처

ChatGPT


읡λͺ… λ‚΄λΆ€ 클래슀(Anonymous Inner Class)λŠ” μžλ°”μ—μ„œ 클래슀λ₯Ό μ •μ˜ν•˜μ§€ μ•Šκ³ λ„ 클래슀λ₯Ό μƒμ„±ν•˜κ³  μΈμŠ€ν„΄μŠ€λ₯Ό 생성할 수 있게 ν•΄μ£ΌλŠ” κΈ°λŠ₯이닀. 읡λͺ… λ‚΄λΆ€ ν΄λž˜μŠ€λŠ” 보톡 이벀트 ν•Έλ“€λŸ¬λ‚˜ 콜백 κ΅¬ν˜„μ²΄λ₯Ό μž‘μ„±ν•  λ•Œ μœ μš©ν•˜κ²Œ μ‚¬μš©λœλ‹€. μ΄λŸ¬ν•œ ν΄λž˜μŠ€λŠ” μ½”λ“œκ°€ κ°„κ²°ν•˜κ³ , ν•œ 번만 μ‚¬μš©λ˜λŠ” κ²½μš°μ— μ ν•©ν•˜λ‹€.

읡λͺ… λ‚΄λΆ€ 클래슀의 λ©”λͺ¨λ¦¬μ—μ„œμ˜ 생성 및 λ‘œλ“œ 과정은 λ‹€μŒκ³Ό κ°™λ‹€.

읡λͺ… λ‚΄λΆ€ 클래슀 생성 κ³Όμ •

1. 클래슀 λ‘œλ”©

읡λͺ… λ‚΄λΆ€ ν΄λž˜μŠ€λŠ” 클래슀 λ‘œλ”μ— μ˜ν•΄ λ‘œλ“œλœλ‹€. 이 κ³Όμ •μ—μ„œ μžλ°” μ»΄νŒŒμΌλŸ¬λŠ” 읡λͺ… λ‚΄λΆ€ 클래슀의 이름을 μžλ™μœΌλ‘œ μƒμ„±ν•œλ‹€. 이 이름은 일반적으둜 μ™ΈλΆ€ 클래슀의 이름과 읡λͺ… λ‚΄λΆ€ 클래슀의 μΈμŠ€ν„΄μŠ€ 번호λ₯Ό ν¬ν•¨ν•œλ‹€. 예λ₯Ό λ“€μ–΄, OuterClass$1κ³Ό 같은 이름을 κ°€μ§ˆ 수 μžˆλ‹€.

2. 클래슀 μ •μ˜

읡λͺ… λ‚΄λΆ€ ν΄λž˜μŠ€λŠ” μ™ΈλΆ€ 클래슀의 μΈμŠ€ν„΄μŠ€ 생성 μ‹œ λ‚΄λΆ€ 클래슀 μ •μ˜λ‘œ μƒμ„±λœλ‹€. 읡λͺ… λ‚΄λΆ€ 클래슀의 μ •μ˜λŠ” μ™ΈλΆ€ 클래슀의 μƒμ„±μž λ˜λŠ” λ©”μ†Œλ“œ λ‚΄μ—μ„œ μž‘μ„±λœλ‹€. μ»΄νŒŒμΌλŸ¬λŠ” 이λ₯Ό λ°”νƒ•μœΌλ‘œ 읡λͺ… 클래슀λ₯Ό μ •μ˜ν•˜κ³ , μƒˆλ‘œμš΄ .class νŒŒμΌμ„ μƒμ„±ν•œλ‹€.

3. μΈμŠ€ν„΄μŠ€ 생성

읡λͺ… λ‚΄λΆ€ 클래슀의 μΈμŠ€ν„΄μŠ€λŠ” μ™ΈλΆ€ 클래슀의 μΈμŠ€ν„΄μŠ€μ™€ ν•¨κ»˜ μƒμ„±λœλ‹€. 읡λͺ… λ‚΄λΆ€ ν΄λž˜μŠ€λŠ” μ™ΈλΆ€ 클래슀의 μΈμŠ€ν„΄μŠ€μ— λŒ€ν•œ μ°Έμ‘°λ₯Ό μ•”λ¬΅μ μœΌλ‘œ 가지고 있으며, μƒμ„±λœ μΈμŠ€ν„΄μŠ€λŠ” μ™ΈλΆ€ 클래슀의 μΈμŠ€ν„΄μŠ€μ™€ 관련이 μžˆλ‹€.

λ©”λͺ¨λ¦¬μ—μ„œμ˜ μž‘λ™

1. 클래슀 파일 생성 (클래슀 레벨)

읡λͺ… λ‚΄λΆ€ ν΄λž˜μŠ€λŠ” 컴파일 ν›„ μƒˆλ‘œμš΄ .class 파일둜 μƒμ„±λœλ‹€. 이 클래슀 νŒŒμΌμ€ 읡λͺ… λ‚΄λΆ€ 클래슀의 μ½”λ“œμ™€ λ°”μ΄νŠΈμ½”λ“œλ₯Ό ν¬ν•¨ν•œλ‹€. 이 클래슀 νŒŒμΌμ€ JVM의 λ©”λͺ¨λ¦¬ μ˜μ—­(클래슀 μ˜μ—­)에 λ‘œλ“œλœλ‹€.

2. 클래슀 μ˜μ—­μ— λ‘œλ“œ (클래슀 레벨)

JVM은 클래슀 λ‘œλ”λ₯Ό μ‚¬μš©ν•˜μ—¬ 읡λͺ… λ‚΄λΆ€ 클래슀λ₯Ό λ©”λͺ¨λ¦¬μ— λ‘œλ“œν•œλ‹€. 읡λͺ… λ‚΄λΆ€ ν΄λž˜μŠ€λŠ” Class 객체둜 λ©”λͺ¨λ¦¬μ— μ €μž₯되며, 이 Class κ°μ²΄λŠ” JVM의 λ©”μ†Œλ“œ μ˜μ—­μ— μœ„μΉ˜ν•œλ‹€.

3. μΈμŠ€ν„΄μŠ€ 생성 및 μ €μž₯ (μΈμŠ€ν„΄μŠ€ 레벨)

읡λͺ… λ‚΄λΆ€ 클래슀의 μΈμŠ€ν„΄μŠ€λŠ” νž™ λ©”λͺ¨λ¦¬μ— μ €μž₯λœλ‹€. 이 μΈμŠ€ν„΄μŠ€λŠ” μ™ΈλΆ€ 클래슀의 μΈμŠ€ν„΄μŠ€μ™€ ν•¨κ»˜ μƒμ„±λ˜λ©°, 읡λͺ… λ‚΄λΆ€ 클래슀의 λͺ¨λ“  μΈμŠ€ν„΄μŠ€ λ³€μˆ˜μ™€ λ©”μ†Œλ“œλŠ” 객체의 μƒνƒœλ₯Ό μœ μ§€ν•œλ‹€.

4. ν΄λ‘œμ €(Closure) 및 캑처 (μΈμŠ€ν„΄μŠ€ 레벨)

읡λͺ… λ‚΄λΆ€ ν΄λž˜μŠ€λŠ” μ™ΈλΆ€ 클래슀의 μΈμŠ€ν„΄μŠ€ λ³€μˆ˜μ™€ λ©”μ†Œλ“œλ₯Ό μΊ‘μ²˜ν•  수 μžˆλ‹€. μ΄λŸ¬ν•œ 캑처된 λ³€μˆ˜λ“€μ€ 읡λͺ… λ‚΄λΆ€ 클래슀의 μΈμŠ€ν„΄μŠ€κ°€ 생성될 λ•Œ ν•¨κ»˜ μ €μž₯λœλ‹€. 이둜 인해 λ©”λͺ¨λ¦¬μ—μ„œ 좔가적인 μ°Έμ‘°κ°€ λ°œμƒν•  수 μžˆλ‹€.

5. λ©”μ†Œλ“œ 호좜 (μΈμŠ€ν„΄μŠ€ 레벨)

읡λͺ… λ‚΄λΆ€ 클래슀의 λ©”μ†Œλ“œλŠ” 일반적인 ν΄λž˜μŠ€μ™€ 같이 호좜될 수 있으며, λ©”μ†Œλ“œ μ˜μ—­μ— μ €μž₯된 λ°”μ΄νŠΈμ½”λ“œκ°€ μ‹€ν–‰λœλ‹€. μ΄λŸ¬ν•œ λ©”μ†Œλ“œλŠ” 읡λͺ… λ‚΄λΆ€ 클래슀의 μΈμŠ€ν„΄μŠ€μ— λ°”μΈλ”©λ˜μ–΄ μ‹€ν–‰λœλ‹€.

 

μ˜ˆμ‹œ μ½”λ“œμ™€ λ©”λͺ¨λ¦¬ κ³Όμ •

public class OuterClass {
    private String outerField = "Outer";

    public void createAnonymousClass() {
        // 읡λͺ… λ‚΄λΆ€ 클래슀
        Runnable r = new Runnable() {
            @Override
            public void run() {
                System.out.println(outerField);
            }
        };
        new Thread(r).start();
    }
}
 

1. 클래슀 λ‘œλ”©

μ»΄νŒŒμΌλŸ¬λŠ” OuterClass$1μ΄λΌλŠ” μ΄λ¦„μ˜ 읡λͺ… λ‚΄λΆ€ 클래슀λ₯Ό μƒμ„±ν•œλ‹€. 이 ν΄λž˜μŠ€λŠ” Runnable μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•œλ‹€.

2. 클래슀 μ •μ˜ 및 λ‘œλ“œ

OuterClass$1.class 파일이 μƒμ„±λ˜κ³ , JVM에 μ˜ν•΄ λ©”μ†Œλ“œ μ˜μ—­μ— λ‘œλ“œλœλ‹€.

3. μΈμŠ€ν„΄μŠ€ 생성

createAnonymousClass λ©”μ†Œλ“œκ°€ 호좜될 λ•Œ 읡λͺ… λ‚΄λΆ€ 클래슀의 μΈμŠ€ν„΄μŠ€κ°€ νž™ λ©”λͺ¨λ¦¬μ— μƒμ„±λœλ‹€. 이 μΈμŠ€ν„΄μŠ€λŠ” Runnable μΈν„°νŽ˜μ΄μŠ€μ˜ run λ©”μ†Œλ“œλ₯Ό κ΅¬ν˜„ν•œλ‹€.

4. 캑처 및 참쑰

읡λͺ… λ‚΄λΆ€ ν΄λž˜μŠ€λŠ” OuterClass의 outerFieldλ₯Ό μΊ‘μ²˜ν•˜μ—¬ μ‚¬μš©ν•œλ‹€. 이 λ³€μˆ˜μ— λŒ€ν•œ μ°Έμ‘°λŠ” 읡λͺ… λ‚΄λΆ€ 클래슀의 μΈμŠ€ν„΄μŠ€μ™€ ν•¨κ»˜ μ €μž₯λœλ‹€.

5. λ©”μ†Œλ“œ 호좜

new Thread(r).start()λ₯Ό 톡해 읡λͺ… λ‚΄λΆ€ 클래슀의 run λ©”μ†Œλ“œκ°€ ν˜ΈμΆœλœλ‹€. 이 λ©”μ†Œλ“œλŠ” JVM의 λ©”μ†Œλ“œ μ˜μ—­μ—μ„œ μ‹€ν–‰λœλ‹€.

 

κ²°λ‘ 

읡λͺ… λ‚΄λΆ€ ν΄λž˜μŠ€λŠ” λ©”λͺ¨λ¦¬μ—μ„œ λ‹€μŒκ³Ό 같은 과정을 κ±°μΉœλ‹€: μ»΄νŒŒμΌλŸ¬κ°€ 클래슀λ₯Ό μƒμ„±ν•˜κ³ , 클래슀 λ‘œλ”κ°€ 이λ₯Ό λ©”μ†Œλ“œ μ˜μ—­μ— λ‘œλ“œν•˜λ©°, νž™ λ©”λͺ¨λ¦¬μ— μΈμŠ€ν„΄μŠ€κ°€ μƒμ„±λ˜κ³ , μ™ΈλΆ€ 클래슀의 μ°Έμ‘°λ₯Ό μΊ‘μ²˜ν•˜μ—¬ κ΄€λ¦¬λœλ‹€. μ΄λŸ¬ν•œ 과정을 톡해 읡λͺ… λ‚΄λΆ€ ν΄λž˜μŠ€λŠ” μ½”λ“œμ˜ κ°„κ²°μ„±κ³Ό μœ μ—°μ„±μ„ μ œκ³΅ν•˜λ©°, μΌνšŒμ„± λ˜λŠ” κ°„λ‹¨ν•œ 콜백 κ΅¬ν˜„μ— 적합닀.

 


ChatGPT κΈ€μ˜ 좜처

읡λͺ… λ‚΄λΆ€ 클래슀의 λ™μž‘κ³Ό λ©”λͺ¨λ¦¬ 관리에 κ΄€ν•œ λ‚΄μš©μ€ μžλ°”μ˜ 곡식 λ¬Έμ„œμ™€ κ΄€λ ¨λœ μžλ£Œλ“€μ—μ„œ 확인할 수 μžˆμŠ΅λ‹ˆλ‹€. λ‹€μŒμ€ ν•΄λ‹Ή λ‚΄μš©μ„ μ„€λͺ…ν•˜λŠ” 데 도움이 λ˜λŠ” μ£Όμš” μΆœμ²˜μž…λ‹ˆλ‹€:

  1. Oracle Java Documentation:
    • Java Language Specification (JLS) : μžλ°” μ–Έμ–΄ μ‚¬μ–‘μ—μ„œλŠ” 읡λͺ… λ‚΄λΆ€ ν΄λž˜μŠ€μ— λŒ€ν•œ μ •μ˜μ™€ λ™μž‘μ„ μƒμ„Ένžˆ μ„€λͺ…ν•©λ‹ˆλ‹€. 읡λͺ… λ‚΄λΆ€ 클래슀의 생성과 클래슀 λ‘œλ”©, λ©”λͺ¨λ¦¬μ—μ„œμ˜ 관리 등에 λŒ€ν•΄ μžμ„Ένžˆ λ‹€λ£Ήλ‹ˆλ‹€.
  2. Effective Java (by Joshua Bloch):
    • 이 책은 μžλ°” ν”„λ‘œκ·Έλž˜λ°μ—μ„œ ꢌμž₯λ˜λŠ” λ‹€μ–‘ν•œ 기법을 닀루며, 읡λͺ… λ‚΄λΆ€ ν΄λž˜μŠ€μ™€ κ΄€λ ¨λœ λ‚΄μš©λ„ ν¬ν•¨λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€. 읡λͺ… λ‚΄λΆ€ 클래슀의 μ‚¬μš© 사둀와 μ„±λŠ₯ 고렀사항 등을 μ„€λͺ…ν•©λ‹ˆλ‹€.
  3. Oracle Java Tutorials:
    • Anonymous Classes : 읡λͺ… λ‚΄λΆ€ 클래슀의 μ‚¬μš©λ²•κ³Ό λ™μž‘μ— λŒ€ν•œ 곡식 μžλ°” νŠœν† λ¦¬μ–Όμ„ μ œκ³΅ν•©λ‹ˆλ‹€.
  4. Java Concurrency in Practice (by Brian Goetz):
    • 이 책은 μžλ°”μ—μ„œμ˜ λ™μ‹œμ„± λ¬Έμ œμ™€ κ΄€λ ¨λœ λ‹€μ–‘ν•œ 주제λ₯Ό 닀루며, 읡λͺ… λ‚΄λΆ€ ν΄λž˜μŠ€κ°€ λ©€ν‹°μŠ€λ ˆλ”©μ—μ„œ μ–΄λ–»κ²Œ μ‚¬μš©λ  수 μžˆλŠ”μ§€λ₯Ό μ„€λͺ…ν•©λ‹ˆλ‹€.

이 μžλ£Œλ“€μ€ 읡λͺ… λ‚΄λΆ€ 클래슀의 λ©”λͺ¨λ¦¬μ—μ„œμ˜ λ™μž‘κ³Ό κ΄€λ ¨λœ μ„ΈλΆ€ 사항을 μ΄ν•΄ν•˜λŠ” 데 μœ μš©ν•œ 정보λ₯Ό μ œκ³΅ν•©λ‹ˆλ‹€. 특히 JLS와 Oracle Java TutorialsλŠ” μžλ°” μ–Έμ–΄μ˜ 곡식 λ¬Έμ„œλ‘œμ„œ κ°€μž₯ μ‹ λ’°ν•  수 μžˆλŠ” μΆœμ²˜μž…λ‹ˆλ‹€.