Skip to content

Latest commit

Β 

History

History
480 lines (358 loc) Β· 23.2 KB

File metadata and controls

480 lines (358 loc) Β· 23.2 KB

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

1. 쀑첩 클래슀

{% hint style="success" %} 각각의 쀑첩 클래슀λ₯Ό μ–Έμ œ 그리고 μ™œ μ‚¬μš©ν•΄μ•Ό ν•˜λŠ”μ§€λ₯Ό μ•Œμ•„μ•Ό 함 {% endhint %}

1) 쀑첩 ν΄λž˜μŠ€λž€?(nested class)

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

2) 쀑첩 클래슀의 μ’…λ₯˜

  1. 정적 멀버 클래슀 : μ™ΈλΆ€ 클래슀
  2. (비정적) 멀버 클래슀 : λ‚΄λΆ€ 클래슀(inner class)
  3. 읡λͺ… 클래슀 : λ‚΄λΆ€ 클래슀(inner class)
  4. μ§€μ—­ 클래슀 : λ‚΄λΆ€ 클래슀(inner class)

2. 정적 멀버 클래슀

1) 정적 멀버 클래슀

  • 정적 멀버 ν΄λž˜μŠ€λŠ” μ™ΈλΆ€ ν΄λž˜μŠ€μ™€ λ…λ¦½μ μœΌλ‘œ μ‘΄μž¬ν•  수 μžˆλ‹€. 즉, μ™ΈλΆ€ 클래슀의 μΈμŠ€ν„΄μŠ€ 없이도 정적 멀버 클래슀의 객체λ₯Ό λ§Œλ“€ 수 μžˆλ‹€.
  • 정적 멀버 ν΄λž˜μŠ€λŠ” λ°”κΉ₯ 클래슀의 μΈμŠ€ν„΄μŠ€μ— μ ‘κ·Όν•˜μ§€ λͺ»ν•œλ‹€. μ΄λŠ” μ™ΈλΆ€ 클래슀의 μƒνƒœμ™€ 상관없이 λ…λ¦½μ μœΌλ‘œ λ™μž‘ν•  수 μžˆλŠ” ν΄λž˜μŠ€λΌλŠ” 것을 μ˜λ―Έν•œλ‹€.
  • 정적 멀버 ν΄λž˜μŠ€λŠ” λ‹€λ₯Έ 정적 멀버와 λ™μΌν•œ κ·œμΉ™μ„ μ μš©λ°›λŠ”λ‹€. 예λ₯Ό λ“€μ–΄ private둜 μ„ μ–Έλ˜λ©΄ μ™ΈλΆ€ ν΄λž˜μŠ€μ—μ„œλ§Œ μ ‘κ·Όν•  수 있고, public으둜 μ„ μ–Έλ˜λ©΄ μ–΄λ””μ„œλ“  μ ‘κ·Ό κ°€λŠ₯νžˆλ‹€.
  • 주둜 μ™ΈλΆ€ ν΄λž˜μŠ€μ™€ λ°€μ ‘ν•œ 관련이 μžˆμ§€λ§Œ, μ™ΈλΆ€ 클래슀의 μΈμŠ€ν„΄μŠ€μ™€ 상관없이 λ™μž‘ν•˜λŠ” λ„μš°λ―Έ 클래슀(helper class)둜 μ‚¬μš©λœλ‹€.
public class Calculator {

    // 정적 멀버 클래슀
    public static class Operation {
        public static final Operation PLUS = new Operation("+");
        public static final Operation MINUS = new Operation("-");

        private String symbol;

        private Operation(String symbol) {
            this.symbol = symbol;
        }

        public String getSymbol() {
            return symbol;
        }
    }

    public static void main(String[] args) {
        System.out.println(Operation.PLUS.getSymbol()); // +
        System.out.println(Operation.MINUS.getSymbol()); // -
    }
}
  • μœ„ μ˜ˆμ‹œμ—μ„œ Operation은 Calculator 클래슀의 정적 멀버 ν΄λž˜μŠ€μ΄λ‹€. Calculator의 μΈμŠ€ν„΄μŠ€ 없이도 Operation 클래슀의 멀버λ₯Ό μ‚¬μš©ν•  수 μžˆλ‹€. 이λ₯Ό 톡해 Calculator.Operation.PLUS ν˜•νƒœλ‘œ 연산을 μ •μ˜ν•˜κ³  μ‚¬μš©ν•  수 있게 λœλ‹€.
public class OuterClass {
    private static String secret = "OuterClass Secret";

    // 정적 멀버 클래슀
    public static class StaticInnerClass {
        public void revealSecret() {
            // λ°”κΉ₯ 클래슀의 private 멀버에 μ ‘κ·Ό κ°€λŠ₯
            System.out.println("Secret: " + secret);
        }
    }
}

public class Main {
    public static void main(String[] args) {
        OuterClass.StaticInnerClass inner = new OuterClass.StaticInnerClass();
        inner.revealSecret(); // "Secret: OuterClass Secret"
    }
}

정적 멀버 ν΄λž˜μŠ€λŠ” λ°”κΉ₯ ν΄λž˜μŠ€μ™€ λ…λ¦½μ μœΌλ‘œ λ™μž‘ν•  수 있으며, μ™ΈλΆ€ 클래슀의 μΈμŠ€ν„΄μŠ€μ™€λŠ” 상관없이 μΈμŠ€ν„΄μŠ€ν™”κ°€ κ°€λŠ₯ν•˜λ‹€. λ°”κΉ₯ 클래슀의 private 멀버에 μ ‘κ·Όν•  수 μžˆλŠ” νŠΉμ§•μ„ μ œμ™Έν•˜κ³ λŠ” 일반 ν΄λž˜μŠ€μ™€ λ‹€λ₯΄μ§€ μ•ŠμœΌλ©°, 정적 멀버 ν΄λž˜μŠ€λŠ” 보톡 λ°”κΉ₯ ν΄λž˜μŠ€μ™€ ν•¨κ»˜ μ‚¬μš©λœλ‹€.

2) 정적 멀버 ν΄λž˜μŠ€μ™€ 일반 클래슀

정적 멀버 ν΄λž˜μŠ€λŠ” λ‹€λ₯Έ 클래슀 μ•ˆμ— μ„ μ–Έλ˜κ³ , λ°”κΉ₯ 클래슀의 private 멀버에도 μ ‘κ·Όν•  수 μžˆλ‹€λŠ” 점만 μ œμ™Έν•˜κ³ λŠ” 일반 ν΄λž˜μŠ€μ™€ λ˜‘κ°™λ‹€.

1. 일반 ν΄λž˜μŠ€μ™€ μœ μ‚¬ν•œ νŠΉμ§•

정적 멀버 ν΄λž˜μŠ€λŠ” 클래슀 내뢀에 μ„ μ–Έλ˜μ§€λ§Œ, κ·Έ μ™Έμ—λŠ” 일반 ν΄λž˜μŠ€μ™€ λ™μΌν•œ λ°©μ‹μœΌλ‘œ λ™μž‘ν•œλ‹€.

  • μƒμ„±μžλ₯Ό μ •μ˜ν•  수 μžˆλ‹€.
  • λ©”μ„œλ“œμ™€ ν•„λ“œλ₯Ό κ°€μ§ˆ 수 μžˆλ‹€.
  • 상속을 ν•  수 있고, μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•  수 μžˆλ‹€.
  • λ…λ¦½μ μœΌλ‘œ μΈμŠ€ν„΄μŠ€λ₯Ό 생성할 수 μžˆλ‹€.

예λ₯Ό λ“€μ–΄, 정적 멀버 ν΄λž˜μŠ€λ„ 일반 클래슀처럼 μΈμŠ€ν„΄μŠ€λ₯Ό λ§Œλ“€ 수 μžˆλ‹€.

public class OuterClass {
    // 정적 멀버 클래슀
    public static class StaticInnerClass {
        public void display() {
            System.out.println("Static Inner Class");
        }
    }
}

public class Main {
    public static void main(String[] args) {
        // 정적 멀버 ν΄λž˜μŠ€λŠ” μ™ΈλΆ€ 클래슀의 μΈμŠ€ν„΄μŠ€ 없이도 μΈμŠ€ν„΄μŠ€λ₯Ό 생성할 수 μžˆλ‹€.
        OuterClass.StaticInnerClass inner = new OuterClass.StaticInnerClass();
        inner.display(); // "Static Inner Class"
    }
}

μœ„ μ½”λ“œμ—μ„œ StaticInnerClassλŠ” μ™ΈλΆ€ 클래슀 OuterClass와 λ³„κ°œλ‘œ λ™μž‘ν•˜λ©°, μ™ΈλΆ€ 클래슀의 μΈμŠ€ν„΄μŠ€ 없이도 μΈμŠ€ν„΄μŠ€λ₯Ό 생성할 수 μžˆλ‹€. μ΄λŠ” 일반적인 독립 클래슀처럼 μ‚¬μš©λœλ‹€λŠ” μ μ—μ„œ 일반 ν΄λž˜μŠ€μ™€ λΉ„μŠ·ν•˜λ‹€.

2. λ°”κΉ₯ 클래슀의 private 멀버 μ ‘κ·Ό κ°€λŠ₯

일반적인 독립 ν΄λž˜μŠ€λŠ” λ‹€λ₯Έ 클래슀의 private 멀버에 μ ‘κ·Όν•  수 μ—†λ‹€. κ·ΈλŸ¬λ‚˜ 정적 멀버 ν΄λž˜μŠ€λŠ” μ™ΈλΆ€ 클래슀 μ•ˆμ— μ„ μ–Έλ˜μ–΄ 있기 λ•Œλ¬Έμ— μ™ΈλΆ€ 클래슀의 private 멀버에도 μ ‘κ·Όν•  수 μžˆλ‹€.

예λ₯Ό λ“€μ–΄:

public class OuterClass {
    private static String secret = "OuterClass Secret";

    // 정적 멀버 클래슀
    public static class StaticInnerClass {
        public void revealSecret() {
            // λ°”κΉ₯ 클래슀의 private 멀버에 μ ‘κ·Ό κ°€λŠ₯
            System.out.println("Secret: " + secret);
        }
    }
}

public class Main {
    public static void main(String[] args) {
        OuterClass.StaticInnerClass inner = new OuterClass.StaticInnerClass();
        inner.revealSecret(); // "Secret: OuterClass Secret"
    }
}

μœ„ μ½”λ“œμ—μ„œ StaticInnerClassλŠ” μ™ΈλΆ€ 클래슀 OuterClass의 private ν•„λ“œμΈ secret에 μ ‘κ·Όν•  수 μžˆλ‹€. μ΄λŠ” μ™ΈλΆ€ 클래슀 내뢀에 μ„ μ–Έλœ 정적 멀버 클래슀이기 λ•Œλ¬Έμ— κ°€λŠ₯ν•œ λ™μž‘μ΄λ‹€.

일반적으둜 독립적인 ν΄λž˜μŠ€λŠ” λ‹€λ₯Έ 클래슀의 private 멀버에 μ ‘κ·Όν•  수 μ—†μ§€λ§Œ, 정적 멀버 ν΄λž˜μŠ€λŠ” μ™ΈλΆ€ 클래슀의 λ©€λ²„μ΄λ―€λ‘œ μ™ΈλΆ€ 클래슀의 private 멀버에도 μ ‘κ·Όν•  수 μžˆλŠ” μ˜ˆμ™Έμ μΈ κ²½μš°μ΄λ‹€.

  • 정적 멀버 ν΄λž˜μŠ€λŠ” μ™ΈλΆ€ 클래슀의 μΌλΆ€λ‘œ μ„ μ–Έλ˜λ©°, 일반 클래슀처럼 λ…λ¦½μ μœΌλ‘œ λ™μž‘ν•  수 μžˆλ‹€.
  • κ·ΈλŸ¬λ‚˜ μ™ΈλΆ€ 클래슀의 private 멀버에 μ ‘κ·Όν•  수 μžˆλ‹€λŠ” μ μ—μ„œ 일반 ν΄λž˜μŠ€μ™€ 차이가 μžˆλ‹€.

3. 비정적 멀버 클래슀

1) 비정적 멀버 클래슀 (Non-static Member Class)

{% hint style="danger" %} 비정적 멀버 ν΄λž˜μŠ€λŠ” μ™ΈλΆ€ 클래슀의 μΈμŠ€ν„΄μŠ€μ™€ μ•”λ¬΅μ μœΌλ‘œ μ—°κ²°λ˜μ–΄, 즉, μ™ΈλΆ€ 클래슀의 μΈμŠ€ν„΄μŠ€ 없이 생성할 수 μ—†λ‹€. 이λ₯Ό 톡해 λ°”κΉ₯ 클래슀의 λ©”μ„œλ“œλ‚˜ ν•„λ“œμ— μ ‘κ·Όν•  수 μžˆλŠ” κ°•λ ₯ν•œ κΈ°λŠ₯을 μ œκ³΅ν•œλ‹€. 비정적 멀버 ν΄λž˜μŠ€λŠ” λ°”κΉ₯ 클래슀의 μΈμŠ€ν„΄μŠ€μ™€ κ°•ν•˜κ²Œ μ—°κ²°λ˜λ©°, κ°€λΉ„μ§€ μ»¬λ ‰μ…˜μ—μ„œ λ©”λͺ¨λ¦¬ λˆ„μˆ˜μ˜ 원인이 될 μˆ˜λ„ μžˆλ‹€. {% endhint %}

  • 비정적 멀버 ν΄λž˜μŠ€λŠ” μ™ΈλΆ€ 클래슀의 μΈμŠ€ν„΄μŠ€μ™€ μ—°κ΄€λ˜μ–΄ μžˆλ‹€.
  • 비정적 멀버 ν΄λž˜μŠ€λŠ” μ™ΈλΆ€ 클래슀의 μΈμŠ€ν„΄μŠ€μ— μ ‘κ·Όν•  수 μžˆλ‹€. λ”°λΌμ„œ μ™ΈλΆ€ 클래슀의 μΈμŠ€ν„΄μŠ€ ν•„λ“œμ™€ λ©”μ„œλ“œμ— 자유둭게 μ ‘κ·Όν•  수 μžˆλŠ” ν΄λž˜μŠ€μ΄λ‹€.
  • 주둜 μ™ΈλΆ€ 클래슀의 μƒνƒœμ™€ λ°€μ ‘ν•˜κ²Œ μ—°κ΄€λœ μž‘μ—…μ„ μˆ˜ν–‰ν•  λ•Œ μ‚¬μš©λœλ‹€.
public class OuterClass {
    private String message = "Hello from OuterClass!";

    // 비정적 멀버 클래슀
    public class InnerClass {
        public void printMessage() {
            System.out.println(message); // μ™ΈλΆ€ 클래슀의 ν•„λ“œμ— μ ‘κ·Ό κ°€λŠ₯
        }
    }

    public static void main(String[] args) {
        OuterClass outer = new OuterClass();
        OuterClass.InnerClass inner = outer.new InnerClass();
        inner.printMessage(); // "Hello from OuterClass!"
    }
}
  • μœ„ μ˜ˆμ‹œμ—μ„œ InnerClassλŠ” 비정적 멀버 ν΄λž˜μŠ€μž…λ‹ˆλ‹€. μ™ΈλΆ€ 클래슀인 OuterClass의 μΈμŠ€ν„΄μŠ€κ°€ μžˆμ–΄μ•Ό InnerClass의 객체λ₯Ό λ§Œλ“€ 수 μžˆλ‹€. λ˜ν•œ InnerClassλŠ” OuterClass의 ν•„λ“œμ— μ ‘κ·Όν•  수 μžˆλ‹€.
public class OuterClass {
    private String secret = "OuterClass Secret";

    // 비정적 멀버 클래슀
    public class NonStaticInnerClass {
        public void revealSecret() {
            // λ°”κΉ₯ 클래슀의 private 멀버에 μ ‘κ·Ό κ°€λŠ₯
            System.out.println("Secret: " + secret);
        }
    }

    public NonStaticInnerClass getInnerClass() {
        return new NonStaticInnerClass();
    }
}

public class Main {
    public static void main(String[] args) {
        OuterClass outer = new OuterClass();
        OuterClass.NonStaticInnerClass inner = outer.getInnerClass();
        inner.revealSecret(); // "Secret: OuterClass Secret"
    }
}
  • λ°”κΉ₯ 클래슀의 μΈμŠ€ν„΄μŠ€κ°€ μžˆμ–΄μ•Όλ§Œ μΈμŠ€ν„΄μŠ€ν™” κ°€λŠ₯.
  • λ°”κΉ₯ 클래슀의 μΈμŠ€ν„΄μŠ€μ™€ μ•”λ¬΅μ μœΌλ‘œ μ—°κ²°λ˜μ–΄ μžˆλ‹€.
  • λ°”κΉ₯ μΈμŠ€ν„΄μŠ€μ˜ this μ°Έμ‘°λ₯Ό 톡해 λ°”κΉ₯ 클래슀의 ν•„λ“œμ™€ λ©”μ„œλ“œμ— μ ‘κ·Όν•  수 μžˆλ‹€.

정적 멀버 ν΄λž˜μŠ€μ™€ 비정적 멀버 클래슀의 ꡬ문 차이

κ΅¬λ¬ΈμƒμœΌλ‘œλŠ” 정적 멀버 ν΄λž˜μŠ€λŠ” static ν‚€μ›Œλ“œλ₯Ό λΆ™μΈλ‹€λŠ” 차이만 μžˆμ§€λ§Œ, λ™μž‘ μΈ‘λ©΄μ—μ„œλŠ” λ°”κΉ₯ ν΄λž˜μŠ€μ™€μ˜ μ—°κ²° μ—¬λΆ€κ°€ 큰 차이λ₯Ό λ§Œλ“ λ‹€.

public class OuterClass {
    public static class StaticInnerClass {
        // 정적 멀버 클래슀
    }

    public class NonStaticInnerClass {
        // 비정적 멀버 클래슀
    }
}

2) 정적 멀버 ν΄λž˜μŠ€μ™€ 비정적 멀버 클래슀의 차이점 μš”μ•½

정적 멀버 클래슀 비정적 멀버 클래슀
μ™ΈλΆ€ 클래슀의 μΈμŠ€ν„΄μŠ€ 없이 생성 κ°€λŠ₯ μ™ΈλΆ€ 클래슀의 μΈμŠ€ν„΄μŠ€κ°€ μžˆμ–΄μ•Ό 생성 κ°€λŠ₯
μ™ΈλΆ€ 클래슀의 μΈμŠ€ν„΄μŠ€ 멀버에 μ ‘κ·Ό λΆˆκ°€ μ™ΈλΆ€ 클래슀의 μΈμŠ€ν„΄μŠ€ 멀버에 μ ‘κ·Ό κ°€λŠ₯
주둜 독립적인 λ„μš°λ―Έ 클래슀둜 μ‚¬μš© μ™ΈλΆ€ ν΄λž˜μŠ€μ™€ λ°€μ ‘ν•˜κ²Œ μ—°κ΄€λœ λ™μž‘μ„ μˆ˜ν–‰
static ν‚€μ›Œλ“œλ‘œ 선언됨 static ν‚€μ›Œλ“œκ°€ μ—†μŒ

3) μ–Έμ œ μ‚¬μš©ν•˜λ‚˜?

  • 정적 멀버 ν΄λž˜μŠ€λŠ” μ™ΈλΆ€ ν΄λž˜μŠ€μ™€ λ°€μ ‘ν•˜κ²Œ μ—°κ΄€λ˜μ–΄ μžˆμ§€λ§Œ, μ™ΈλΆ€ 클래슀의 μƒνƒœμ— μ˜μ‘΄ν•˜μ§€ μ•ŠλŠ” κ²½μš°μ— 주둜 μ‚¬μš©λœλ‹€. 예λ₯Ό λ“€μ–΄, μ—°μ‚°μž μ •μ˜, μƒμˆ˜ μ§‘ν•© 등을 λ‚˜νƒ€λ‚Ό λ•Œ μ ν•©ν•˜λ‹€.
  • 비정적 멀버 ν΄λž˜μŠ€λŠ” μ™ΈλΆ€ 클래슀의 μƒνƒœλ₯Ό μ°Έμ‘°ν•˜κ±°λ‚˜ μ™ΈλΆ€ ν΄λž˜μŠ€μ™€ λ°€μ ‘ν•œ μƒν˜Έμž‘μš©μ΄ ν•„μš”ν•œ κ²½μš°μ— μ‚¬μš©λœλ‹€. 예λ₯Ό λ“€μ–΄, μ™ΈλΆ€ 클래슀의 ν•„λ“œλ‚˜ λ©”μ„œλ“œμ— μ ‘κ·Όν•΄μ•Ό ν•˜λŠ” μƒν™©μ—μ„œ μ‚¬μš©λœλ‹€.

{% hint style="success" %} 정적 멀버 ν΄λž˜μŠ€λŠ” μ™ΈλΆ€ 클래슀의 μƒνƒœμ™€ 상관없이 λ…λ¦½μ μœΌλ‘œ λ™μž‘ν•  수 μžˆλŠ” λ„μš°λ―Έ 클래슀둜 주둜 μ‚¬μš©λ˜κ³ , 비정적 멀버 ν΄λž˜μŠ€λŠ” μ™ΈλΆ€ 클래슀의 μΈμŠ€ν„΄μŠ€μ™€ λ°€μ ‘ν•˜κ²Œ μ—°κ΄€λœ μž‘μ—…μ„ μˆ˜ν–‰ν•˜λŠ” 데 μ‚¬μš©λœλ‹€. {% endhint %}

4. μ‹€μ œ 사둀

1) 반볡자λ₯Ό κ΅¬ν˜„ν•˜λŠ” 비정적 멀버 클래슀

비정적 멀버 ν΄λž˜μŠ€λŠ” μ»¬λ ‰μ…˜μ˜ 반볡자λ₯Ό κ΅¬ν˜„ν•  λ•Œ 자주 μ‚¬μš©λœλ‹€. μ—¬κΈ°μ„œ λ°˜λ³΅μžλŠ” λ°”κΉ₯ 클래슀의 μΈμŠ€ν„΄μŠ€ μƒνƒœλ₯Ό μ°Έμ‘°ν•  수 μžˆμ–΄μ•Ό ν•˜λ―€λ‘œ 비정적 멀버 클래슀둜 κ΅¬ν˜„λœλ‹€.

import java.util.AbstractSet;
import java.util.Iterator;

public class MySet<E> extends AbstractSet<E> {
    private E[] elements;  // MySet ν΄λž˜μŠ€κ°€ κ΄€λ¦¬ν•˜λŠ” μš”μ†Œ λ°°μ—΄
    private int size;      // MySet에 ν¬ν•¨λœ μš”μ†Œμ˜ 수

    // μƒμ„±μž: 배열을 λ°›μ•„ MySet을 μ΄ˆκΈ°ν™”
    public MySet(E[] elements) {
        this.elements = elements;
        this.size = elements.length;  // μš”μ†Œ 수λ₯Ό λ°°μ—΄μ˜ 길이둜 μ„€μ •
    }

    // iterator() λ©”μ„œλ“œ: MyIterator μΈμŠ€ν„΄μŠ€λ₯Ό λ°˜ν™˜
    @Override
    public Iterator<E> iterator() {
        return new MyIterator();  // 비정적 멀버 클래슀인 MyIteratorλ₯Ό μƒμ„±ν•˜κ³  λ°˜ν™˜
    }

    // 비정적 멀버 클래슀: 반볡자λ₯Ό κ΅¬ν˜„ν•˜λŠ” MyIterator 클래슀
    private class MyIterator implements Iterator<E> {
        private int index = 0;  // λ°˜λ³΅μžκ°€ ν˜„μž¬ 가리킀고 μžˆλŠ” μš”μ†Œμ˜ 인덱슀

        // hasNext(): λ‹€μŒ μš”μ†Œκ°€ μžˆλŠ”μ§€ μ—¬λΆ€λ₯Ό 확인
        @Override
        public boolean hasNext() {
            return index < size;  // ν˜„μž¬ μΈλ±μŠ€κ°€ size보닀 μž‘μœΌλ©΄ λ‹€μŒ μš”μ†Œκ°€ 쑴재
        }

        // next(): λ‹€μŒ μš”μ†Œλ₯Ό λ°˜ν™˜
        @Override
        public E next() {
            return elements[index++];  // ν˜„μž¬ 인덱슀의 μš”μ†Œλ₯Ό λ°˜ν™˜ν•˜κ³ , 인덱슀λ₯Ό 증가
        }
    }

    // size(): MySet에 ν¬ν•¨λœ μš”μ†Œμ˜ 수λ₯Ό λ°˜ν™˜
    @Override
    public int size() {
        return size;
    }

    // main λ©”μ„œλ“œ: MySet을 μƒμ„±ν•˜κ³ , 반볡자λ₯Ό μ‚¬μš©ν•˜μ—¬ μš”μ†Œλ₯Ό 좜λ ₯
    public static void main(String[] args) {
        MySet<String> mySet = new MySet<>(new String[]{"A", "B", "C"});  // String μš”μ†Œλ‘œ κ΅¬μ„±λœ MySet 생성
        Iterator<String> iterator = mySet.iterator();  // MySet의 반볡자 생성
        while (iterator.hasNext()) {
            System.out.println(iterator.next());  // 반볡자λ₯Ό μ‚¬μš©ν•˜μ—¬ μš”μ†Œλ₯Ό ν•˜λ‚˜μ”© 좜λ ₯
        }
    }
}
  • MySet<E> 클래슀: AbstractSet<E>λ₯Ό 상속받아 μ‚¬μš©μž μ •μ˜ 집합을 κ΅¬ν˜„ν•œ 클래슀. λ‚΄λΆ€μ—μ„œ E[] νƒ€μž… 배열을 μ‚¬μš©ν•΄ μš”μ†Œλ“€μ„ κ΄€λ¦¬ν•˜λ©°, 크기 μ •λ³΄λŠ” size둜 μ €μž₯λœλ‹€.
  • 비정적 멀버 클래슀 MyIterator: MySet 클래슀의 반볡자λ₯Ό κ΅¬ν˜„ν•œ 비정적 멀버 클래슀. MyIteratorλŠ” MySet 클래슀의 μΈμŠ€ν„΄μŠ€μ— ν¬ν•¨λœ μš”μ†Œ 배열에 μ ‘κ·Όν•  수 μžˆλ‹€.
  • μ€‘μš”ν•œ 점: 비정적 멀버 클래슀인 MyIteratorλŠ” MySet의 μΈμŠ€ν„΄μŠ€ μƒνƒœ(elements, size)에 직접 μ ‘κ·Όν•  수 있기 λ•Œλ¬Έμ— μœ μš©ν•˜λ‹€. 이λ₯Ό 톡해 λ°”κΉ₯ 클래슀의 μƒνƒœμ™€ κΈ΄λ°€ν•˜κ²Œ μ—°κ²°λ˜μ–΄ λ™μž‘ν•œλ‹€.

2) 정적 멀버 클래슀λ₯Ό μ‚¬μš©ν•˜λŠ” 사둀: Map Entry

정적 멀버 ν΄λž˜μŠ€λŠ” 보톡 λ°”κΉ₯ 클래슀의 일뢀 역할을 μˆ˜ν–‰ν•˜μ§€λ§Œ, λ°”κΉ₯ 클래슀의 μƒνƒœμ™€λŠ” λ…λ¦½μ μœΌλ‘œ λ™μž‘ν•œλ‹€. 예λ₯Ό λ“€μ–΄ Map.EntryλŠ” Mapκ³Ό κ΄€λ ¨ μžˆμ§€λ§Œ λ…λ¦½μ μœΌλ‘œ λ™μž‘ν•΄μ•Ό ν•˜λ―€λ‘œ 정적 멀버 클래슀둜 μ •μ˜λœλ‹€.

public class MapExample {
    // 정적 멀버 클래슀 Entry: key-value μŒμ„ μ €μž₯ν•˜λŠ” 클래슀
    public static class Entry<K, V> {
        private K key;    // ν‚€
        private V value;  // κ°’

        // μƒμ„±μž: key와 valueλ₯Ό λ°›μ•„ Entryλ₯Ό μ΄ˆκΈ°ν™”
        public Entry(K key, V value) {
            this.key = key;
            this.value = value;
        }

        // getKey(): ν‚€λ₯Ό λ°˜ν™˜
        public K getKey() {
            return key;
        }

        // getValue(): 값을 λ°˜ν™˜
        public V getValue() {
            return value;
        }

        // toString(): "key=value" ν˜•μ‹μœΌλ‘œ 좜λ ₯
        @Override
        public String toString() {
            return key + "=" + value;  // 킀와 값을 "=" 기호둜 μ—°κ²°ν•˜μ—¬ λ¬Έμžμ—΄λ‘œ λ°˜ν™˜
        }
    }

    // main λ©”μ„œλ“œ: Entry μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν•˜κ³  좜λ ₯
    public static void main(String[] args) {
        MapExample.Entry<String, Integer> entry = new MapExample.Entry<>("Key", 100);  // "Key", 100 쌍으둜 Entry 생성
        System.out.println(entry);  // "Key=100" 좜λ ₯
    }
}
  • 정적 멀버 클래슀 Entry: 이 ν΄λž˜μŠ€λŠ” MapExample 클래슀의 내뢀에 μ„ μ–Έλœ 정적 멀버 클래슀둜, λ°”κΉ₯ 클래슀 MapExample의 μƒνƒœμ™€λŠ” λ…λ¦½μ μœΌλ‘œ λ™μž‘ν•œλ‹€. Entry ν΄λž˜μŠ€λŠ” ν‚€-κ°’ μŒμ„ κ΄€λ¦¬ν•˜λ©°, Map.Entry의 κ°œλ…μ„ κ΅¬ν˜„ν•œλ‹€.
  • μ€‘μš”ν•œ 점: 정적 멀버 ν΄λž˜μŠ€λŠ” λ°”κΉ₯ 클래슀의 μΈμŠ€ν„΄μŠ€μ™€ 관계없이 λ…λ¦½μ μœΌλ‘œ λ™μž‘ν•˜λ―€λ‘œ, λ°”κΉ₯ 클래슀의 μƒνƒœμ— μ˜μ‘΄ν•˜μ§€ μ•ŠλŠ”λ‹€. Entry ν΄λž˜μŠ€λŠ” MapExample 클래슀의 μƒνƒœλ₯Ό μ°Έμ‘°ν•˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμ— 정적 멀버 클래슀둜 κ΅¬ν˜„λœλ‹€.

3) 정리

  • 정적 멀버 ν΄λž˜μŠ€λŠ” λ°”κΉ₯ ν΄λž˜μŠ€μ™€ λ…λ¦½μ μœΌλ‘œ λ™μž‘ν•˜λ©°, λ©”λͺ¨λ¦¬μ™€ μ„±λŠ₯ λ©΄μ—μ„œ 더 효율적일 수 μžˆμŠ΅λ‹ˆλ‹€.
  • 비정적 멀버 ν΄λž˜μŠ€λŠ” λ°”κΉ₯ 클래슀의 μΈμŠ€ν„΄μŠ€μ™€ μ—°κ²°λ˜μ–΄ 있으며, λ°”κΉ₯ 클래슀의 μƒνƒœλ₯Ό μ°Έμ‘°ν•΄μ•Ό ν•  λ•Œ μ‚¬μš©λ©λ‹ˆλ‹€.
  • ꡬ문적으둜 static ν‚€μ›Œλ“œκ°€ λΆ™λŠλƒ μ•ˆ λΆ™λŠλƒ 차이만 μžˆμ§€λ§Œ, μ˜λ―Έμƒ 큰 차이가 μžˆμŠ΅λ‹ˆλ‹€.

5. 읡λͺ… ν΄λž˜μŠ€μ™€ μ§€μ—­ 클래슀

1) 읡λͺ… 클래슀 (Anonymous Class)

읡λͺ… ν΄λž˜μŠ€λŠ” 이름이 μ—†λŠ” ν΄λž˜μŠ€μ΄λ‹€. 주둜 μ¦‰μ„μ—μ„œ μΈμŠ€ν„΄μŠ€λ₯Ό 생성할 λ•Œ μ‚¬μš©λœλ‹€.

이름이 μ—†κΈ° λ•Œλ¬Έμ— 였직 μ„ μ–Έκ³Ό λ™μ‹œμ— μΈμŠ€ν„΄μŠ€λ₯Ό 생성할 수 μžˆλ‹€. 그리고 νŠΉμ • μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•˜κ±°λ‚˜, 클래슀의 μ„œλΈŒ 클래슀λ₯Ό ν•œ λ²ˆμ— μ •μ˜ν•  수 μžˆμ§€λ§Œ μ—¬λŸ¬ μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•˜κ±°λ‚˜ λ‹€λ₯Έ 클래슀λ₯Ό 상속할 μˆ˜λŠ” μ—†λ‹€.

읡λͺ… 클래슀의 νŠΉμ§•:

  • 이름이 μ—†λ‹€: μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν•˜λŠ” λ™μ‹œμ— μ„ μ–Έλ˜μ–΄ μ‚¬μš©
  • 단일 μΈν„°νŽ˜μ΄μŠ€λ§Œ κ΅¬ν˜„ν•˜κ±°λ‚˜, 단일 클래슀λ₯Ό 상속할 수 μžˆλ‹€.
  • 정적 λ¬Έλ§₯μ—μ„œ μ‚¬μš©ν•  수 μ—†κ³ , 정적 멀버λ₯Ό κ°€μ§ˆ 수 μ—†λ‹€.
  • μ½”λ“œμ˜ μ„ μ–Έ μ§€μ μ—μ„œλ§Œ μ‚¬μš©ν•  수 μžˆλ‹€. (μž¬μ‚¬μš© λΆˆκ°€λŠ₯)
  • 10쀄 μ΄ν•˜μ˜ κ°„λ‹¨ν•œ μ½”λ“œλ‘œ μ‚¬μš©ν•˜λŠ” 것이 μ’‹λ‹€. κ·Έλ ‡μ§€ μ•ŠμœΌλ©΄ 가독성이 λ–¨μ–΄μ§„λ‹€.
  • λ°”κΉ₯ 클래슀의 μΈμŠ€ν„΄μŠ€λ₯Ό μ°Έμ‘°ν•  수 μžˆλ‹€.
public class AnonymousClassExample {

    interface Greeting {
        void sayHello();
    }

    public static void main(String[] args) {
        // 읡λͺ… 클래슀 μ‚¬μš© 예
        Greeting greeting = new Greeting() { // 이름이 μ—†λŠ” 클래슀 생성
            @Override
            public void sayHello() {
                System.out.println("Hello from Anonymous Class!");
            }
        };
        greeting.sayHello(); // "Hello from Anonymous Class!" 좜λ ₯
    }
}

νŠΉμ§• μ„€λͺ…:

  • Greeting μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•˜λŠ” 읡λͺ… ν΄λž˜μŠ€κ°€ μƒμ„±λ˜κ³ , κ·Έ 클래슀의 μΈμŠ€ν„΄μŠ€κ°€ λ°”λ‘œ λ§Œλ“€μ–΄μ§„λ‹€.
  • 클래슀의 이름이 μ—†κΈ° λ•Œλ¬Έμ— μ„ μ–Έκ³Ό λ™μ‹œμ— μΈμŠ€ν„΄μŠ€λ₯Ό μ‚¬μš©ν•  수 μžˆλ‹€.
  • μ½”λ“œμ˜ κ°„κ²°μ„±κ³Ό μΌνšŒμ„± μ‚¬μš©μ„ μœ„ν•΄ 읡λͺ… 클래슀λ₯Ό μ‚¬μš©ν–ˆλ‹€.

2) μ§€μ—­ 클래슀 (Local Class)

μ§€μ—­ ν΄λž˜μŠ€λŠ” λ©”μ„œλ“œ 내에 μ •μ˜λ˜λŠ” 클래슀이며, ν•΄λ‹Ή λ©”μ„œλ“œμ˜ μ§€μ—­λ³€μˆ˜μ²˜λŸΌ μ‚¬μš©λœλ‹€. μ§€μ—­ λ³€μˆ˜κ°€ 선언될 수 μžˆλŠ” 곳이라면 μ–΄λ””μ—μ„œλ“  μ •μ˜ν•  수 있고, ν•΄λ‹Ή 블둝 λ‚΄μ—μ„œλ§Œ μœ νš¨ν•˜λ‹€.

읡λͺ… ν΄λž˜μŠ€μ™€ 달리 이름이 μžˆμ–΄ 반볡적으둜 μ‚¬μš©ν•  수 μžˆμ§€λ§Œ, μ™ΈλΆ€μ—μ„œ μ ‘κ·Όν•  수 μ—†λ‹€.

μ§€μ—­ 클래슀의 νŠΉμ§•:

  • λ©”μ„œλ“œ 내뢀에 μ„ μ–Έλ˜μ–΄ ν•΄λ‹Ή λ©”μ„œλ“œμ˜ μ§€μ—­λ³€μˆ˜μ²˜λŸΌ μ‚¬μš©λœλ‹€.
  • 이름이 μžˆλ‹€: 반볡적으둜 μ‚¬μš©ν•  수 μžˆλ‹€.
  • λ°”κΉ₯ 클래슀의 멀버에도 μ ‘κ·Όν•  수 있으며, final μ§€μ—­ λ³€μˆ˜μ— μ ‘κ·Ό κ°€λŠ₯ν•˜λ‹€.
  • μ™ΈλΆ€μ—μ„œλŠ” μ ‘κ·Όν•  수 μ—†λ‹€ (μ§€μ—­ ν΄λž˜μŠ€λŠ” ν•΄λ‹Ή 블둝 λ‚΄μ—μ„œλ§Œ 유효).
public class LocalClassExample {

    public void printNumbers() {
        final int factor = 2; // final μ§€μ—­ λ³€μˆ˜

        // μ§€μ—­ 클래슀
        class Multiplier {
            int multiply(int number) {
                return number * factor; // λ°”κΉ₯ λ©”μ„œλ“œμ˜ final λ³€μˆ˜μ— μ ‘κ·Ό κ°€λŠ₯
            }
        }

        Multiplier multiplier = new Multiplier();
        System.out.println(multiplier.multiply(5)); // 좜λ ₯: 10
        System.out.println(multiplier.multiply(10)); // 좜λ ₯: 20
    }

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

νŠΉμ§• μ„€λͺ…:

  • MultiplierλΌλŠ” μ§€μ—­ ν΄λž˜μŠ€κ°€ printNumbers λ©”μ„œλ“œ λ‚΄μ—μ„œ μ„ μ–Έλ˜μ—ˆλ‹€.
  • 이 ν΄λž˜μŠ€λŠ” factorλΌλŠ” final λ³€μˆ˜μ— μ ‘κ·Όν•  수 μžˆλ‹€.
  • Multiplier ν΄λž˜μŠ€λŠ” λ©”μ„œλ“œ λ‚΄μ—μ„œ μ—¬λŸ¬ 번 μΈμŠ€ν„΄μŠ€ν™”ν•  수 μžˆμ§€λ§Œ, ν•΄λ‹Ή λ©”μ„œλ“œ λ°–μ—μ„œλŠ” μ‚¬μš©ν•  수 μ—†λ‹€.

3) 읡λͺ… ν΄λž˜μŠ€μ™€ μ§€μ—­ 클래슀의 차이

νŠΉμ§• 읡λͺ… 클래슀 μ§€μ—­ 클래슀
이름 μ—†μŒ 있음
μ‚¬μš© κ°€λŠ₯ λ²”μœ„ μ„ μ–Έλœ μ§€μ μ—μ„œλ§Œ μ‚¬μš© κ°€λŠ₯ (μΌνšŒμ„±) λ©”μ„œλ“œλ‚˜ 블둝 λ‚΄μ—μ„œ μ—¬λŸ¬ 번 μΈμŠ€ν„΄μŠ€ν™” κ°€λŠ₯
λ°”κΉ₯ 클래슀 μ°Έμ‘° κ°€λŠ₯ κ°€λŠ₯
μ§€μ—­ λ³€μˆ˜ μ ‘κ·Ό final λ˜λŠ” effectively final μ§€μ—­ λ³€μˆ˜λ§Œ κ°€λŠ₯ final λ˜λŠ” effectively final μ§€μ—­ λ³€μˆ˜λ§Œ κ°€λŠ₯
μž¬μ‚¬μš©μ„± μž¬μ‚¬μš© λΆˆκ°€λŠ₯ λ©”μ„œλ“œ λ‚΄μ—μ„œ μž¬μ‚¬μš© κ°€λŠ₯
μ‚¬μš© μœ„μΉ˜ λ©”μ„œλ“œλ‚˜ ν‘œν˜„μ‹ λ‚΄μ—μ„œ 주둜 μ‚¬μš© λ©”μ„œλ“œλ‚˜ 블둝 λ‚΄μ—μ„œ μ„ μ–Έ

4) 읡λͺ… 클래슀의 μ œν•œ 사항

  • μ—¬λŸ¬ μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•  수 μ—†κ³ , 단 ν•˜λ‚˜μ˜ μΈν„°νŽ˜μ΄μŠ€λ‚˜ 클래슀만 상속할 수 μžˆλ‹€.
  • 읡λͺ… ν΄λž˜μŠ€λŠ” μΈμŠ€ν„΄μŠ€κ°€ 생성될 λ•Œλ§Œ μ„ μ–Έλ˜λ©°, μž¬μ‚¬μš©μ΄ λΆˆκ°€λŠ₯ν•˜λ‹€.
  • 클래슀의 이름이 μ—†μœΌλ―€λ‘œ instanceof κ²€μ‚¬λ‚˜ 클래슀의 이름이 ν•„μš”ν•œ μž‘μ—…μ€ μˆ˜ν–‰ν•  수 μ—†λ‹€.

읡λͺ… ν΄λž˜μŠ€λŠ” 주둜 κ°„λ‹¨ν•œ μΌνšŒμ„± μ‚¬μš©μ— μœ λ¦¬ν•˜λ©°, μ½”λ“œ 간결성을 μ€‘μ‹œν•  λ•Œ μ‚¬μš©λœλ‹€. 반면, μ§€μ—­ ν΄λž˜μŠ€λŠ” 이름이 μžˆμ–΄ μ—¬λŸ¬ 번 μΈμŠ€ν„΄μŠ€ν™”κ°€ ν•„μš”ν•  λ•Œ μ‚¬μš©λœλ‹€.

✨ μ΅œμ’… 정리

  • 쀑첩 ν΄λž˜μŠ€μ—λŠ” λ„€ κ°€μ§€κ°€ 있으며, 각각의 μ“°μž„μ΄ λ‹€λ₯΄λ‹€. λ©”μ„œλ“œ λ°–μ—μ„œλ„ μ‚¬μš©ν•΄μ•Ό ν•˜κ±°λ‚˜ λ©”μ„œλ“œ μ•ˆμ— μ •μ˜ν•˜κΈ°μ—” λ„ˆλ¬΄ κΈΈλ‹€λ©΄ 멀버 클래슀둜 λ§Œλ“ λ‹€.
  • 멀버 클래슀의 μΈμŠ€ν„΄μŠ€ 각각이 λ°”κΉ₯ μΈμŠ€ν„΄μŠ€λ₯Ό μ°Έμ‘°ν•œλ‹€λ©΄ λΉ„μ •μ μœΌλ‘œ, κ·Έλ ‡μ§€ μ•ŠμœΌλ©΄ μ •μ μœΌλ‘œ λ§Œλ“€μž.
  • 쀑첩 ν΄λž˜μŠ€κ°€ ν•œ λ©”μ„œλ“œ μ•ˆμ—μ„œλ§Œ μ“°μ΄λ©΄μ„œ κ·Έ μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν•˜λŠ” 지점이 단 ν•œ 곳이고 ν•΄λ‹Ή νƒ€μž…μœΌλ‘œ 쓰기에 μ ν•©ν•œ ν΄λž˜μŠ€λ‚˜ μΈν„°νŽ˜μ΄μŠ€κ°€ 이미 μžˆλ‹€λ©΄ 읡λͺ… 클래슀둜 λ§Œλ“€κ³ , κ·Έλ ‡μ§€ μ•ŠμœΌλ©΄ μ§€μ—­ 클래슀둜 λ§Œλ“€μž.