item 24 sungjaeyoon - JAVA-JIKIMI/EFFECTIVE-JAVA3 GitHub Wiki

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

쀑첩 클래슀

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


class A {
    int a = 10;

    public void run() {
        System.out.println("Run A");
        B.run();
        C c = new C();
        c.run();
    }

    // 정적 멀버 클래슀
    public static class B {
        public static void run() {
            System.out.println("Run B");
        }
    }

    // 비정적 멀버 클래슀
    public class C {
        public void run() {
            // μ •κ·œν™”λœ thisλ₯Ό 톡해 μ°Έμ‘° κ°€λŠ₯ν•˜λ‹€.
            // μ •κ·œν™”λœ thisλž€ 클래슀λͺ….this ν˜•νƒœλ‘œ 이름을 λͺ…μ‹œν•˜λŠ” μš©λ²•μ„ λ§ν•œλ‹€.
            System.out.println("Run C: " + A.this.a);
        }
    }
}

정적 멀버 클래슀

정적, 비정적 멀버 클래슀의 ꡬ문상 μ°¨μ΄λŠ” 단지 static이 λΆ™μ–΄ 있고 μ—†κ³  μ°¨μ΄μ΄μ§€λ§Œ μ˜λ―Έμƒ μ°¨μ΄λŠ” 크닀.

정적 멀버 ν΄λž˜μŠ€λž€ λ‹€λ₯Έ 클래슀 μ•ˆμ— μ„ μ–Έλ˜κ³  λ°”κΉ₯ 클래슀의 private 멀버에도 μ ‘κ·Όν•  수 μžˆλ‹€λŠ” 점만 μ œμ™Έν•˜κ³ λŠ” 일반 ν΄λž˜μŠ€μ™€ λ˜‘κ°™λ‹€.
정적 멀버 ν΄λž˜μŠ€λŠ” λ°”κΉ₯ ν΄λž˜μŠ€μ™€ ν•¨κ»˜ 쓰일 λ•Œλ§Œ μœ μš©ν•œ public λ„μš°λ―Έ 클래슀둜 쓰인닀.

(비정적) μΈμŠ€ν„΄μŠ€λŠ” λ°”κΉ₯ 클래슀의 μΈμŠ€ν„΄μŠ€μ™€ μ•”λ¬΅μ μœΌλ‘œ μ—°κ²°λ˜μ–΄ μ •κ·œν™”λœ thisλ₯Ό μ‚¬μš©ν•΄ λ°”κΉ₯은 μ°Έμ‘° κ°€λŠ₯ν•˜λ‹€.(μ •κ·œν™”λœ thisλž€ 클래슀λͺ….this ν˜•νƒœλ‘œ λ°”κΉ₯ 클래슀의 이름을 λͺ…μ‹œν•˜λŠ” μš©λ²•)
κ°œλ…μƒ 쀑첩 클래슀의 μΈμŠ€ν„΄μŠ€κ°€ λ°”κΉ₯ μΈμŠ€ν„΄μŠ€μ™€ λ…λ¦½μ μœΌλ‘œ μ‘΄μž¬ν•  수 μžˆλ‹€λ©΄ 정적 멀버 클래슀둜 λ§Œλ“€μ–΄μ•Ό ν•œλ‹€.

비정적 멀버 클래슀

λ°”κΉ₯ μΈμŠ€ν„΄μŠ€ μ‚¬μ΄μ˜ κ΄€κ³„λŠ” λ©€λ²„ν΄λž˜μŠ€κ°€ μΈμŠ€ν„΄μŠ€ν™”λ  λ•Œ ν™•λ¦½λ˜λ©°, 더 이상 λ³€κ²½ν•  수 μ—†λ‹€.

보톡 λ°”κΉ₯ 클래슀의 μΈμŠ€ν„΄μŠ€ λ©”μ„œλ“œμ—μ„œ 비정적 멀버 클래슀의 μƒμ„±μžλ₯Ό 호좜 ν•  λ•Œ μžλ™μœΌλ‘œ λ§Œλ“€μ–΄μ§„λ‹€.
멀버 클래슀의 μΈμŠ€ν„΄μŠ€ μ•ˆμ— λ§Œλ“€μ–΄μ Έ λ©”λͺ¨λ¦¬ 곡간을 μ°¨μ§€ν•˜λ©°, 생성 μ‹œκ°„λ„ 였래 κ±Έλ¦¬μ§€λ§Œ μ–΄νƒ­ν„°λ₯Ό μ •μ˜ν•  λ•Œ 자주 쓰인닀.

즉, μ–΄λ–€ 클래슀의 μΈμŠ€ν„΄μŠ€λ₯Ό 감싸 마치 λ‹€λ₯Έ 클래슀의 μΈμŠ€ν„΄μŠ€μ²˜λŸΌ 보이게 ν•˜λŠ” 뷰둜 μ‚¬μš©ν•˜λŠ” 것 Map μΈν„°νŽ˜μ΄μŠ€μ˜ κ΅¬ν˜„μ²΄λ“€μ€ 보톡(keySet, entrySet, values λ©”μ„œλ“œκ°€ λ°˜ν™˜ν•˜λŠ”) μžμ‹ μ˜ μ»¬λ ‰μ…˜ λ·°λ₯Ό κ΅¬ν˜„ν•  λ•Œ 비정적 멀버 클래슀λ₯Ό μ‚¬μš©ν•¨ Setκ³Ό List 같은 μ»¬λ ‰μ…˜ μΈν„°νŽ˜μ΄μŠ€ κ΅¬ν˜„λ“€λ„ μžμ‹ μ˜ 반볡자λ₯Ό κ΅¬ν˜„ν•  λ•Œ 비정적 멀버 클래슀λ₯Ό 주둜 μ‚¬μš©ν•¨

public class MySet<E> extends AbstractSet<E> {
    ... // μƒλž΅ 
    @Override public Iterator<E> iterator() { 
        return new MyIterator(); 
    } 
    private class MyIterator implements Iterator<E> {
         ... 
    } 
}

읡λͺ… 클래슀

멀버와 달리 μ“°μ΄λŠ” μ‹œμ μ— μΈμŠ€ν„΄μŠ€κ°€ λ§Œλ“€μ–΄μ§„λ‹€. (μ½”λ“œμ˜ μ–΄λ””μ„œλ“  λ§Œλ“€ 수 있음)

정적 λ¬Έλ§₯μ—μ„œλΌλ„ μƒμˆ˜ λ³€μˆ˜ μ΄μ™Έμ˜ μ •μ λ©€λ²„λŠ” κ°€μ§ˆ 수 μ—†λ‹€. μƒμˆ˜ ν‘œν˜„μ„ μœ„ν•΄ μ΄ˆκΈ°ν™”λœ final κΈ°λ³Έ νƒ€μž…κ³Ό λ¬Έμžμ—΄ ν•„λ“œλ§Œ κ°€μ§ˆ 수 μžˆλ‹€.

μ„ μ–Έν•œ μ§€μ μ—μ„œλ§Œ μΈμŠ€ν„΄μŠ€λ₯Ό λ§Œλ“€ 수 μžˆλ‹€. instanceof κ²€μ‚¬λ‚˜ 클래슀의 이름이 ν•„μš”ν•œ μž‘μ—…μ€ μˆ˜ν–‰ν•  수 μ—†λ‹€. μ—¬λŸ¬ μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•  수 μ—†κ³ , μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•˜λŠ” λ™μ‹œμ— λ‹€λ₯Έ 클래슀λ₯Ό 상속할 μˆ˜λ„ μ—†λ‹€. 읡λͺ… 클래슀λ₯Ό μ‚¬μš©ν•˜λŠ” ν΄λΌμ΄μ–ΈνŠΈλŠ” 읡λͺ… ν΄λž˜μŠ€κ°€ μƒμœ„ νƒ€μž…μ—μ„œ μƒμ†ν•œ 멀버 μ™Έμ—λŠ” ν˜ΈμΆœν•  수 μ—†λ‹€. 읡λͺ… ν΄λž˜μŠ€λŠ” ν‘œν˜„μ‹ 쀑간에 λ“±μž₯ν•˜λ―€λ‘œ (10쀄 μ΄ν•˜λ‘œ) μ§§μ§€ μ•ŠμœΌλ©΄ 가독성이 λ–¨μ–΄μ§„λ‹€.

Test t1 = new Test(){ 
    public int num = 10; 
    @Override public int getNum(){ 
        return this.num; 
    } 
};

μ§€μ—­ 클래슀

μ’…λ₯˜ 쀑 κ°€μž₯ λ“œλ¬Όκ²Œ μ‚¬μš©λœλ‹€.

μ§€μ—­λ³€μˆ˜λ₯Ό μ„ μ–Έν•  수 μžˆλŠ” 곳이면 μ‹€μ§ˆμ μœΌλ‘œ μ–΄λ””μ„œλ“  μ„ μ–Έν•  수 있고, 유효 λ²”μœ„λ„ μ§€μ—­λ³€μˆ˜μ™€ κ°™λ‹€.

λ‹€λ₯Έ μ„Έ 쀑첩 ν΄λž˜μŠ€μ™€μ˜ 곡톡점도 ν•˜λ‚˜μ”© κ°€μ§€κ³  μžˆλ‹€.

멀버 클래슀처럼 이름이 있고 λ°˜λ³΅ν•΄μ„œ μ‚¬μš©ν•  수 μžˆλ‹€. 읡λͺ… 클래슀처럼 비정적 λ¬Έλ§₯μ—μ„œ μ‚¬μš©λ  λ•Œλ§Œ λ°”κΉ₯ μΈμŠ€ν„΄μŠ€λ₯Ό μ°Έμ‘°ν•  수 μžˆλ‹€. 정적 λ©€λ²„λŠ” κ°€μ§ˆμˆ˜ μ—†μœΌλ©°, 가독성을 μœ„ν•΄ 짧게 μž‘μ„±ν•΄μ•Ό ν•œλ‹€.

class Outer
{
   //...
   void f( )
   {
      //...
      class Local
      {
         //...
      }
   } //f()
}