Item 24. Nested Class

멀버 ν΄λž˜μŠ€λŠ” λ˜λ„λ‘ static으둜 λ§Œλ“€λΌ.

μš°μ„  쀑첩 클래슀(nested class)에 λŒ€ν•΄ κ°„λ‹¨νžˆ 정리해 보자면 λ‹€λ₯Έ 클래슀 μ•ˆμ— μ •μ˜λœ 클래슀λ₯Ό λ§ν•œλ‹€. 쀑첩 클래슀의 μ’…λ₯˜λŠ” μ•„λž˜μ™€ κ°™μœΌλ©°, 정적 멀버 클래슀λ₯Ό μ œμ™Έν•œ λ‚˜λ¨Έμ§€λŠ” λ‚΄λΆ€ 클래슀(inner class)에 ν•΄λ‹Ήν•œλ‹€.

  1. 정적 멀버 클래슀

  2. (비정적)멀버 클래슀

  3. 읡λͺ… 클래슀

  4. μ§€μ—­ 클래슀

쀑첩 ν΄λž˜μŠ€λŠ” μžμ‹ μ„ 감싼 λ°”κΉ₯ ν΄λž˜μŠ€μ—μ„œλ§Œ μ“°μ—¬μ•Ό ν•˜λ©°, κ·Έ μ™Έμ˜ μ“°μž„μƒˆκ°€ μžˆλ‹€λ©΄ ν†±λ ˆλ²¨ 클래슀둜 λ§Œλ“€μ–΄μ•Ό ν•œλ‹€.

class OuterClass {

    public void createAnonymousClass() {
        // 읡λͺ… 클래슀
        Runnable runnable = new Runnable() {
            @Override
            public void run() {
                // ...
            }
        };
    }

    public void createLocalClass() {
        // μ§€μ—­ 클래슀
        class LocalClass {
            // ...
        }
    }

    // 정적 멀버 클래슀
    public static class StaticNestedClass {
        // ...
    }

    // (비정적)멀버 클래슀
    public class InnerClass {
        // ...
    }
}

1. 정적 멀버 클래슀

정적 멀버 ν΄λž˜μŠ€λŠ” 기본적으둜 일반 ν΄λž˜μŠ€μ™€ λ™μΌν•˜λ©°, μ•„λž˜μ™€ 같은 νŠΉμ§•μ΄ μžˆλ‹€.

  • λ°”κΉ₯ 클래슀의 private 멀버에도 μ ‘κ·Ό κ°€λŠ₯

  • λ‹€λ₯Έ 정적 멀버와 같은 μ ‘κ·Ό κ·œμΉ™μ„ μ μš©λ°›μŒ(private인 경우 λ°”κΉ₯ ν΄λž˜μŠ€μ—μ„œλ§Œ μ ‘κ·Ό κ°€λŠ₯)

정적 멀버 ν΄λž˜μŠ€λŠ” ν”νžˆ λ°”κΉ₯ ν΄λž˜μŠ€μ™€ ν•¨κ»˜ 쓰일 λ•Œλ§Œ μœ μš©ν•œ public λ„μš°λ―Έ 클래슀둜 쓰인닀. 예λ₯Ό λ“€λ©΄ Calculator 클래슀의 Operator μ—΄κ±° νƒ€μž…μ„ public 정적 멀버 클래슀둜 λ§Œλ“€μ–΄ Calculator.Operator둜 μ‚¬μš©ν•  수 μžˆλ‹€.

2. (비정적)멀버 클래슀

static 차이 ν•˜λ‚˜μ§€λ§Œ μ˜λ―Έν•˜λŠ” λ°”κ°€ μ „ν˜€ λ‹€λ₯΄κ³ , λ°”κΉ₯ ν΄λž˜μŠ€μ™€ 비정적 멀버 클래슀의 κ΄€κ³„λŠ” 멀버 ν΄λž˜μŠ€κ°€ μΈμŠ€ν„΄μŠ€ν™” 될 λ•Œ ν™•λ¦½λ˜κ³ , ν•΄λ‹Ή 관계λ₯Ό λ³€κ²½ν•  수 μ—†λ‹€. λ°”κΉ₯ 클래슀의 μΈμŠ€ν„΄μŠ€μ™€ μ•”λ¬΅μ μœΌλ‘œ μ—°κ²°λ˜κΈ° λ•Œλ¬Έμ— μ•„λž˜μ™€ 같은 차이가 μžˆλ‹€.

  • 비정적 멀버 클래슀의 μΈμŠ€ν„΄μŠ€ λ©”μ„œλ“œμ—μ„œ μ •κ·œν™”λœ this(OuterClass.this)λ₯Ό μ‚¬μš©ν•΄ λ°”κΉ₯ μΈμŠ€ν„΄μŠ€μ˜ λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•˜κ±°λ‚˜ λ°”κΉ₯ μΈμŠ€ν„΄μŠ€μ˜ μ°Έμ‘° κ°€λŠ₯

  • λ°”κΉ₯ μΈμŠ€ν„΄μŠ€μ™€ λ…λ¦½μ μœΌλ‘œ μ‘΄μž¬ν•  수 μ—†μœΌλ©°, λ°”κΉ₯ μΈμŠ€ν„΄μŠ€ 없이 생성할 수 μ—†μŒ

  • λ°”κΉ₯ μΈμŠ€ν„΄μŠ€λ₯Ό μ°Έμ‘°ν•˜λŠ” 관계 정보가 비정적 멀버 클래슀의 μΈμŠ€ν„΄μŠ€ μ•ˆμ— μ €μž₯λ˜μ–΄ λ©”λͺ¨λ¦¬ 곡간 μ°¨μ§€ 및 생성 μ‹œκ°„ μΆ”κ°€ μ†Œμš”

일반적으둜 λ°”κΉ₯ 클래슀의 μΈμŠ€ν„΄μŠ€ λ©”μ„œλ“œμ—μ„œ 비정적 멀버 클래슀의 μƒμ„±μžλ₯Ό ν˜ΈμΆœν•˜μ§€λ§Œ, new OuterClass().new InnerClass();와 같이 직접 생성할 μˆ˜λ„ μžˆλ‹€. 비정적 멀버 ν΄λž˜μŠ€λŠ” μ–΄λ–€ 클래슀의 μΈμŠ€ν„΄μŠ€λ₯Ό 감싸 마치 λ‹€λ₯Έ 클래슀의 μΈμŠ€ν„΄μŠ€μ²˜λŸΌ 보이게 ν•˜λŠ” 뷰둜 μ‚¬μš©ν•˜λŠ” μ–΄λŒ‘ν„°λ₯Ό μ •μ˜ν•  λ•Œ 자주 쓰인닀.

이처럼 비정적 멀버 ν΄λž˜μŠ€λŠ” λ°”κΉ₯ 클래슀의 μΈμŠ€ν„΄μŠ€μ™€ μ°Έμ‘°κ°€ λ˜λŠ” νŠΉμ§•μ΄ μžˆλ‹€. μ΄λŠ” μž₯점이 될 수 μžˆμ§€λ§Œ ν™œμš©ν•˜μ§€ μ•ŠλŠ”λ‹€λ©΄ λ©”λͺ¨λ¦¬ 곡간을 μ°¨μ§€ν•˜κ³  생성 μ‹œκ°„μ΄ μΆ”κ°€ μ†Œμš”λ˜λŠ” 단점이 될 수 있으며 κ°€λΉ„μ§€ μ»¬λ ‰μ…˜μ΄ λ°”κΉ₯ 클래슀의 μΈμŠ€ν„΄μŠ€λ₯Ό μˆ˜κ±°ν•˜μ§€ λͺ»ν•˜λŠ” λ©”λͺ¨λ¦¬ λˆ„μˆ˜κ°€ λ°œμƒν•  수 μžˆλ‹€. λ§Œμ•½ 비정적 멀버 클래슀둜 λ°”κΉ₯ 클래슀의 μΈμŠ€ν„΄μŠ€λ₯Ό μ°Έμ‘°ν•˜μ§€ μ•ŠλŠ”λ‹€λ©΄ 정적 멀버 클래슀둜 λ§ŒλŠλŠ” 것이 μ’‹λ‹€.

3. 읡λͺ… 클래슀

읡λͺ… ν΄λž˜μŠ€λŠ” 이름이 μ—†λŠ” 클래슀둜, 클래슀의 μ„ μ–Έκ³Ό μΈμŠ€ν„΄μŠ€ 생성을 λ™μ‹œμ— ν•˜μ—¬ κ°„νŽΈν•˜κ²Œ μ‚¬μš©ν•  수 μžˆμ§€λ§Œ μ•„λž˜μ™€ 같은 μ œμ•½μ΄ μžˆλ‹€.

  • 이름이 μ—†μ–΄ instanceof 같은 클래슀 이름이 ν•„μš”ν•œ μž‘μ—…μ€ μˆ˜ν–‰ν•  수 μ—†μŒ

  • 비정적인 λ¬Έλ§₯μ—μ„œλ§Œ λ°”κΉ₯ 클래슀의 μΈμŠ€ν„΄μŠ€λ₯Ό μ°Έμ‘°ν•  수 있으며, 정적 λ¬Έλ§₯μ—μ„œλŠ” μƒμˆ˜ λ³€μˆ˜ μ΄μ™Έμ˜ 정적 멀버λ₯Ό κ°€μ§ˆ 수 μ—†μŒ

  • μ—¬λŸ¬ μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•  수 μ—†μŒ

  • μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•˜λŠ” λ™μ‹œμ— λ‹€λ₯Έ 클래슀λ₯Ό 상속할 수 μ—†μŒ

  • λ³΅μž‘ν•œ μ½”λ“œλŠ” 가독성 μ €ν•˜

읡λͺ… ν΄λž˜μŠ€λŠ” 주둜 ν•¨μˆ˜ 객체λ₯Ό λ§Œλ“€ λ•Œ μ‚¬μš©ν–ˆμ§€λ§Œ, μžλ°” 8λΆ€ν„°λŠ” λžŒλ‹€λ₯Ό μ‚¬μš©ν•  수 있기 λ•Œλ¬Έμ— κ·Έ 역할은 λžŒλ‹€λ‘œ λŒ€μ²΄λ˜μ—ˆλ‹€. λ‹€λ₯Έ μš©λ„λ‘œλŠ” μ•„λž˜μ™€ 같이 정적 νŒ©ν„°λ¦¬ λ©”μ„œλ“œλ₯Ό κ΅¬ν˜„ν•  λ•Œ μ‚¬μš©ν•  수 μžˆλ‹€.

4. μ§€μ—­ 클래슀

κ°€μž₯ λ“œλ¬Όκ²Œ μ‚¬μš©λ˜λŠ” λ°©μ‹μœΌλ‘œ, μ§€μ—­ λ³€μˆ˜λ₯Ό μ„ μ–Έν•  수 μžˆλŠ” 곳이면 μ–΄λ””μ„œλ“  μ„ μ–Έν•  수 있으며 유효 λ²”μœ„λ„ μ§€μ—­ λ³€μˆ˜μ™€ κ°™λ‹€.

  • 멀버 클래슀처럼 이름이 있으며, λ°˜λ³΅ν•΄μ„œ μ‚¬μš© κ°€λŠ₯

  • 읡λͺ… 클래슀처럼 비정적 λ¬Έλ§₯μ—μ„œ μ‚¬μš©λ  λ•Œλ§Œ λ°”κΉ₯ μΈμŠ€ν„΄μŠ€ μ°Έμ‘° κ°€λŠ₯

  • 정적 λ©€λ²„λŠ” κ°€μ§ˆ 수 μ—†μŒ

κ²°λ‘ 

쀑첩 ν΄λž˜μŠ€λŠ” μœ„μ™€ 같이 λ„€ κ°€μ§€ 방식이 μ‘΄μž¬ν•˜λŠ”λ°, νŠΉμ§•μ΄ λͺ¨λ‘ λ‹€λ₯΄κΈ° λ•Œλ¬Έμ— 상황별 μ μ ˆν•œ 방법은 μ•„λž˜μ™€ 같이 정리할 수 μžˆλ‹€.

  • λ©”μ„œλ“œ λ°–μ—μ„œλ„ μ‚¬μš©ν•΄μ•Όν•˜κ±°λ‚˜ λ©”μ„œλ“œ μ•ˆμ—μ„œ μ •μ˜ν•˜κΈ°μ—” λ„ˆλ¬΄ κΈ΄ 경우 -> 멀버 클래슀둜 μ •μ˜

    • 멀버 클래슀의 μΈμŠ€ν„΄μŠ€ 각각이 λ°”κΉ₯ μΈμŠ€ν„΄μŠ€λ₯Ό μ°Έμ‘°ν•˜λŠ” 경우 -> 비정적 멀버 클래슀둜 μ •μ˜

    • κ·Έ μ™Έμ˜ 경우 -> 정적 멀버 클래슀둜 μ •μ˜

  • ν•œ λ©”μ„œλ“œ μ•ˆμ—μ„œλ§Œ μ‚¬μš©λ˜κ³ , ν•΄λ‹Ή μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν•˜λŠ” 지점이 단 ν•œ 곳이며, ν•΄λ‹Ή νƒ€μž…μœΌλ‘œ 쓰기에 μ ν•©ν•œ ν΄λž˜μŠ€λ‚˜ μΈν„°νŽ˜μ΄μŠ€κ°€ 이미 μžˆλŠ” 경우 -> 읡λͺ… 클래슀둜 μ •μ˜

  • μœ„μ— ν•΄λ‹Ήν•˜μ§€ μ•ŠλŠ” 경우 -> μ§€μ—­ 클래슀둜 μ •μ˜

Last updated

Was this helpful?