** ๐Ÿ“Œ1๋‹จ๊ณ„: ๋‚ด๋ถ€ ํด๋ž˜์Šค(Inner Class)๋ž€?**

โœ… 1. ๋‚ด๋ถ€ ํด๋ž˜์Šค์˜ ๊ฐœ๋…

์ž๋ฐ”์—์„œ๋Š” ์ฝ”๋“œ์˜ ๋…ผ๋ฆฌ์ ์ธ ๊ทธ๋ฃนํ™”, ์บก์Аํ™” ๊ฐ•ํ™”, ๊ฐ€๋…์„ฑ ํ–ฅ์ƒ์„ ์œ„ํ•ด ๋‚ด๋ถ€ ํด๋ž˜์Šค๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

๋‚ด๋ถ€ ํด๋ž˜์Šค๋Š” ์™ธ๋ถ€ ํด๋ž˜์Šค์™€ ๊ฐ•ํ•œ ์—ฐ๊ด€์„ฑ์„ ๊ฐ€์ง€๋ฉฐ,

ํŠน์ • ํด๋ž˜์Šค ๋‚ด๋ถ€์—์„œ๋งŒ ์‚ฌ์šฉ๋˜๋Š” ๊ฒฝ์šฐ ์œ ์šฉํ•˜๊ฒŒ ํ™œ์šฉ๋ฉ๋‹ˆ๋‹ค.


โœ… 2. ๋‚ด๋ถ€ ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ 

์™œ ๋‚ด๋ถ€ ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ• ๊นŒ์š”?

๋‹ค์Œ๊ณผ ๊ฐ™์€ ์žฅ์ ์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

๋‚ด๋ถ€ ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ  ์„ค๋ช…
์บก์Аํ™”(Encapsulation) ๊ฐ•ํ™” ์™ธ๋ถ€ ํด๋ž˜์Šค์—์„œ๋งŒ ์‚ฌ์šฉ๋˜๋„๋ก ์ˆจ๊ธธ ์ˆ˜ ์žˆ์Œ
์ฝ”๋“œ ๊ฐ€๋…์„ฑ ํ–ฅ์ƒ ๊ด€๋ จ๋œ ์ฝ”๋“œ๋“ค์„ ํ•œ ๊ณณ์— ๋ชจ์•„ ์œ ์ง€๋ณด์ˆ˜ ์šฉ์ด
์™ธ๋ถ€ ํด๋ž˜์Šค์™€์˜ ๊ฐ•ํ•œ ๊ฒฐํ•ฉ ๋‚ด๋ถ€ ํด๋ž˜์Šค๋Š” ์™ธ๋ถ€ ํด๋ž˜์Šค์˜ ๋ฉค๋ฒ„(๋ณ€์ˆ˜, ๋ฉ”์„œ๋“œ)์— ์ž์œ ๋กญ๊ฒŒ ์ ‘๊ทผ ๊ฐ€๋Šฅ
์ด๋ฆ„ ์ถฉ๋Œ ๋ฐฉ์ง€ ๋‚ด๋ถ€ ํด๋ž˜์Šค๋Š” ์™ธ๋ถ€ ํด๋ž˜์Šค์™€ ๊ด€๋ จ๋œ ํŠน์ • ์ž‘์—…์—๋งŒ ์‚ฌ์šฉ๋˜๋ฏ€๋กœ, ๋ถˆํ•„์š”ํ•œ ๋„ค์ด๋ฐ ์ถฉ๋Œ์„ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ์Œ

์˜ˆ์ œ 1: ๋‚ด๋ถ€ ํด๋ž˜์Šค ๊ธฐ๋ณธ ๊ตฌ์กฐ

class OuterClass { // ์™ธ๋ถ€ ํด๋ž˜์Šค
    class InnerClass { // ๋‚ด๋ถ€ ํด๋ž˜์Šค
        void display() {
            System.out.println("๋‚ด๋ถ€ ํด๋ž˜์Šค ํ˜ธ์ถœ!");
        }
    }
}

โœ… 3. ๋‚ด๋ถ€ ํด๋ž˜์Šค์˜ ์ฃผ์š” ํŠน์ง•

๐Ÿ“Œ ๋‚ด๋ถ€ ํด๋ž˜์Šค๋Š” ์ผ๋ฐ˜์ ์ธ ํด๋ž˜์Šค์™€ ๋‹ค๋ฅด๊ฒŒ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํŠน์ง•์„ ๊ฐ€์ง‘๋‹ˆ๋‹ค.

  1. ๋‚ด๋ถ€ ํด๋ž˜์Šค๋Š” ์™ธ๋ถ€ ํด๋ž˜์Šค์˜ ๋ชจ๋“  ๋ฉค๋ฒ„(๋ณ€์ˆ˜, ๋ฉ”์„œ๋“œ)์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Œ
  2. ๋‚ด๋ถ€ ํด๋ž˜์Šค๋Š” ์™ธ๋ถ€ ํด๋ž˜์Šค ์—†์ด ๋…๋ฆฝ์ ์œผ๋กœ ์กด์žฌํ•  ์ˆ˜ ์—†์Œ
  3. ๋‚ด๋ถ€ ํด๋ž˜์Šค ๋‚ด๋ถ€์—์„œ this๋Š” ๋‚ด๋ถ€ ํด๋ž˜์Šค๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋ฉฐ, OuterClass.this๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์™ธ๋ถ€ ํด๋ž˜์Šค๋ฅผ ์ฐธ์กฐ ๊ฐ€๋Šฅ

์˜ˆ์ œ 2: ๋‚ด๋ถ€ ํด๋ž˜์Šค์—์„œ ์™ธ๋ถ€ ํด๋ž˜์Šค ๋ฉค๋ฒ„ ์ ‘๊ทผํ•˜๊ธฐ

class Outer {
    private String message = "Hello from Outer Class!";

    class Inner {
        void printMessage() {
            System.out.println(message); // ๋‚ด๋ถ€ ํด๋ž˜์Šค์—์„œ ์™ธ๋ถ€ ํด๋ž˜์Šค ๋ฉค๋ฒ„ ์ ‘๊ทผ ๊ฐ€๋Šฅ
        }
    }
}

โœ… 4. ๋‚ด๋ถ€ ํด๋ž˜์Šค์˜ ์ข…๋ฅ˜

์ž๋ฐ”์˜ ๋‚ด๋ถ€ ํด๋ž˜์Šค๋Š” 4๊ฐ€์ง€ ์ข…๋ฅ˜๋กœ ๊ตฌ๋ถ„๋ฉ๋‹ˆ๋‹ค.

๋‚ด๋ถ€ ํด๋ž˜์Šค ์ข…๋ฅ˜ ์„ค๋ช… ์ฃผ์š” ํŠน์ง•
์ธ์Šคํ„ด์Šค ๋‚ด๋ถ€ ํด๋ž˜์Šค ์™ธ๋ถ€ ํด๋ž˜์Šค์˜ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•œ ํ›„์—๋งŒ ์‚ฌ์šฉ ๊ฐ€๋Šฅ ์™ธ๋ถ€ ํด๋ž˜์Šค์˜ ๋ฉค๋ฒ„ ๋ณ€์ˆ˜ & ๋ฉ”์„œ๋“œ์— ์ ‘๊ทผ ๊ฐ€๋Šฅ
์ •์ (static) ๋‚ด๋ถ€ ํด๋ž˜์Šค ์™ธ๋ถ€ ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค ์—†์ด ์‚ฌ์šฉ ๊ฐ€๋Šฅ static ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉฐ, ์™ธ๋ถ€ ํด๋ž˜์Šค์˜ static ๋ฉค๋ฒ„๋งŒ ์ ‘๊ทผ ๊ฐ€๋Šฅ
์ง€์—ญ(Local) ๋‚ด๋ถ€ ํด๋ž˜์Šค ํŠน์ • ๋ฉ”์„œ๋“œ ๋‚ด๋ถ€์—์„œ๋งŒ ์„ ์–ธ & ์‚ฌ์šฉ ๊ฐ€๋Šฅ ๋ฉ”์„œ๋“œ๊ฐ€ ๋๋‚˜๋ฉด ํ•จ๊ป˜ ์†Œ๋ฉธ๋จ
์ต๋ช…(Anonymous) ๋‚ด๋ถ€ ํด๋ž˜์Šค ์ด๋ฆ„์ด ์—†๋Š” ์ผํšŒ์„ฑ ํด๋ž˜์Šค ์ฃผ๋กœ ์ธํ„ฐํŽ˜์ด์Šค ๋˜๋Š” ์ถ”์ƒ ํด๋ž˜์Šค ๊ตฌํ˜„์— ์‚ฌ์šฉ๋จ

โœ… 5. ๋‚ด๋ถ€ ํด๋ž˜์Šค ์‚ฌ์šฉ ์‹œ ์ฃผ์˜ํ•  ์ 

  1. ๋‚ด๋ถ€ ํด๋ž˜์Šค๊ฐ€ ๋ถˆํ•„์š”ํ•˜๊ฒŒ ๋งŽ์œผ๋ฉด ์ฝ”๋“œ๊ฐ€ ๋ณต์žกํ•ด์งˆ ์ˆ˜ ์žˆ์Œ
  2. ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ๋‚ด๋ถ€ ํด๋ž˜์Šค์˜ ๋ผ์ดํ”„์‚ฌ์ดํด์„ ๊ณ ๋ คํ•ด์•ผ ํ•จ
  3. static ๋‚ด๋ถ€ ํด๋ž˜์Šค์™€ ์ผ๋ฐ˜ ๋‚ด๋ถ€ ํด๋ž˜์Šค์˜ ์ฐจ์ด๋ฅผ ๋ฐ˜๋“œ์‹œ ์ดํ•ดํ•ด์•ผ ํ•จ

๐Ÿ“Œ 1๋‹จ๊ณ„ ์ •๋ฆฌ

โœ… ๋‚ด๋ถ€ ํด๋ž˜์Šค๋Š” ํด๋ž˜์Šค ๋‚ด๋ถ€์—์„œ ์ •์˜๋œ ๋˜ ๋‹ค๋ฅธ ํด๋ž˜์Šค์ด๋‹ค.

โœ… ์ฝ”๋“œ ๊ฐ€๋…์„ฑ๊ณผ ์บก์Аํ™”๋ฅผ ๊ฐ•ํ™”ํ•˜๋Š” ์—ญํ• ์„ ํ•œ๋‹ค.

โœ… ๋‚ด๋ถ€ ํด๋ž˜์Šค๋Š” ์™ธ๋ถ€ ํด๋ž˜์Šค์˜ ๋ฉค๋ฒ„(๋ณ€์ˆ˜, ๋ฉ”์„œ๋“œ)์— ์ž์œ ๋กญ๊ฒŒ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค.

โœ… ๋‚ด๋ถ€ ํด๋ž˜์Šค๋Š” ํฌ๊ฒŒ 4๊ฐ€์ง€ ์ข…๋ฅ˜(์ธ์Šคํ„ด์Šค, ์ •์ , ์ง€์—ญ, ์ต๋ช…)๋กœ ๋‚˜๋‰œ๋‹ค.

์ด์ œ 2๋‹จ๊ณ„์—์„œ๋Š” ๋‚ด๋ถ€ ํด๋ž˜์Šค์˜ ๊ตฌ์ฒด์ ์ธ ์ข…๋ฅ˜์™€ ์‚ฌ์šฉ๋ฒ•์„ ํ•™์Šตํ•ฉ๋‹ˆ๋‹ค. ๐Ÿš€

๐Ÿ“Œ 2๋‹จ๊ณ„: ๋‚ด๋ถ€ ํด๋ž˜์Šค์˜ ์ข…๋ฅ˜์™€ ์‚ฌ์šฉ๋ฒ•

์ž๋ฐ”์˜ ๋‚ด๋ถ€ ํด๋ž˜์Šค๋Š” 4๊ฐ€์ง€ ์ข…๋ฅ˜๋กœ ๋‚˜๋‰˜๋ฉฐ, ๊ฐ๊ฐ์˜ ํŠน์ง•๊ณผ ์‚ฌ์šฉ๋ฒ•์ด ๋‹ค๋ฆ…๋‹ˆ๋‹ค.

์ด ๋‹จ๊ณ„์—์„œ๋Š” ๊ฐ ๋‚ด๋ถ€ ํด๋ž˜์Šค์˜ ๊ฐœ๋…, ํŠน์ง•, ์ฝ”๋“œ ์˜ˆ์ œ๋ฅผ ํ†ตํ•ด ์ฐจ์ด์ ์„ ๋ช…ํ™•ํžˆ ์ดํ•ดํ•ฉ๋‹ˆ๋‹ค.


โœ… 1. ์ธ์Šคํ„ด์Šค ๋‚ด๋ถ€ ํด๋ž˜์Šค (Instance Inner Class)

โ€œ์™ธ๋ถ€ ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•ด์•ผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋‚ด๋ถ€ ํด๋ž˜์Šคโ€

๐Ÿ“Œ ํŠน์ง•

๐Ÿ“Œ ์ฝ”๋“œ ์˜ˆ์ œ

class OuterClass {
    private String message = "Hello from Outer!";

    // ๐Ÿ“Œ ์ธ์Šคํ„ด์Šค ๋‚ด๋ถ€ ํด๋ž˜์Šค
    class InnerClass {
        void display() {
            System.out.println(message); // ์™ธ๋ถ€ ํด๋ž˜์Šค์˜ private ๋ฉค๋ฒ„ ์ ‘๊ทผ ๊ฐ€๋Šฅ
        }
    }
}

public class Main {
    public static void main(String[] args) {
        OuterClass outer = new OuterClass(); // ์™ธ๋ถ€ ํด๋ž˜์Šค ๊ฐ์ฒด ์ƒ์„ฑ
        OuterClass.InnerClass inner = outer.new InnerClass(); // ๋‚ด๋ถ€ ํด๋ž˜์Šค ๊ฐ์ฒด ์ƒ์„ฑ
        inner.display(); // ์ถœ๋ ฅ: Hello from Outer!
    }
}

โœ… 2. ์ •์ (static) ๋‚ด๋ถ€ ํด๋ž˜์Šค (Static Inner Class)

โ€œ์™ธ๋ถ€ ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค ์—†์ด๋„ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋‚ด๋ถ€ ํด๋ž˜์Šคโ€

๐Ÿ“Œ ํŠน์ง•

๐Ÿ“Œ ์ฝ”๋“œ ์˜ˆ์ œ

class OuterClass {
    private static String staticMessage = "Hello from Static Inner!";

    // ๐Ÿ“Œ ์ •์  ๋‚ด๋ถ€ ํด๋ž˜์Šค
    static class StaticInner {
        void display() {
            System.out.println(staticMessage); // static ๋ฉค๋ฒ„ ์ ‘๊ทผ ๊ฐ€๋Šฅ
        }
    }
}

public class Main {
    public static void main(String[] args) {
        OuterClass.StaticInner inner = new OuterClass.StaticInner(); // ์ง์ ‘ ์ƒ์„ฑ ๊ฐ€๋Šฅ
        inner.display(); // ์ถœ๋ ฅ: Hello from Static Inner!
    }
}

โœ… 3. ์ง€์—ญ(Local) ๋‚ด๋ถ€ ํด๋ž˜์Šค

โ€œ๋ฉ”์„œ๋“œ ๋‚ด๋ถ€์—์„œ ์„ ์–ธ๋˜๋ฉฐ, ํ•ด๋‹น ๋ฉ”์„œ๋“œ๊ฐ€ ์‹คํ–‰๋  ๋•Œ๋งŒ ์กด์žฌํ•˜๋Š” ํด๋ž˜์Šคโ€

๐Ÿ“Œ ํŠน์ง•

๐Ÿ“Œ ์ฝ”๋“œ ์˜ˆ์ œ

class OuterClass {
    void outerMethod() {
        int localVar = 100; // Java 8 ์ดํ›„ ์•”๋ฌต์ ์œผ๋กœ final

        // ๐Ÿ“Œ ์ง€์—ญ ๋‚ด๋ถ€ ํด๋ž˜์Šค (๋ฉ”์„œ๋“œ ๋‚ด๋ถ€์—์„œ๋งŒ ์‚ฌ์šฉ๋จ)
        class LocalInner {
            void display() {
                System.out.println("Local variable: " + localVar);
            }
        }

        LocalInner localInner = new LocalInner();
        localInner.display(); // ์ถœ๋ ฅ: Local variable: 100
    }
}

public class Main {
    public static void main(String[] args) {
        OuterClass outer = new OuterClass();
        outer.outerMethod();
    }
}

โœ… 4. ์ต๋ช…(Anonymous) ๋‚ด๋ถ€ ํด๋ž˜์Šค

โ€œ์ด๋ฆ„ ์—†์ด ํ•œ ๋ฒˆ๋งŒ ์‚ฌ์šฉ๋˜๋Š” ํด๋ž˜์Šคโ€

๐Ÿ“Œ ํŠน์ง•

๐Ÿ“Œ ์ฝ”๋“œ ์˜ˆ์ œ (์ธํ„ฐํŽ˜์ด์Šค ๊ตฌํ˜„ ์˜ˆ์‹œ)

interface Greeting {
    void sayHello();
}

public class Main {
    public static void main(String[] args) {
        // ๐Ÿ“Œ ์ต๋ช… ๋‚ด๋ถ€ ํด๋ž˜์Šค ์‚ฌ์šฉ (์ธํ„ฐํŽ˜์ด์Šค ๊ตฌํ˜„)
        Greeting greeting = new Greeting() {
            @Override
            public void sayHello() {
                System.out.println("Hello from Anonymous Inner Class!");
            }
        };

        greeting.sayHello(); // ์ถœ๋ ฅ: Hello from Anonymous Inner Class!
    }
}

๐Ÿ“Œ 2๋‹จ๊ณ„ ์ •๋ฆฌ

๋‚ด๋ถ€ ํด๋ž˜์Šค ์ข…๋ฅ˜ ํŠน์ง• ์‚ฌ์šฉ ์˜ˆ์‹œ
์ธ์Šคํ„ด์Šค ๋‚ด๋ถ€ ํด๋ž˜์Šค ์™ธ๋ถ€ ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๊ฐ€ ํ•„์š” ์™ธ๋ถ€ ํด๋ž˜์Šค์˜ ๋ฉค๋ฒ„์— ์ ‘๊ทผ ๊ฐ€๋Šฅ
์ •์ (static) ๋‚ด๋ถ€ ํด๋ž˜์Šค ์™ธ๋ถ€ ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค ์—†์ด ์‚ฌ์šฉ ๊ฐ€๋Šฅ static ๋ฉค๋ฒ„๋งŒ ์ ‘๊ทผ ๊ฐ€๋Šฅ
์ง€์—ญ(Local) ๋‚ด๋ถ€ ํด๋ž˜์Šค ํŠน์ • ๋ฉ”์„œ๋“œ ๋‚ด์—์„œ๋งŒ ์„ ์–ธ & ์‚ฌ์šฉ ๋ฉ”์„œ๋“œ ์ข…๋ฃŒ ์‹œ ํ•จ๊ป˜ ์†Œ๋ฉธ
์ต๋ช…(Anonymous) ๋‚ด๋ถ€ ํด๋ž˜์Šค ์ด๋ฆ„ ์—†์ด ํ•œ ๋ฒˆ๋งŒ ์‚ฌ์šฉ๋˜๋Š” ํด๋ž˜์Šค ์ธํ„ฐํŽ˜์ด์Šค ๋˜๋Š” ์ถ”์ƒ ํด๋ž˜์Šค ๊ตฌํ˜„

##

๐Ÿ“Œ 3๋‹จ๊ณ„: ๋‚ด๋ถ€ ํด๋ž˜์Šค์˜ ๋ฉ”๋ชจ๋ฆฌ ๊ตฌ์กฐ & this, super ํ‚ค์›Œ๋“œ ํ™œ์šฉ

๋‚ด๋ถ€ ํด๋ž˜์Šค๋Š” ์™ธ๋ถ€ ํด๋ž˜์Šค์™€ ๊ฐ•ํ•˜๊ฒŒ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์—

๋ฉ”๋ชจ๋ฆฌ ๊ตฌ์กฐ์™€ this, super ํ‚ค์›Œ๋“œ๋ฅผ ์ดํ•ดํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.

์ด ๋‹จ๊ณ„์—์„œ๋Š” ๋ฉ”๋ชจ๋ฆฌ์—์„œ ๋‚ด๋ถ€ ํด๋ž˜์Šค๊ฐ€ ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ•˜๋Š”์ง€

๊ทธ๋ฆฌ๊ณ  this, super ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์™ธ๋ถ€ ํด๋ž˜์Šค์™€ ๋‚ด๋ถ€ ํด๋ž˜์Šค๋ฅผ ๊ตฌ๋ถ„ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ฐฐ์›๋‹ˆ๋‹ค.


โœ… 1. ๋‚ด๋ถ€ ํด๋ž˜์Šค์˜ ๋ฉ”๋ชจ๋ฆฌ ๊ตฌ์กฐ (Heap & Stack)

์ž๋ฐ”์—์„œ ๊ฐ์ฒด๋Š” ํž™(Heap)๊ณผ ์Šคํƒ(Stack)์— ์ €์žฅ๋ฉ๋‹ˆ๋‹ค.

๋‚ด๋ถ€ ํด๋ž˜์Šค๊ฐ€ ์–ด๋–ป๊ฒŒ ๋ฉ”๋ชจ๋ฆฌ์— ๋ฐฐ์น˜๋˜๋Š”์ง€ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

๐Ÿ“Œ ๋ฉ”๋ชจ๋ฆฌ ๊ตฌ์กฐ ๊ฐœ๋…

  1. ์™ธ๋ถ€ ํด๋ž˜์Šค(OuterClass)๋Š” ํž™(Heap) ์˜์—ญ์— ์ €์žฅ๋จ
  2. ๋‚ด๋ถ€ ํด๋ž˜์Šค(InnerClass)๋„ ํž™(Heap) ์˜์—ญ์— ์ €์žฅ๋จ
  3. ๋‚ด๋ถ€ ํด๋ž˜์Šค๋Š” ์™ธ๋ถ€ ํด๋ž˜์Šค์˜ ์ฐธ์กฐ๋ฅผ ์•”๋ฌต์ ์œผ๋กœ ํฌํ•จํ•˜๊ณ  ์žˆ์Œ
  4. ์ง€์—ญ(Local) ๋‚ด๋ถ€ ํด๋ž˜์Šค์™€ ์ต๋ช…(Anonymous) ๋‚ด๋ถ€ ํด๋ž˜์Šค๋Š” ๋ฉ”์„œ๋“œ ์‹คํ–‰ ์‹œ ์ƒ์„ฑ๋˜๋ฉฐ, ์ข…๋ฃŒ ์‹œ ์†Œ๋ฉธ๋จ

โœ… 2. ๋‚ด๋ถ€ ํด๋ž˜์Šค ๋ฉ”๋ชจ๋ฆฌ ๊ตฌ์กฐ ์˜ˆ์ œ

๋‹ค์Œ ์ฝ”๋“œ์—์„œ ์™ธ๋ถ€ ํด๋ž˜์Šค์™€ ๋‚ด๋ถ€ ํด๋ž˜์Šค๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ์— ์–ด๋–ป๊ฒŒ ์ €์žฅ๋˜๋Š”์ง€ ๋ถ„์„ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

class Outer {
    private String message = "Hello from Outer!";

    class Inner {
        void display() {
            System.out.println(message);
        }
    }
}

public class Main {
    public static void main(String[] args) {
        Outer outer = new Outer(); // ํž™(Heap)์— ์ €์žฅ๋จ
        Outer.Inner inner = outer.new Inner(); // ํž™(Heap)์— ์ €์žฅ๋จ
        inner.display();
    }
}

๐Ÿ“Œ ๋ฉ”๋ชจ๋ฆฌ ํ๋ฆ„

  1. Outer outer = new Outer();
    • outer ๊ฐ์ฒด๊ฐ€ ํž™(Heap)์— ์ƒ์„ฑ๋จ
  2. Outer.Inner inner = outer.new Inner();
    • inner ๊ฐ์ฒด๊ฐ€ ํž™(Heap)์— ์ƒ์„ฑ๋จ
    • ๋‚ด๋ถ€ ํด๋ž˜์Šค๋Š” ์™ธ๋ถ€ ํด๋ž˜์Šค๋ฅผ ์ฐธ์กฐ(Outer.this)ํ•จ
  3. inner.display(); ์‹คํ–‰
    • ๋‚ด๋ถ€ ํด๋ž˜์Šค๋Š” ์™ธ๋ถ€ ํด๋ž˜์Šค์˜ message ๋ณ€์ˆ˜์— ์ ‘๊ทผ ๊ฐ€๋Šฅ
    • ์™ธ๋ถ€ ํด๋ž˜์Šค ๊ฐ์ฒด(Outer.this)๋ฅผ ์•”๋ฌต์ ์œผ๋กœ ์ €์žฅํ•˜๊ณ  ์žˆ์Œ

โœ… 3. this ํ‚ค์›Œ๋“œ๋ฅผ ํ™œ์šฉํ•œ ๋‚ด๋ถ€ & ์™ธ๋ถ€ ํด๋ž˜์Šค ๊ตฌ๋ถ„

๋‚ด๋ถ€ ํด๋ž˜์Šค์™€ ์™ธ๋ถ€ ํด๋ž˜์Šค์—๋Š” ๋ชจ๋‘ this ํ‚ค์›Œ๋“œ๊ฐ€ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค.

๋•Œ๋•Œ๋กœ ๋‚ด๋ถ€ ํด๋ž˜์Šค์™€ ์™ธ๋ถ€ ํด๋ž˜์Šค์˜ ๋ฉค๋ฒ„ ๋ณ€์ˆ˜๋ฅผ ๊ตฌ๋ถ„ํ•ด์•ผ ํ•  ๋•Œ

๋‹ค์Œ๊ณผ ๊ฐ™์ด this๋ฅผ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

class Outer {
    String message = "Outer Message";

    class Inner {
        String message = "Inner Message";

        void display() {
            System.out.println(message); // ๋‚ด๋ถ€ ํด๋ž˜์Šค์˜ message
            System.out.println(this.message); // ๋‚ด๋ถ€ ํด๋ž˜์Šค์˜ message
            System.out.println(Outer.this.message); // ์™ธ๋ถ€ ํด๋ž˜์Šค์˜ message
        }
    }
}

public class Main {
    public static void main(String[] args) {
        Outer outer = new Outer();
        Outer.Inner inner = outer.new Inner();
        inner.display();
    }
}

๐Ÿ“Œ ์‹คํ–‰ ๊ฒฐ๊ณผ

Inner Message
Inner Message
Outer Message

๐Ÿ’ก ํ•ต์‹ฌ ํฌ์ธํŠธ

  • this.message โ†’ ๋‚ด๋ถ€ ํด๋ž˜์Šค์˜ ๋ฉค๋ฒ„ ๋ณ€์ˆ˜
  • Outer.this.message โ†’ ์™ธ๋ถ€ ํด๋ž˜์Šค์˜ ๋ฉค๋ฒ„ ๋ณ€์ˆ˜

โœ… 4. super ํ‚ค์›Œ๋“œ๋ฅผ ํ™œ์šฉํ•œ ์ƒ์† ๊ด€๊ณ„์—์„œ์˜ ๋‚ด๋ถ€ ํด๋ž˜์Šค ์ ‘๊ทผ

๋‚ด๋ถ€ ํด๋ž˜์Šค๊ฐ€ ์™ธ๋ถ€ ํด๋ž˜์Šค๋ฅผ ์ƒ์†๋ฐ›์„ ๊ฒฝ์šฐ,

super ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์™ธ๋ถ€ ํด๋ž˜์Šค์˜ ๋ฉ”์„œ๋“œ๋‚˜ ๋ณ€์ˆ˜์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ“Œ ์ฝ”๋“œ ์˜ˆ์ œ

class Outer {
    void show() {
        System.out.println("Outer Class Method");
    }

    class Inner extends Outer {
        void show() {
            super.show(); // ์™ธ๋ถ€ ํด๋ž˜์Šค์˜ show() ํ˜ธ์ถœ
            System.out.println("Inner Class Method");
        }
    }
}

public class Main {
    public static void main(String[] args) {
        Outer outer = new Outer();
        Outer.Inner inner = outer.new Inner();
        inner.show();
    }
}

๐Ÿ“Œ ์‹คํ–‰ ๊ฒฐ๊ณผ

Outer Class Method
Inner Class Method

๐Ÿ’ก ํ•ต์‹ฌ ํฌ์ธํŠธ

  • super.show();๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์™ธ๋ถ€ ํด๋ž˜์Šค์˜ ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœ ๊ฐ€๋Šฅ
  • ๋‚ด๋ถ€ ํด๋ž˜์Šค๊ฐ€ ์™ธ๋ถ€ ํด๋ž˜์Šค๋ฅผ ์ƒ์†๋ฐ›์„ ์ˆ˜๋„ ์žˆ์Œ

๐Ÿ“Œ 3๋‹จ๊ณ„ ์ •๋ฆฌ

โœ… ๋‚ด๋ถ€ ํด๋ž˜์Šค๋Š” ๋ฉ”๋ชจ๋ฆฌ์—์„œ ์™ธ๋ถ€ ํด๋ž˜์Šค๋ฅผ ์•”๋ฌต์ ์œผ๋กœ ์ฐธ์กฐํ•˜๊ณ  ์žˆ์Œ (Outer.this ํฌํ•จ)

โœ… this ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋‚ด๋ถ€ & ์™ธ๋ถ€ ํด๋ž˜์Šค์˜ ๋ณ€์ˆ˜๋ฅผ ๊ตฌ๋ถ„ํ•  ์ˆ˜ ์žˆ์Œ

โœ… super ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋‚ด๋ถ€ ํด๋ž˜์Šค์—์„œ ์™ธ๋ถ€ ํด๋ž˜์Šค์˜ ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ์Œ

โœ… ๋‚ด๋ถ€ ํด๋ž˜์Šค๋Š” ์™ธ๋ถ€ ํด๋ž˜์Šค์˜ ๋ชจ๋“  ๋ฉค๋ฒ„์— ์ ‘๊ทผ ๊ฐ€๋Šฅํ•˜์ง€๋งŒ, static ๋‚ด๋ถ€ ํด๋ž˜์Šค๋Š” static ๋ฉค๋ฒ„๋งŒ ์ ‘๊ทผ ๊ฐ€๋Šฅ

๐Ÿ“Œ 4๋‹จ๊ณ„: ๋‚ด๋ถ€ ํด๋ž˜์Šค์˜ ์‹ค์ œ ํ™œ์šฉ ์˜ˆ์ œ

์ด์ œ๊นŒ์ง€ ๋‚ด๋ถ€ ํด๋ž˜์Šค์˜ ๊ฐœ๋…๊ณผ ๊ตฌ์กฐ๋ฅผ ๋ฐฐ์› ๋‹ค๋ฉด,

์ด๋ฒˆ ๋‹จ๊ณ„์—์„œ๋Š” ์‹ค๋ฌด์—์„œ ๋‚ด๋ถ€ ํด๋ž˜์Šค๊ฐ€ ์–ด๋–ป๊ฒŒ ํ™œ์šฉ๋˜๋Š”์ง€ ์‚ดํŽด๋ด…๋‹ˆ๋‹ค.

์‹ค์ œ ํ”„๋กœ์ ํŠธ์—์„œ ๋‚ด๋ถ€ ํด๋ž˜์Šค๊ฐ€ ์™œ ์œ ์šฉํ•œ์ง€, ์–ธ์ œ ์‚ฌ์šฉํ•˜๋ฉด ์ข‹์€์ง€๋ฅผ ์ดํ•ดํ•˜๋Š” ๊ฒƒ์ด ๋ชฉํ‘œ์ž…๋‹ˆ๋‹ค.


โœ… 1. ๋‚ด๋ถ€ ํด๋ž˜์Šค์˜ ์ฃผ์š” ํ™œ์šฉ ์˜ˆ์‹œ

๋‚ด๋ถ€ ํด๋ž˜์Šค๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒฝ์šฐ์— ์œ ์šฉํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚ด๋ถ€ ํด๋ž˜์Šค ํ™œ์šฉ ์‚ฌ๋ก€ ์„ค๋ช…
GUI ํ”„๋กœ๊ทธ๋ž˜๋ฐ (์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ) ๋ฒ„ํŠผ ํด๋ฆญ ๊ฐ™์€ ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ๋ฅผ ์‰ฝ๊ฒŒ ๊ตฌํ˜„
์ปฌ๋ ‰์…˜ ํด๋ž˜์Šค์˜ ๋ฐ˜๋ณต์ž (Iterator ๊ตฌํ˜„) Iterator๋ฅผ ๋‚ด๋ถ€ ํด๋ž˜์Šค๋กœ ๋งŒ๋“ค์–ด ์‚ฌ์šฉ
์บก์Аํ™” ๊ฐ•ํ™” & ๊ฐ€๋…์„ฑ ํ–ฅ์ƒ ํŠน์ • ํด๋ž˜์Šค ๋‚ด๋ถ€์—์„œ๋งŒ ์‚ฌ์šฉ๋  ๊ฒฝ์šฐ ์ฝ”๋“œ ์ •๋ฆฌ
๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ (Runnable) ๊ฐ„๋‹จํ•œ ์Šค๋ ˆ๋“œ๋ฅผ ๋งŒ๋“ค ๋•Œ ์ต๋ช… ๋‚ด๋ถ€ ํด๋ž˜์Šค๋กœ ๊ตฌํ˜„

โœ… 2. GUI ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ ๋‚ด๋ถ€ ํด๋ž˜์Šค ํ™œ์šฉ

โ€œ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ๋ฅผ ๋‚ด๋ถ€ ํด๋ž˜์Šค๋กœ ๊ตฌํ˜„ํ•˜๋ฉด ์ฝ”๋“œ๊ฐ€ ๊ฐ„๊ฒฐํ•ด์ง€๊ณ  ๊ฐ€๋…์„ฑ์ด ์ข‹์•„์ง„๋‹ค!โ€

๐Ÿ“Œ ์˜ˆ์ œ: ๋ฒ„ํŠผ ํด๋ฆญ ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ

import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

class GUIExample {
    private JFrame frame;
    private JButton button;

    GUIExample() {
        frame = new JFrame("๋‚ด๋ถ€ ํด๋ž˜์Šค ์˜ˆ์ œ");
        button = new JButton("ํด๋ฆญํ•˜์„ธ์š”!");

        // ๐Ÿ“Œ ๋‚ด๋ถ€ ํด๋ž˜์Šค ํ™œ์šฉ: ๋ฒ„ํŠผ ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ
        button.addActionListener(new ButtonClickListener());

        frame.add(button);
        frame.setSize(300, 200);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
    }

    // ๐Ÿ“Œ ์ธ์Šคํ„ด์Šค ๋‚ด๋ถ€ ํด๋ž˜์Šค: ๋ฒ„ํŠผ ํด๋ฆญ ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ
    class ButtonClickListener implements ActionListener {
        @Override
        public void actionPerformed(ActionEvent e) {
            System.out.println("๋ฒ„ํŠผ์ด ํด๋ฆญ๋˜์—ˆ์Šต๋‹ˆ๋‹ค!");
        }
    }

    public static void main(String[] args) {
        new GUIExample();
    }
}

๐Ÿ“Œ ์‹คํ–‰ ๊ฒฐ๊ณผ

๐Ÿ’ก ๋‚ด๋ถ€ ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•œ ์ด์œ :

  • ButtonClickListener๊ฐ€ GUIExample๊ณผ ๊ฐ•ํ•œ ์—ฐ๊ด€์„ฑ์ด ์žˆ์Œ
  • ์™ธ๋ถ€์—์„œ ์‚ฌ์šฉํ•  ํ•„์š”๊ฐ€ ์—†๋Š” ํด๋ž˜์Šค์ด๋ฏ€๋กœ ๋‚ด๋ถ€ ํด๋ž˜์Šค๋กœ ์„ ์–ธํ•˜์—ฌ ์บก์Аํ™” ๊ฐ•ํ™”

โœ… 3. ์ปฌ๋ ‰์…˜ ํ”„๋ ˆ์ž„์›Œํฌ์˜ Iterator ํŒจํ„ด

โ€œ๋‚ด๋ถ€ ํด๋ž˜์Šค๋Š” ์ปฌ๋ ‰์…˜ ํ”„๋ ˆ์ž„์›Œํฌ์—์„œ๋„ ํ™œ์šฉ๋œ๋‹ค!โ€

ArrayList ๊ฐ™์€ ์ปฌ๋ ‰์…˜ ํด๋ž˜์Šค๋Š” ๋ฐ˜๋ณต์ž(Iterator)๋ฅผ ๋‚ด๋ถ€ ํด๋ž˜์Šค๋กœ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค.

์ด์œ ๋Š” ๋ฐ˜๋ณต์ž๋Š” ์ปฌ๋ ‰์…˜๊ณผ ๊ฐ•ํ•œ ์—ฐ๊ด€์„ฑ์„ ๊ฐ€์ง€๋ฉฐ, ์™ธ๋ถ€์—์„œ ์ง์ ‘ ์ ‘๊ทผํ•  ํ•„์š”๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

๐Ÿ“Œ ์˜ˆ์ œ: ์ง์ ‘ Iterator ๊ตฌํ˜„ํ•˜๊ธฐ

import java.util.Iterator;

class CustomList<T> implements Iterable<T> {
    private T[] items;
    private int size;

    public CustomList(T[] items) {
        this.items = items;
        this.size = items.length;
    }

    @Override
    public Iterator<T> iterator() {
        return new CustomIterator();
    }

    // ๐Ÿ“Œ ๋‚ด๋ถ€ ํด๋ž˜์Šค: ๋ฐ˜๋ณต์ž ๊ตฌํ˜„
    private class CustomIterator implements Iterator<T> {
        private int index = 0;

        @Override
        public boolean hasNext() {
            return index < size;
        }

        @Override
        public T next() {
            return items[index++];
        }
    }
}

public class Main {
    public static void main(String[] args) {
        CustomList<String> list = new CustomList<>(new String[]{"A", "B", "C"});

        for (String item : list) {
            System.out.println(item);
        }
    }
}

๐Ÿ“Œ ์‹คํ–‰ ๊ฒฐ๊ณผ

A
B
C

๐Ÿ’ก ๋‚ด๋ถ€ ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•œ ์ด์œ :

  • CustomIterator๋Š” CustomList์™€ ๊ฐ•ํ•˜๊ฒŒ ์—ฐ๊ฒฐ๋œ ๊ธฐ๋Šฅ์ด๋ฏ€๋กœ,
  • ์™ธ๋ถ€์—์„œ Iterator๋ฅผ ์ง์ ‘ ์กฐ์ž‘ํ•˜์ง€ ์•Š๋„๋ก ๋‚ด๋ถ€ ํด๋ž˜์Šค๋กœ ๊ตฌํ˜„ํ•˜์—ฌ ์บก์Аํ™”

โœ… 4. ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ ์ต๋ช… ๋‚ด๋ถ€ ํด๋ž˜์Šค ํ™œ์šฉ

โ€œ๊ฐ„๋‹จํ•œ ์Šค๋ ˆ๋“œ ์‹คํ–‰์„ ์œ„ํ•ด ์ต๋ช… ๋‚ด๋ถ€ ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค!โ€

๐Ÿ“Œ ์˜ˆ์ œ: Runnable์„ ์ต๋ช… ๋‚ด๋ถ€ ํด๋ž˜์Šค๋กœ ๊ตฌํ˜„

public class AnonymousThreadExample {
    public static void main(String[] args) {
        // ๐Ÿ“Œ ์ต๋ช… ๋‚ด๋ถ€ ํด๋ž˜์Šค ํ™œ์šฉ: Runnable ๊ตฌํ˜„
        Thread thread = new Thread(new Runnable() {
            @Override
            public void run() {
                for (int i = 1; i <= 5; i++) {
                    System.out.println("์ต๋ช… ๋‚ด๋ถ€ ํด๋ž˜์Šค ์‹คํ–‰ ์ค‘: " + i);
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        });

        thread.start();
    }
}

๐Ÿ“Œ ์‹คํ–‰ ๊ฒฐ๊ณผ

์ต๋ช… ๋‚ด๋ถ€ ํด๋ž˜์Šค ์‹คํ–‰ ์ค‘: 1
์ต๋ช… ๋‚ด๋ถ€ ํด๋ž˜์Šค ์‹คํ–‰ ์ค‘: 2
์ต๋ช… ๋‚ด๋ถ€ ํด๋ž˜์Šค ์‹คํ–‰ ์ค‘: 3
์ต๋ช… ๋‚ด๋ถ€ ํด๋ž˜์Šค ์‹คํ–‰ ์ค‘: 4
์ต๋ช… ๋‚ด๋ถ€ ํด๋ž˜์Šค ์‹คํ–‰ ์ค‘: 5

๐Ÿ’ก ์ต๋ช… ๋‚ด๋ถ€ ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•œ ์ด์œ :

  • Runnable์„ ๋ณ„๋„์˜ ํŒŒ์ผ์ด๋‚˜ ํด๋ž˜์Šค ์—†์ด ํ•œ ๋ฒˆ๋งŒ ์‚ฌ์šฉํ•˜๋ ค๊ณ  ํ•  ๋•Œ ์œ ์šฉ
  • ์ฝ”๋“œ๊ฐ€ ๊ฐ„๊ฒฐํ•ด์ง€๊ณ  ๊ฐ€๋…์„ฑ์ด ์ข‹์•„์ง

๐Ÿ“Œ 4๋‹จ๊ณ„ ์ •๋ฆฌ

โœ… ๋‚ด๋ถ€ ํด๋ž˜์Šค๋Š” ์‹ค์ œ ๊ฐœ๋ฐœ์—์„œ ์ž์ฃผ ์‚ฌ์šฉ๋˜๋ฉฐ, ๋Œ€ํ‘œ์ ์ธ ํ™œ์šฉ ์‚ฌ๋ก€๊ฐ€ ์žˆ๋‹ค.

โœ… GUI ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ๋Š” ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ๋ฅผ ๋‚ด๋ถ€ ํด๋ž˜์Šค๋กœ ๊ตฌํ˜„ํ•˜์—ฌ ์ฝ”๋“œ ๊ฐ€๋…์„ฑ์„ ๋†’์ธ๋‹ค.

โœ… ์ปฌ๋ ‰์…˜ ํ”„๋ ˆ์ž„์›Œํฌ์—์„œ๋Š” Iterator๋ฅผ ๋‚ด๋ถ€ ํด๋ž˜์Šค๋กœ ๊ตฌํ˜„ํ•˜์—ฌ ์บก์Аํ™”๋ฅผ ๊ฐ•ํ™”ํ•œ๋‹ค.

โœ… ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ๋Š” ์ต๋ช… ๋‚ด๋ถ€ ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ฝ”๋“œ๋ฅผ ๊ฐ„๊ฒฐํ•˜๊ฒŒ ๋งŒ๋“ ๋‹ค.


##

๐Ÿ“Œ 5๋‹จ๊ณ„: ๋‚ด๋ถ€ ํด๋ž˜์Šค์˜ ์žฅ์ ๊ณผ ๋‹จ์  & ์‹ค๋ฌด์—์„œ์˜ ์˜ฌ๋ฐ”๋ฅธ ์‚ฌ์šฉ๋ฒ•

๋‚ด๋ถ€ ํด๋ž˜์Šค๋Š” ์ฝ”๋“œ์˜ ์บก์Аํ™”, ๊ฐ€๋…์„ฑ ํ–ฅ์ƒ, ํŽธ๋ฆฌํ•œ ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ ๋“ฑ์˜ ์žฅ์ ์ด ์žˆ์ง€๋งŒ,

์ž˜๋ชป ์‚ฌ์šฉํ•˜๋ฉด ์ฝ”๋“œ ๋ณต์žก๋„ ์ฆ๊ฐ€, ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜ ๋“ฑ์˜ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๋ฒˆ ๋‹จ๊ณ„์—์„œ๋Š” ๋‚ด๋ถ€ ํด๋ž˜์Šค์˜ ์žฅ์ ๊ณผ ๋‹จ์ ์„ ๋ช…ํ™•ํžˆ ์ดํ•ดํ•˜๊ณ ,

์‹ค๋ฌด์—์„œ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ํ•™์Šตํ•ฉ๋‹ˆ๋‹ค. ๐Ÿš€


โœ… 1. ๋‚ด๋ถ€ ํด๋ž˜์Šค์˜ ์žฅ์ 

๋‚ด๋ถ€ ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์–ด๋–ค ์žฅ์ ์ด ์žˆ์„๊นŒ์š”?

์žฅ์  ์„ค๋ช…
์บก์Аํ™”(Encapsulation) ๊ฐ•ํ™” ํŠน์ • ํด๋ž˜์Šค ๋‚ด๋ถ€์—์„œ๋งŒ ์‚ฌ์šฉ๋˜๋Š” ํด๋ž˜์Šค๋ฅผ ์ˆจ๊ธธ ์ˆ˜ ์žˆ์Œ
์ฝ”๋“œ ๊ฐ€๋…์„ฑ ํ–ฅ์ƒ ๊ด€๋ จ๋œ ์ฝ”๋“œ๋ฅผ ํ•˜๋‚˜์˜ ๋…ผ๋ฆฌ์ ์ธ ๋‹จ์œ„๋กœ ๊ทธ๋ฃนํ™” ๊ฐ€๋Šฅ
์™ธ๋ถ€ ํด๋ž˜์Šค์™€์˜ ๊ฐ•ํ•œ ๊ฒฐํ•ฉ ๋‚ด๋ถ€ ํด๋ž˜์Šค๋Š” ์™ธ๋ถ€ ํด๋ž˜์Šค์˜ ๋ฉค๋ฒ„(๋ณ€์ˆ˜, ๋ฉ”์„œ๋“œ)์— ์ž์œ ๋กญ๊ฒŒ ์ ‘๊ทผ ๊ฐ€๋Šฅ
์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ ๊ตฌํ˜„์ด ์šฉ์ด GUI ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ ๋‚ด๋ถ€ ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ๊ฐ€ ๊ฐ„๊ฒฐํ•ด์ง
ํด๋ž˜์Šค ๋„ค์ž„์ŠคํŽ˜์ด์Šค ๊ด€๋ฆฌ ๋ถˆํ•„์š”ํ•œ ํด๋ž˜์Šค๋ฅผ ์™ธ๋ถ€์— ๋…ธ์ถœํ•˜์ง€ ์•Š์•„ ์ฝ”๋“œ ์ •๋ฆฌ๊ฐ€ ์‰ฌ์›Œ์ง

๐Ÿ“Œ ์˜ˆ์ œ: ์บก์Аํ™”๊ฐ€ ๊ฐ•ํ™”๋œ ๋‚ด๋ถ€ ํด๋ž˜์Šค ์‚ฌ์šฉ

class BankAccount {
    private double balance = 1000.0;

    // ๋‚ด๋ถ€ ํด๋ž˜์Šค: ๊ณ„์ขŒ ํŠธ๋žœ์žญ์…˜ ์ฒ˜๋ฆฌ
    private class Transaction {
        void withdraw(double amount) {
            if (amount <= balance) {
                balance -= amount;
                System.out.println(amount + "์›์ด ์ถœ๊ธˆ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ž”์•ก: " + balance);
            } else {
                System.out.println("์ž”์•ก์ด ๋ถ€์กฑํ•ฉ๋‹ˆ๋‹ค.");
            }
        }
    }

    public void withdrawMoney(double amount) {
        Transaction transaction = new Transaction();
        transaction.withdraw(amount);
    }
}

public class Main {
    public static void main(String[] args) {
        BankAccount account = new BankAccount();
        account.withdrawMoney(500); // 500์› ์ถœ๊ธˆ
        account.withdrawMoney(600); // ์ž”์•ก ๋ถ€์กฑ
    }
}

๐Ÿ’ก ๋‚ด๋ถ€ ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•œ ์ด์œ :

  • Transaction ํด๋ž˜์Šค๋Š” BankAccount์—์„œ๋งŒ ์‚ฌ์šฉ๋˜๋ฏ€๋กœ ์บก์Аํ™”๋ฅผ ์œ„ํ•ด ๋‚ด๋ถ€ ํด๋ž˜์Šค๋กœ ์„ ์–ธ
  • ์™ธ๋ถ€์—์„œ Transaction ๊ฐ์ฒด๋ฅผ ์ง์ ‘ ์กฐ์ž‘ํ•˜์ง€ ๋ชปํ•˜๋„๋ก ์ˆจ๊น€

โœ… 2. ๋‚ด๋ถ€ ํด๋ž˜์Šค์˜ ๋‹จ์ 

ํ•˜์ง€๋งŒ, ๋‚ด๋ถ€ ํด๋ž˜์Šค๋ฅผ ์ž˜๋ชป ์‚ฌ์šฉํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋‹จ์ ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹จ์  ์„ค๋ช…
์ฝ”๋“œ ๋ณต์žก๋„ ์ฆ๊ฐ€ ๋‚ด๋ถ€ ํด๋ž˜์Šค๊ฐ€ ๋งŽ์•„์ง€๋ฉด ์ฝ”๋“œ ๊ฐ€๋…์„ฑ์ด ๋–จ์–ด์งˆ ์ˆ˜ ์žˆ์Œ
๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜ ์œ„ํ—˜ ๋‚ด๋ถ€ ํด๋ž˜์Šค๊ฐ€ ์™ธ๋ถ€ ํด๋ž˜์Šค๋ฅผ ์ฐธ์กฐํ•  ๊ฒฝ์šฐ, ์ฐธ์กฐ ํ•ด์ œ๊ฐ€ ์•ˆ ๋˜๋ฉด ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜ ๋ฐœ์ƒ ๊ฐ€๋Šฅ
ํ…Œ์ŠคํŠธ ๋ฐ ์œ ์ง€๋ณด์ˆ˜ ์–ด๋ ค์›€ ๋‚ด๋ถ€ ํด๋ž˜์Šค๋Š” ์™ธ๋ถ€ ํด๋ž˜์Šค์™€ ๊ฐ•ํ•˜๊ฒŒ ๊ฒฐํ•ฉ๋˜์–ด ์žˆ์–ด ๋‹จ์œ„ ํ…Œ์ŠคํŠธ๊ฐ€ ์–ด๋ ต๋‹ค
ํด๋ž˜์Šค ํฌ๊ธฐ ์ฆ๊ฐ€ ๋‚ด๋ถ€ ํด๋ž˜์Šค๊ฐ€ ๋งŽ์œผ๋ฉด ๋ฐ”์ดํŠธ์ฝ”๋“œ๊ฐ€ ์ฆ๊ฐ€ํ•˜์—ฌ ์ตœ์ ํ™”์— ์˜ํ–ฅ์„ ๋ฏธ์น  ์ˆ˜ ์žˆ์Œ

๐Ÿ“Œ ์˜ˆ์ œ: ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๊ฐ€ ๋ฐœ์ƒํ•  ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋Š” ์ฝ”๋“œ

class Outer {
    private String data = "์ค‘์š”ํ•œ ๋ฐ์ดํ„ฐ";

    class Inner {
        void showData() {
            System.out.println(data); // Outer ํด๋ž˜์Šค๋ฅผ ์ฐธ์กฐ (๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜ ์œ„ํ—˜)
        }
    }
}

public class Main {
    public static void main(String[] args) {
        Outer outer = new Outer();
        Outer.Inner inner = outer.new Inner();
        inner.showData();
    }
}

๐Ÿ’ก ๋ฌธ์ œ์ :

  • ๋‚ด๋ถ€ ํด๋ž˜์Šค Inner๋Š” ์™ธ๋ถ€ ํด๋ž˜์Šค Outer๋ฅผ ์•”๋ฌต์ ์œผ๋กœ ์ฐธ์กฐํ•จ (Outer.this)
  • ์™ธ๋ถ€ ํด๋ž˜์Šค๊ฐ€ ํ•ด์ œ๋˜์ง€ ์•Š๋Š” ํ•œ, ๋‚ด๋ถ€ ํด๋ž˜์Šค๋„ GC(๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜)๊ฐ€ ๋ถˆ๊ฐ€๋Šฅํ•˜์—ฌ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜ ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ์Œ

โœ… ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•: static ๋‚ด๋ถ€ ํด๋ž˜์Šค ์‚ฌ์šฉ

class Outer {
    private static String data = "์ค‘์š”ํ•œ ๋ฐ์ดํ„ฐ";

    static class Inner {
        void showData() {
            System.out.println(data); // static ๋ณ€์ˆ˜๋งŒ ์ฐธ์กฐ (๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜ ๋ฐฉ์ง€)
        }
    }
}

public class Main {
    public static void main(String[] args) {
        Outer.Inner inner = new Outer.Inner(); // ์™ธ๋ถ€ ํด๋ž˜์Šค ๊ฐ์ฒด ์ƒ์„ฑ ์—†์ด ์‚ฌ์šฉ ๊ฐ€๋Šฅ
        inner.showData();
    }
}

โœ… 3. ์‹ค๋ฌด์—์„œ ๋‚ด๋ถ€ ํด๋ž˜์Šค๋ฅผ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•

๊ทธ๋ ‡๋‹ค๋ฉด ๋‚ด๋ถ€ ํด๋ž˜์Šค๋ฅผ ์–ธ์ œ, ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ•ด์•ผ ํ• ๊นŒ์š”?

๐Ÿ“Œ ์˜ฌ๋ฐ”๋ฅธ ์‚ฌ์šฉ ๊ธฐ์ค€

โœ… ๋‚ด๋ถ€ ํด๋ž˜์Šค๊ฐ€ ์™ธ๋ถ€ ํด๋ž˜์Šค์™€ ๊ฐ•ํ•˜๊ฒŒ ๊ฒฐํ•ฉ๋œ ๊ฒฝ์šฐ ์‚ฌ์šฉ

โœ… ๋ถˆํ•„์š”ํ•œ ์ฝ”๋“œ ๋…ธ์ถœ์„ ๋ง‰๊ธฐ ์œ„ํ•ด ๋‚ด๋ถ€ ํด๋ž˜์Šค๋ฅผ ํ™œ์šฉ (์บก์Аํ™” ๊ฐ•ํ™”)

โœ… ๋‚ด๋ถ€ ํด๋ž˜์Šค๊ฐ€ ๋„ˆ๋ฌด ๋งŽ์•„์ง€๋ฉด ์ฝ”๋“œ ๋ณต์žก๋„๊ฐ€ ์ฆ๊ฐ€ํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ฃผ์˜

โœ… ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด static ๋‚ด๋ถ€ ํด๋ž˜์Šค๋ฅผ ๊ณ ๋ ค

โœ… ๋‹จ์ˆœํ•œ ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ๋Š” ์ต๋ช… ๋‚ด๋ถ€ ํด๋ž˜์Šค๋ฅผ ํ™œ์šฉํ•˜์—ฌ ์ฝ”๋“œ ๊ฐ„๊ฒฐํ™”


๐Ÿ“Œ 5๋‹จ๊ณ„ ์ •๋ฆฌ

โœ… ๋‚ด๋ถ€ ํด๋ž˜์Šค๋Š” ์บก์Аํ™”๋ฅผ ๊ฐ•ํ™”ํ•˜๊ณ , ์ฝ”๋“œ ๊ฐ€๋…์„ฑ์„ ๋†’์ด๋Š” ์—ญํ• ์„ ํ•œ๋‹ค.

โœ… ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ, ์ปฌ๋ ‰์…˜์˜ ๋ฐ˜๋ณต์ž, ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ ํ™˜๊ฒฝ ๋“ฑ์—์„œ ์œ ์šฉํ•˜๊ฒŒ ํ™œ์šฉ๋œ๋‹ค.

โœ… ํ•˜์ง€๋งŒ ์ž˜๋ชป ์‚ฌ์šฉํ•˜๋ฉด ์ฝ”๋“œ ๋ณต์žก๋„ ์ฆ๊ฐ€ & ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜ ๋“ฑ์˜ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.

โœ… ์™ธ๋ถ€ ํด๋ž˜์Šค์™€ ๊ฐ•ํ•˜๊ฒŒ ๊ฒฐํ•ฉ๋œ ๊ฒฝ์šฐ์—๋งŒ ๋‚ด๋ถ€ ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋ฉฐ, ํ•„์š”ํ•˜์ง€ ์•Š์œผ๋ฉด static ๋‚ด๋ถ€ ํด๋ž˜์Šค๋ฅผ ๊ณ ๋ คํ•ด์•ผ ํ•œ๋‹ค.


##

๐Ÿ“Œ 6๋‹จ๊ณ„: ๋‚ด๋ถ€ ํด๋ž˜์Šค์™€ ๋žŒ๋‹ค์‹(๋žŒ๋‹ค ํ‘œํ˜„์‹)์˜ ๊ด€๊ณ„

๋‚ด๋ถ€ ํด๋ž˜์Šค์™€ ๋žŒ๋‹ค์‹(Lambda Expression) ์€ ๋งค์šฐ ๋ฐ€์ ‘ํ•œ ๊ด€๊ณ„๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

ํŠนํžˆ ์ต๋ช… ๋‚ด๋ถ€ ํด๋ž˜์Šค๋Š” ๋žŒ๋‹ค์‹์œผ๋กœ ๋Œ€์ฒด๋  ์ˆ˜ ์žˆ์œผ๋ฉฐ,

๋žŒ๋‹ค์‹์„ ํ™œ์šฉํ•˜๋ฉด ์ฝ”๋“œ๋ฅผ ํ›จ์”ฌ ๊ฐ„๊ฒฐํ•˜๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ๋‹จ๊ณ„์—์„œ๋Š” ์ต๋ช… ๋‚ด๋ถ€ ํด๋ž˜์Šค์™€ ๋žŒ๋‹ค์‹์˜ ์ฐจ์ด์ , ๋ณ€ํ™˜ ๊ณผ์ •, ์žฅ๋‹จ์ ์„ ํ•™์Šตํ•ฉ๋‹ˆ๋‹ค. ๐Ÿš€


โœ… 1. ์ต๋ช… ๋‚ด๋ถ€ ํด๋ž˜์Šค vs ๋žŒ๋‹ค์‹

๋น„๊ต ํ•ญ๋ชฉ ์ต๋ช… ๋‚ด๋ถ€ ํด๋ž˜์Šค ๋žŒ๋‹ค์‹ (Lambda Expression)
์ฝ”๋“œ ๊ธธ์ด ๊ธธ๊ณ  ๋ณต์žกํ•จ ์งง๊ณ  ๊ฐ„๊ฒฐํ•จ
this ํ‚ค์›Œ๋“œ ์ต๋ช… ๋‚ด๋ถ€ ํด๋ž˜์Šค ์ž์ฒด๋ฅผ ๊ฐ€๋ฆฌํ‚ด ๋žŒ๋‹ค์‹์ด ํฌํ•จ๋œ ์™ธ๋ถ€ ํด๋ž˜์Šค๋ฅผ ๊ฐ€๋ฆฌํ‚ด
๊ฐ€๋…์„ฑ ์ฝ”๋“œ๊ฐ€ ๊ธธ์–ด์ง€๋ฉด ์ฝ๊ธฐ ์–ด๋ ค์›€ ์ง๊ด€์ ์ด๊ณ  ๊ฐ„๊ฒฐ
์„ฑ๋Šฅ ํด๋ž˜์Šค ํŒŒ์ผ์ด ์ƒ์„ฑ๋จ (ํด๋ž˜์Šค ๋กœ๋”ฉ ํ•„์š”) ๋ฐ”์ดํŠธ์ฝ”๋“œ ์ˆ˜์ค€์—์„œ ์ตœ์ ํ™”
์‚ฌ์šฉ ๊ฐ€๋Šฅ ๋Œ€์ƒ ์ธํ„ฐํŽ˜์ด์Šค & ์ถ”์ƒ ํด๋ž˜์Šค ๋ชจ๋‘ ๊ตฌํ˜„ ๊ฐ€๋Šฅ ์ธํ„ฐํŽ˜์ด์Šค(์ถ”์ƒ ๋ฉ”์„œ๋“œ๊ฐ€ 1๊ฐœ)๋งŒ ๊ฐ€๋Šฅ

๐Ÿ’ก ๊ฒฐ๋ก :

  • ๋žŒ๋‹ค์‹์€ ์˜ค์ง โ€œํ•จ์ˆ˜ํ˜• ์ธํ„ฐํŽ˜์ด์Šค(๋ฉ”์„œ๋“œ๊ฐ€ 1๊ฐœ๋งŒ ์žˆ๋Š” ์ธํ„ฐํŽ˜์ด์Šค)โ€์—์„œ๋งŒ ์‚ฌ์šฉ ๊ฐ€๋Šฅ
  • ์ต๋ช… ๋‚ด๋ถ€ ํด๋ž˜์Šค๋Š” ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋ฉ”์„œ๋“œ๋ฅผ ๊ฐ€์ง„ ํด๋ž˜์Šค๋‚˜ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•  ๋•Œ ํ•„์š”

โœ… 2. ์ต๋ช… ๋‚ด๋ถ€ ํด๋ž˜์Šค โ†’ ๋žŒ๋‹ค์‹ ๋ณ€ํ™˜ ๊ณผ์ •

๐Ÿ“Œ ์˜ˆ์ œ: ์ต๋ช… ๋‚ด๋ถ€ ํด๋ž˜์Šค๋กœ Runnable ๊ตฌํ˜„

public class AnonymousClassExample {
    public static void main(String[] args) {
        // ์ต๋ช… ๋‚ด๋ถ€ ํด๋ž˜์Šค ์‚ฌ์šฉ
        Runnable runnable = new Runnable() {
            @Override
            public void run() {
                System.out.println("์ต๋ช… ๋‚ด๋ถ€ ํด๋ž˜์Šค ์‹คํ–‰!");
            }
        };
        runnable.run();
    }
}

๐Ÿ“Œ ๋žŒ๋‹ค์‹์œผ๋กœ ๋ณ€ํ™˜

public class LambdaExample {
    public static void main(String[] args) {
        // ๋žŒ๋‹ค์‹ ์‚ฌ์šฉ (๋” ๊ฐ„๊ฒฐํ•ด์ง!)
        Runnable runnable = () -> System.out.println("๋žŒ๋‹ค์‹ ์‹คํ–‰!");
        runnable.run();
    }
}

๐Ÿ“Œ ์‹คํ–‰ ๊ฒฐ๊ณผ

์ต๋ช… ๋‚ด๋ถ€ ํด๋ž˜์Šค ์‹คํ–‰!
๋žŒ๋‹ค์‹ ์‹คํ–‰!

๐Ÿ’ก ๋ณ€ํ™˜ ๊ณผ์ •

  • new ์ธํ„ฐํŽ˜์ด์Šค() { ... } โ†’ () -> { ... } ๋กœ ๋ณ€๊ฒฝ
  • ์ž๋™์œผ๋กœ @Override ์ฒ˜๋ฆฌ๋˜๋ฏ€๋กœ ๋ฉ”์„œ๋“œ ์ด๋ฆ„์„ ๋”ฐ๋กœ ์ง€์ •ํ•  ํ•„์š” ์—†์Œ

โœ… 3. this ํ‚ค์›Œ๋“œ ์ฐจ์ด์ 

์ต๋ช… ๋‚ด๋ถ€ ํด๋ž˜์Šค์™€ ๋žŒ๋‹ค์‹์—์„œ this ํ‚ค์›Œ๋“œ๋Š” ์„œ๋กœ ๋‹ค๋ฅด๊ฒŒ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ“Œ ์ต๋ช… ๋‚ด๋ถ€ ํด๋ž˜์Šค์—์„œ์˜ this

class Outer {
    String message = "Outer Class";

    void test() {
        Runnable r = new Runnable() {
            String message = "Anonymous Class";

            @Override
            public void run() {
                System.out.println(this.message); // ์ต๋ช… ๋‚ด๋ถ€ ํด๋ž˜์Šค์˜ message ์ถœ๋ ฅ
            }
        };
        r.run();
    }
}

public class Main {
    public static void main(String[] args) {
        new Outer().test();
    }
}

๐Ÿ“Œ ์‹คํ–‰ ๊ฒฐ๊ณผ

Anonymous Class

๐Ÿ’ก ์ต๋ช… ๋‚ด๋ถ€ ํด๋ž˜์Šค์—์„œ๋Š” this๊ฐ€ ์ต๋ช… ํด๋ž˜์Šค ์ž์ฒด๋ฅผ ๊ฐ€๋ฆฌํ‚ด


๐Ÿ“Œ ๋žŒ๋‹ค์‹์—์„œ์˜ this

class Outer {
    String message = "Outer Class";

    void test() {
        Runnable r = () -> {
            System.out.println(this.message); // Outer ํด๋ž˜์Šค์˜ message ์ถœ๋ ฅ
        };
        r.run();
    }
}

public class Main {
    public static void main(String[] args) {
        new Outer().test();
    }
}

๐Ÿ“Œ ์‹คํ–‰ ๊ฒฐ๊ณผ

Outer Class

๐Ÿ’ก ๋žŒ๋‹ค์‹์—์„œ๋Š” this๊ฐ€ ์™ธ๋ถ€ ํด๋ž˜์Šค(Outer)๋ฅผ ๊ฐ€๋ฆฌํ‚ด


โœ… 4. ๋žŒ๋‹ค์‹์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ

๋žŒ๋‹ค์‹์€ โ€œํ•จ์ˆ˜ํ˜• ์ธํ„ฐํŽ˜์ด์Šค(์ถ”์ƒ ๋ฉ”์„œ๋“œ๊ฐ€ 1๊ฐœ๋งŒ ์žˆ๋Š” ์ธํ„ฐํŽ˜์ด์Šค)โ€์—์„œ๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฆ‰, ์ธํ„ฐํŽ˜์ด์Šค์— 2๊ฐœ ์ด์ƒ์˜ ๋ฉ”์„œ๋“œ๊ฐ€ ์žˆ๋‹ค๋ฉด ๋žŒ๋‹ค์‹์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

๐Ÿ“Œ ์˜ˆ์ œ: ๋žŒ๋‹ค์‹์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ

interface MultiMethodInterface {
    void method1();
    void method2();
}

// โŒ ์ปดํŒŒ์ผ ์˜ค๋ฅ˜! (๋žŒ๋‹ค์‹์€ ์˜ค์ง ํ•˜๋‚˜์˜ ๋ฉ”์„œ๋“œ๋งŒ ์ง€์›)
MultiMethodInterface obj = () -> System.out.println("Hello");

๐Ÿ’ก ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•:

  • ์ต๋ช… ๋‚ด๋ถ€ ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•จ
  • ๋˜๋Š” ํ•จ์ˆ˜ํ˜• ์ธํ„ฐํŽ˜์ด์Šค๋กœ ๋ณ€๊ฒฝํ•˜์—ฌ ๋‹จ์ผ ๋ฉ”์„œ๋“œ๋งŒ ๋‚จ๊น€

๐Ÿ“Œ 6๋‹จ๊ณ„ ์ •๋ฆฌ

โœ… ์ต๋ช… ๋‚ด๋ถ€ ํด๋ž˜์Šค์™€ ๋žŒ๋‹ค์‹์€ ์œ ์‚ฌํ•˜์ง€๋งŒ, ๋žŒ๋‹ค์‹์ด ๋” ๊ฐ„๊ฒฐํ•˜๊ณ  ์ตœ์ ํ™”๋จ

โœ… ๋žŒ๋‹ค์‹์€ โ€œํ•จ์ˆ˜ํ˜• ์ธํ„ฐํŽ˜์ด์Šคโ€์—์„œ๋งŒ ์‚ฌ์šฉ ๊ฐ€๋Šฅ

โœ… ์ต๋ช… ๋‚ด๋ถ€ ํด๋ž˜์Šค์—์„œ๋Š” this๊ฐ€ ์ต๋ช… ํด๋ž˜์Šค ์ž์‹ ์„ ๊ฐ€๋ฆฌํ‚ค์ง€๋งŒ, ๋žŒ๋‹ค์‹์—์„œ๋Š” ์™ธ๋ถ€ ํด๋ž˜์Šค๋ฅผ ๊ฐ€๋ฆฌํ‚ด

โœ… ๋ฉ”์„œ๋“œ๊ฐ€ 2๊ฐœ ์ด์ƒ์ธ ์ธํ„ฐํŽ˜์ด์Šค๋Š” ๋žŒ๋‹ค์‹์œผ๋กœ ๋ณ€ํ™˜ํ•  ์ˆ˜ ์—†์Œ


##

๐Ÿ“Œ 7๋‹จ๊ณ„: ๋‚ด๋ถ€ ํด๋ž˜์Šค ๊ด€๋ จ ๊ธฐ์ˆ  ๋ฉด์ ‘ ์งˆ๋ฌธ & ์‹ค๋ฌด ์ตœ์ ํ™” ๋ฐฉ๋ฒ•

๋งˆ์ง€๋ง‰ ๋‹จ๊ณ„์—์„œ๋Š” ๋‚ด๋ถ€ ํด๋ž˜์Šค์™€ ๊ด€๋ จ๋œ ๊ธฐ์ˆ  ๋ฉด์ ‘ ์งˆ๋ฌธ๊ณผ ์‹ค๋ฌด ์ตœ์ ํ™” ๋ฐฉ๋ฒ•์„ ํ•™์Šตํ•ฉ๋‹ˆ๋‹ค.

๋‚ด๋ถ€ ํด๋ž˜์Šค๋ฅผ ์–ธ์ œ, ์–ด๋–ป๊ฒŒ ํ™œ์šฉํ•˜๋ฉด ์ข‹์€์ง€์™€ ์ž์ฃผ ๋ฌป๋Š” ๋ฉด์ ‘ ์งˆ๋ฌธ์„ ์ •๋ฆฌํ–ˆ์Šต๋‹ˆ๋‹ค.


โœ… 1. ๋‚ด๋ถ€ ํด๋ž˜์Šค ๊ด€๋ จ ๊ธฐ์ˆ  ๋ฉด์ ‘ ์งˆ๋ฌธ

๋‚ด๋ถ€ ํด๋ž˜์Šค๋Š” ์ž๋ฐ”์˜ ๊ฐ์ฒด์ง€ํ–ฅ ๊ฐœ๋…๊ณผ ์บก์Аํ™”์™€ ๊ด€๋ จ์ด ๊นŠ๊ธฐ ๋•Œ๋ฌธ์—

๊ธฐ์ˆ  ๋ฉด์ ‘์—์„œ ์ž์ฃผ ๋“ฑ์žฅํ•˜๋Š” ์ฃผ์ œ์ž…๋‹ˆ๋‹ค.

๐Ÿ“Œ ๋ฉด์ ‘ ์งˆ๋ฌธ & ๋‹ต๋ณ€ ์˜ˆ์‹œ

Q1. ๋‚ด๋ถ€ ํด๋ž˜์Šค(Inner Class)๋ž€ ๋ฌด์—‡์ด๋ฉฐ, ์™œ ์‚ฌ์šฉํ•˜๋‚˜์š”?

โœ… ๋‹ต๋ณ€:

๋‚ด๋ถ€ ํด๋ž˜์Šค๋Š” ํด๋ž˜์Šค ๋‚ด๋ถ€์— ์ •์˜๋œ ๋˜ ๋‹ค๋ฅธ ํด๋ž˜์Šค์ž…๋‹ˆ๋‹ค.

ํŠน์ • ํด๋ž˜์Šค ๋‚ด๋ถ€์—์„œ๋งŒ ์‚ฌ์šฉ๋˜๋Š” ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์–ด ์บก์Аํ™”๋ฅผ ๊ฐ•ํ™”ํ•˜๊ณ ,

์ฝ”๋“œ ๊ฐ€๋…์„ฑ์„ ๋†’์ด๋Š” ์žฅ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

ํŠนํžˆ GUI ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ, ์ปฌ๋ ‰์…˜ ๋ฐ˜๋ณต์ž(Iterator), ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ ๋“ฑ์—์„œ ์ž์ฃผ ํ™œ์šฉ๋ฉ๋‹ˆ๋‹ค.


Q2. ๋‚ด๋ถ€ ํด๋ž˜์Šค์˜ ์ข…๋ฅ˜๋ฅผ ์„ค๋ช…ํ•˜๊ณ  ์ฐจ์ด์ ์„ ๋งํ•ด์ฃผ์„ธ์š”.

โœ… ๋‹ต๋ณ€:

๋‚ด๋ถ€ ํด๋ž˜์Šค์—๋Š” 4๊ฐ€์ง€ ์ข…๋ฅ˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

  1. ์ธ์Šคํ„ด์Šค ๋‚ด๋ถ€ ํด๋ž˜์Šค: ์™ธ๋ถ€ ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ํ†ตํ•ด ์ ‘๊ทผ ๊ฐ€๋Šฅ
  2. ์ •์ (static) ๋‚ด๋ถ€ ํด๋ž˜์Šค: ์™ธ๋ถ€ ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค ์—†์ด ์‚ฌ์šฉ ๊ฐ€๋Šฅ (static ๋ฉค๋ฒ„๋งŒ ์ ‘๊ทผ ๊ฐ€๋Šฅ)
  3. ์ง€์—ญ(Local) ๋‚ด๋ถ€ ํด๋ž˜์Šค: ํŠน์ • ๋ฉ”์„œ๋“œ ๋‚ด๋ถ€์—์„œ๋งŒ ์‚ฌ์šฉ๋จ
  4. ์ต๋ช…(Anonymous) ๋‚ด๋ถ€ ํด๋ž˜์Šค: ํ•œ ๋ฒˆ๋งŒ ์‚ฌ์šฉ๋˜๋Š” ๋ฌด๋ช… ํด๋ž˜์Šค (์ฃผ๋กœ ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ์— ์‚ฌ์šฉ)

โœ… ์ถ”๊ฐ€ ์งˆ๋ฌธ:

Q: ์ •์  ๋‚ด๋ถ€ ํด๋ž˜์Šค์™€ ์ผ๋ฐ˜ ๋‚ด๋ถ€ ํด๋ž˜์Šค์˜ ์ฐจ์ด๋Š”?

  • ์ •์  ๋‚ด๋ถ€ ํด๋ž˜์Šค๋Š” ์™ธ๋ถ€ ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค ์—†์ด ์‚ฌ์šฉ ๊ฐ€๋Šฅ
  • ์ผ๋ฐ˜ ๋‚ด๋ถ€ ํด๋ž˜์Šค๋Š” ์™ธ๋ถ€ ํด๋ž˜์Šค์˜ ๊ฐ์ฒด๊ฐ€ ์žˆ์–ด์•ผ ์‚ฌ์šฉ ๊ฐ€๋Šฅ

Q3. ๋‚ด๋ถ€ ํด๋ž˜์Šค ์‚ฌ์šฉ ์‹œ ์ฃผ์˜ํ•  ์ ์€?

โœ… ๋‹ต๋ณ€:

๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜ ๊ฐ€๋Šฅ์„ฑ: ๋‚ด๋ถ€ ํด๋ž˜์Šค๋Š” ์™ธ๋ถ€ ํด๋ž˜์Šค์˜ ์ฐธ์กฐ๋ฅผ ์œ ์ง€ํ•˜๋ฏ€๋กœ,์™ธ๋ถ€ ํด๋ž˜์Šค๊ฐ€ ํ•ด์ œ๋˜์ง€ ์•Š์œผ๋ฉด GC(๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜)๊ฐ€ ๋ถˆ๊ฐ€๋Šฅํ•˜์—ฌ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.์ฝ”๋“œ ๋ณต์žก๋„ ์ฆ๊ฐ€: ๋‚ด๋ถ€ ํด๋ž˜์Šค๋ฅผ ๋งŽ์ด ์‚ฌ์šฉํ•˜๋ฉด ๊ฐ€๋…์„ฑ์ด ๋‚ฎ์•„์งˆ ์ˆ˜ ์žˆ์Œ.ํด๋ž˜์Šค ํฌ๊ธฐ ์ฆ๊ฐ€: ๋‚ด๋ถ€ ํด๋ž˜์Šค๋Š” ๋ฐ”์ดํŠธ์ฝ”๋“œ๋ฅผ ์ฆ๊ฐ€์‹œ์ผœ ํด๋ž˜์Šค ๋กœ๋”ฉ ์„ฑ๋Šฅ์— ์˜ํ–ฅ์„ ์ค„ ์ˆ˜ ์žˆ์Œ.

โœ… ์ถ”๊ฐ€ ์งˆ๋ฌธ:

Q: ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๋ฅผ ๋ฐฉ์ง€ํ•˜๋Š” ๋ฐฉ๋ฒ•์€?

  • static ๋‚ด๋ถ€ ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ถˆํ•„์š”ํ•œ ์™ธ๋ถ€ ํด๋ž˜์Šค ์ฐธ์กฐ๋ฅผ ์ œ๊ฑฐ
  • WeakReference๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋‚ด๋ถ€ ํด๋ž˜์Šค์˜ ์ฐธ์กฐ๋ฅผ ์•ฝํ•˜๊ฒŒ ์œ ์ง€

Q4. ์ต๋ช… ๋‚ด๋ถ€ ํด๋ž˜์Šค์™€ ๋žŒ๋‹ค์‹์˜ ์ฐจ์ด๋Š”?

โœ… ๋‹ต๋ณ€:

์ต๋ช… ๋‚ด๋ถ€ ํด๋ž˜์Šค๋Š” ์ธํ„ฐํŽ˜์ด์Šค ๋˜๋Š” ์ถ”์ƒ ํด๋ž˜์Šค๋ฅผ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ,๋žŒ๋‹ค์‹์€ ์˜ค์ง โ€œํ•จ์ˆ˜ํ˜• ์ธํ„ฐํŽ˜์ด์Šคโ€ (๋ฉ”์„œ๋“œ 1๊ฐœ์งœ๋ฆฌ ์ธํ„ฐํŽ˜์ด์Šค)์—์„œ๋งŒ ์‚ฌ์šฉ ๊ฐ€๋Šฅ์ต๋ช… ๋‚ด๋ถ€ ํด๋ž˜์Šค์—์„œ this๋Š” ์ž๊ธฐ ์ž์‹ (์ต๋ช… ํด๋ž˜์Šค)์„ ์ฐธ์กฐ,๋žŒ๋‹ค์‹์—์„œ this๋Š” ์™ธ๋ถ€ ํด๋ž˜์Šค๋ฅผ ์ฐธ์กฐ

โœ… ์ถ”๊ฐ€ ์งˆ๋ฌธ:

Q: ๋žŒ๋‹ค์‹์œผ๋กœ ๋ณ€ํ™˜ํ•  ์ˆ˜ ์—†๋Š” ์ต๋ช… ๋‚ด๋ถ€ ํด๋ž˜์Šค์˜ ์˜ˆ์‹œ๋Š”?

  • ์ธํ„ฐํŽ˜์ด์Šค์— 2๊ฐœ ์ด์ƒ์˜ ์ถ”์ƒ ๋ฉ”์„œ๋“œ๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ (๋žŒ๋‹ค์‹์€ ์‚ฌ์šฉ ๋ถˆ๊ฐ€)
  • ๊ธฐ์กด ํด๋ž˜์Šค(์ถ”์ƒ ํด๋ž˜์Šค X)๋ฅผ ์ƒ์†ํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ (๋žŒ๋‹ค์‹์€ ์ธํ„ฐํŽ˜์ด์Šค๋งŒ ๊ฐ€๋Šฅ)

โœ… 2. ์‹ค๋ฌด์—์„œ ๋‚ด๋ถ€ ํด๋ž˜์Šค๋ฅผ ์ตœ์ ํ™”ํ•˜๋Š” ๋ฐฉ๋ฒ•

๋‚ด๋ถ€ ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ์„ฑ๋Šฅ๊ณผ ์œ ์ง€๋ณด์ˆ˜๋ฅผ ๊ณ ๋ คํ•œ ์ตœ์ ํ™” ๋ฐฉ๋ฒ•์„ ์ •๋ฆฌํ–ˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ“Œ 1. ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด static ๋‚ด๋ถ€ ํด๋ž˜์Šค ์‚ฌ์šฉ

์ผ๋ฐ˜ ๋‚ด๋ถ€ ํด๋ž˜์Šค๋Š” ์™ธ๋ถ€ ํด๋ž˜์Šค๋ฅผ ์•”๋ฌต์ ์œผ๋กœ ์ฐธ์กฐํ•˜๊ธฐ ๋•Œ๋ฌธ์—

static ๋‚ด๋ถ€ ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ถˆํ•„์š”ํ•œ ์ฐธ์กฐ๋ฅผ ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

โœ… ์ž˜๋ชป๋œ ์˜ˆ์‹œ (๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜ ๋ฐœ์ƒ ๊ฐ€๋Šฅ)

class Outer {
    private String data = "์ค‘์š”ํ•œ ๋ฐ์ดํ„ฐ";

    class Inner {
        void show() {
            System.out.println(data); // Outer.this๋ฅผ ์•”๋ฌต์ ์œผ๋กœ ์ฐธ์กฐ (GC ๋ถˆ๊ฐ€๋Šฅ)
        }
    }
}

โœ… ์˜ฌ๋ฐ”๋ฅธ ์˜ˆ์‹œ (static ๋‚ด๋ถ€ ํด๋ž˜์Šค ์‚ฌ์šฉ)

class Outer {
    private static String data = "์ค‘์š”ํ•œ ๋ฐ์ดํ„ฐ";

    static class Inner {
        void show() {
            System.out.println(data); // static ๋ณ€์ˆ˜๋งŒ ์ ‘๊ทผ (๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜ ๋ฐฉ์ง€)
        }
    }
}

๐Ÿ’ก static ๋‚ด๋ถ€ ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์™ธ๋ถ€ ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค์™€ ๋…๋ฆฝ์ ์œผ๋กœ ์กด์žฌํ•˜๋ฏ€๋กœ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๊ฐ€ ์‚ฌ๋ผ์ง.


๐Ÿ“Œ 2. ๋„ˆ๋ฌด ๊นŠ์€ ์ค‘์ฒฉ ํด๋ž˜์Šค ์‚ฌ์šฉ ๊ธˆ์ง€ (๊ฐ€๋…์„ฑ ๋ฌธ์ œ)

๋‚ด๋ถ€ ํด๋ž˜์Šค๋ฅผ ๋„ˆ๋ฌด ๋งŽ์ด ์‚ฌ์šฉํ•˜๋ฉด ์ฝ”๋“œ ๊ฐ€๋…์„ฑ์ด ๋–จ์–ด์ง€๊ณ  ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ์–ด๋ ค์›Œ์งˆ ์ˆ˜ ์žˆ์Œ

3๋‹จ๊ณ„ ์ด์ƒ์˜ ๋‚ด๋ถ€ ํด๋ž˜์Šค๋Š” ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

โœ… ์ž˜๋ชป๋œ ์˜ˆ์‹œ (๋„ˆ๋ฌด ๋งŽ์€ ์ค‘์ฒฉ ํด๋ž˜์Šค)

class A {
    class B {
        class C {
            void method() {
                System.out.println("๋„ˆ๋ฌด ๊นŠ์€ ์ค‘์ฒฉ ํด๋ž˜์Šค!");
            }
        }
    }
}

โœ… ์˜ฌ๋ฐ”๋ฅธ ์˜ˆ์‹œ (ํด๋ž˜์Šค๋ฅผ ๋ถ„๋ฆฌํ•˜์—ฌ ์‚ฌ์šฉ)

class C {
    void method() {
        System.out.println("ํด๋ž˜์Šค๋ฅผ ๋ถ„๋ฆฌํ•˜์—ฌ ๊ฐ€๋…์„ฑ ํ–ฅ์ƒ!");
    }
}

๐Ÿ’ก ํด๋ž˜์Šค๊ฐ€ ๋„ˆ๋ฌด ๊นŠ์–ด์ง€๋ฉด ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ์–ด๋ ค์›Œ์ง€๋ฏ€๋กœ, ๋…๋ฆฝ๋œ ํด๋ž˜์Šค๋กœ ๋ถ„๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Œ.


๐Ÿ“Œ 3. ์ต๋ช… ๋‚ด๋ถ€ ํด๋ž˜์Šค ๋Œ€์‹  ๋žŒ๋‹ค์‹์„ ํ™œ์šฉํ•˜์—ฌ ์ฝ”๋“œ ์ตœ์ ํ™”

์ต๋ช… ๋‚ด๋ถ€ ํด๋ž˜์Šค๋Š” ๊ฐ€๋Šฅํ•˜๋ฉด ๋žŒ๋‹ค์‹์œผ๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ์ฝ”๋“œ๋ฅผ ๊ฐ„๊ฒฐํ•˜๊ฒŒ ์œ ์ง€

โœ… ์ž˜๋ชป๋œ ์˜ˆ์‹œ (์ต๋ช… ๋‚ด๋ถ€ ํด๋ž˜์Šค ์‚ฌ์šฉ)

Runnable r = new Runnable() {
    @Override
    public void run() {
        System.out.println("์ต๋ช… ๋‚ด๋ถ€ ํด๋ž˜์Šค ์‹คํ–‰!");
    }
};

โœ… ์˜ฌ๋ฐ”๋ฅธ ์˜ˆ์‹œ (๋žŒ๋‹ค์‹ ๋ณ€ํ™˜)

Runnable r = () -> System.out.println("๋žŒ๋‹ค์‹ ์‹คํ–‰!");

๐Ÿ’ก ๋žŒ๋‹ค์‹์„ ์‚ฌ์šฉํ•˜๋ฉด ์ฝ”๋“œ๊ฐ€ ํ›จ์”ฌ ๊ฐ„๊ฒฐํ•ด์ง€๊ณ , ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ์‰ฌ์›Œ์ง.


๐Ÿ“Œ 7๋‹จ๊ณ„ ์ •๋ฆฌ

โœ… ๋‚ด๋ถ€ ํด๋ž˜์Šค๋Š” ๊ธฐ์ˆ  ๋ฉด์ ‘์—์„œ ์ž์ฃผ ๋“ฑ์žฅํ•˜๋Š” ์ฃผ์ œ์ด๋ฏ€๋กœ, ๊ฐ ์ข…๋ฅ˜์™€ ์ฐจ์ด์ ์„ ๋ช…ํ™•ํžˆ ์ดํ•ดํ•ด์•ผ ํ•œ๋‹ค.

โœ… ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด static ๋‚ด๋ถ€ ํด๋ž˜์Šค๋ฅผ ์ ์ ˆํžˆ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.

โœ… ๋„ˆ๋ฌด ๊นŠ์€ ์ค‘์ฒฉ ํด๋ž˜์Šค๋Š” ํ”ผํ•˜๊ณ , ์œ ์ง€๋ณด์ˆ˜๋ฅผ ๊ณ ๋ คํ•œ ๊ตฌ์กฐ๋ฅผ ์„ค๊ณ„ํ•ด์•ผ ํ•œ๋‹ค.

โœ… ๋žŒ๋‹ค์‹์„ ํ™œ์šฉํ•˜๋ฉด ์ต๋ช… ๋‚ด๋ถ€ ํด๋ž˜์Šค๋ฅผ ๋” ๊ฐ„๊ฒฐํ•˜๊ฒŒ ์ตœ์ ํ™”ํ•  ์ˆ˜ ์žˆ๋‹ค.

๐ŸŽฏ ์ตœ์ข… ๊ฒฐ๋ก : ๋‚ด๋ถ€ ํด๋ž˜์Šค๋Š” ์–ธ์ œ ์‚ฌ์šฉํ• ๊นŒ?

โœ… ๋‚ด๋ถ€ ํด๋ž˜์Šค๊ฐ€ ์™ธ๋ถ€ ํด๋ž˜์Šค์™€ ๊ฐ•ํ•˜๊ฒŒ ์—ฐ๊ฒฐ๋œ ๊ฒฝ์šฐ

โœ… ํด๋ž˜์Šค๊ฐ€ ๋ถˆํ•„์š”ํ•˜๊ฒŒ ๋…ธ์ถœ๋˜์ง€ ์•Š๋„๋ก ์บก์Аํ™”๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ

โœ… GUI ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ, ์ปฌ๋ ‰์…˜ ๋ฐ˜๋ณต์ž, ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ ๋“ฑ์—์„œ ์ฝ”๋“œ ๊ฐ€๋…์„ฑ์„ ๋†’์ด๊ธฐ ์œ„ํ•ด

โœ… ๋žŒ๋‹ค์‹์ด ๊ฐ€๋Šฅํ•˜๋‹ค๋ฉด ์ต๋ช… ๋‚ด๋ถ€ ํด๋ž˜์Šค ๋Œ€์‹  ๋žŒ๋‹ค์‹์„ ์‚ฌ์šฉํ•˜์—ฌ ์ตœ์ ํ™”

์ด์ œ ๋‚ด๋ถ€ ํด๋ž˜์Šค์˜ ๊ฐœ๋…๋ถ€ํ„ฐ ํ™œ์šฉ๋ฒ•๊นŒ์ง€ ์™„๋ฒฝํ•˜๊ฒŒ ์ดํ•ดํ–ˆ์Šต๋‹ˆ๋‹ค! ๐Ÿš€

๋” ๊ถ๊ธˆํ•œ ์ ์ด ์žˆ์œผ๋ฉด ์–ธ์ œ๋“ ์ง€ ์งˆ๋ฌธํ•˜์„ธ์š”! ๐Ÿ˜Š