๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

๋นˆ ๊ตฌ๋ฉ ์ฑ„์šฐ๊ธฐ

[Java] ํด๋ž˜์Šค ์•ˆ์˜ ํด๋ž˜์Šค / Static Nested Class, Member Inner Class, Local Inner class, Anonymous Inner Class

์ถœ์ฒ˜

ChatGPT


Nested Class ๊ตฌ์กฐ

Nested class

โจฝ Static Nested Class

โจฝ Inner class

    โจฝ Memeber Inner Class (Non-static Inner Class, Inner Class)

    โจฝ Local Inner class (Local Class)

    โจฝ Anonymouse Inner class (Anonymouse Class)

 

1. Outer class

  • ์™ธ๋ถ€ ํด๋ž˜์Šค๋Š” ๋ชจ๋“  ์ค‘์ฒฉ ํด๋ž˜์Šค(nested class)์˜ ์ปจํ…Œ์ด๋„ˆ ์—ญํ• ์„ ํ•œ๋‹ค.
  • ์ค‘ํ…๋œ ๋ชจ๋“  ํด๋ž˜์Šค๋Š” ์™ธ๋ถ€ ํด๋ž˜์Šค ๋‚ด๋ถ€์— ์ •์˜๋œ๋‹ค.

2. Static Nested Class

class OuterClass {
    static class StaticNestedClass {
        // Static Nested Class code
    }
}

์กด์žฌ ์ด์œ 

1. ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ

static nested class๋Š” ์™ธ๋ถ€ ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค์™€ ๋…๋ฆฝ์ ์ด๊ธฐ ๋•Œ๋ฌธ์— ์™ธ๋ถ€ ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ๋งŒ๋“ค์ง€ ์•Š๊ณ ๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋Š” ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ์„ ์ตœ์ ํ™”ํ•˜๋Š” ๋ฐ ์œ ์šฉํ•˜๋‹ค. ์™ธ๋ถ€ ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ํ•„์š”๋กœ ํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ, ๋ฉ”๋ชจ๋ฆฌ ํšจ์œจ์„ฑ์„ ๋†’์ผ ์ˆ˜ ์žˆ๋‹ค.

2. ์‘์ง‘๋„ ํ–ฅ์ƒ

๊ด€๋ จ ์žˆ๋Š” ํด๋ž˜์Šค๋“ค์„ ํ•˜๋‚˜์˜ ๋…ผ๋ฆฌ์ ์ธ ๋‹จ์œ„๋กœ ๋ฌถ์–ด ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค. ์™ธ๋ถ€ ํด๋ž˜์Šค์™€ ๋…ผ๋ฆฌ์ ์œผ๋กœ ๊ด€๋ จ์ด ์žˆ์ง€๋งŒ, ์™ธ๋ถ€ ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค์™€๋Š” ์ƒ๊ด€์—†๋Š” ํด๋ž˜์Šค๋ฅผ ์ •์˜ํ•  ๋•Œ static nested class๊ฐ€ ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค.

3. ์บก์Šํ™”

static nested class๋Š” ์™ธ๋ถ€ ํด๋ž˜์Šค์˜ ๋น„๊ณต๊ฐœ ๋ฉค๋ฒ„์— ์ ‘๊ทผํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์—, ๋…ผ๋ฆฌ์ ์ธ ๊ด€๊ณ„๋ฅผ ์œ ์ง€ํ•˜๋ฉด์„œ๋„ ์™ธ๋ถ€ ํด๋ž˜์Šค์™€์˜ ๋ถˆํ•„์š”ํ•œ ๊ฒฐํ•ฉ์„ ํ”ผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

4. ์œ ํ‹ธ๋ฆฌํ‹ฐ ํด๋ž˜์Šค

์œ ํ‹ธ๋ฆฌํ‹ฐ ์—ญํ• ์„ ํ•˜๋Š” ํด๋ž˜์Šค๋Š” ์™ธ๋ถ€ ํด๋ž˜์Šค์™€์˜ ์ธ์Šคํ„ด์Šค ๊ด€๊ณ„๊ฐ€ ํ•„์š” ์—†์œผ๋ฏ€๋กœ static nested class๋กœ ์„ ์–ธํ•˜๋Š” ๊ฒƒ์ด ์ ์ ˆํ•ฉ๋‹ˆ๋‹ค.

 

 

ํŠน์ง•

  • static ํ‚ค์›Œ๋“œ๋ฅผ ๊ฐ€์ง€๋ฉฐ ์™ธ๋ถ€ ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค์™€ ๋…๋ฆฝ์ ์œผ๋กœ ์กด์žฌ๋‹ค.
  • ์™ธ๋ถ€ ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค ์—†์ด ์ƒ์„ฑ ๊ฐ€๋Šฅํ•˜๋‹ค.
OuterClass.StaticNestedClass nestedObject = new OuterClass.StaticNestedClass();

 

  • ์™ธ๋ถ€ ํด๋ž˜์Šค์˜ ๋น„์ •์  ๋ฉค๋ฒ„์— ์ง์ ‘ ์ ‘๊ทผํ•  ์ˆ˜ ์—†๋‹ค. ๋‹ค๋งŒ, ์™ธ๋ถ€ ํด๋ž˜์Šค์˜ static ๋ฉค๋ฒ„์—๋Š” ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

 

์™ธ๋ถ€ ํด๋ž˜์Šค์—์„œ ์ฐธ์กฐ ๊ฐ€๋Šฅํ•œ ๋ณ€์ˆ˜๋“ค

  • ์ฐธ์กฐ ๊ฐ€๋Šฅ: ์™ธ๋ถ€ ํด๋ž˜์Šค์˜ static ๋ณ€์ˆ˜
  • ์ฐธ์กฐ ๋ถˆ๊ฐ€: ์™ธ๋ถ€ ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค ๋ณ€์ˆ˜

 

ํด๋ž˜์Šค ๋กœ๋“œ์™€ ์ƒ์„ฑ ์‹œ ๋ฉ”๋ชจ๋ฆฌ ๋™์ž‘

 

3. Inner class

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

3.1 Memeber Inner Class (Inner Class)

class OuterClass {
    class InnerClass {
        // Non-static Inner Class code
    }
}

 

์กด์žฌ ์ด์œ 

  • Non-static Inner Class๋Š” ์™ธ๋ถ€ ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค์™€ ๊ฐ•ํ•˜๊ฒŒ ๊ฒฐํ•ฉ๋˜์–ด ์™ธ๋ถ€ ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๊ฐ€ ์ƒ์„ฑ๋œ ํ›„์—๋งŒ ์ƒ์„ฑ๋  ์ˆ˜ ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ ์™ธ๋ถ€ ํด๋ž˜์Šค์˜ ๋ฐ์ดํ„ฐ๋‚˜ ๋ฉ”์„œ๋“œ์™€ ๋ฐ€์ ‘ํ•˜๊ฒŒ ์—ฐ๊ฒฐ๋œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ๋•Œ ์œ ์šฉํ•˜๋‹ค.
  • ์™ธ๋ถ€ ํด๋ž˜์Šค์˜ ์„ธ๋ถ€ ๊ตฌํ˜„์„ Non-static Inner Class๋ฅผ ํ†ตํ•ด ์€๋‹‰ํ•  ์ˆ˜ ์žˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ํŠน์ • ์ž‘์—…์ด๋‚˜ ๋กœ์ง์„ ๋‚ด๋ถ€ ํด๋ž˜์Šค์—์„œ๋งŒ ์ฒ˜๋ฆฌํ•˜๋„๋ก ํ•˜์—ฌ ์™ธ๋ถ€์—์„œ ์ง์ ‘ ์ ‘๊ทผํ•˜์ง€ ๋ชปํ•˜๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์ฝ”๋“œ ๊ตฌ์กฐ๋ฅผ ๋ชจ๋“ˆํ™”ํ•˜๋Š” ๋ฐ ๋„์›€์„ ์ค€๋‹ค. ํ•œ ํด๋ž˜์Šค ๋‚ด๋ถ€์— ๊ด€๋ จ๋œ ์„œ๋ธŒ ๊ธฐ๋Šฅ๋“ค์„ ๊ฐ€์ง€๋Š” ํด๋ž˜์Šค๋ฅผ ์ •์˜ํ•˜๋ฉด ๊ฐ€๋…์„ฑ๊ณผ ์œ ์ง€๋ณด์ˆ˜์„ฑ์ด ๋†’์•„์ง„๋‹ค.

ํŠน์ง•

  • ์™ธ๋ถ€ ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์™ธ๋ถ€ ํด๋ž˜์Šค ์ธ์Šคํ„ด์Šค์™€ ์—ฐ๊ด€๋˜์–ด ๋™์ž‘ํ•œ๋‹ค.
  • ์™ธ๋ถ€ ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๊ฐ€ ์กด์žฌํ•ด์•ผ๋งŒ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์™ธ๋ถ€ ํด๋ž˜์Šค์˜ private ๋ฉค๋ฒ„์—๋„ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์ฃผ๋กœ ์™ธ๋ถ€ ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค ๋ฉ”์„œ๋“œ๋‚˜ ์ƒ์„ฑ์ž ๋‚ด์—์„œ ์‚ฌ์šฉ๋œ๋‹ค. ...? ์˜ˆ์‹œ ํ•„์š”...?

 

์™ธ๋ถ€ ํด๋ž˜์Šค์—์„œ ์ฐธ์กฐ ๊ฐ€๋Šฅํ•œ ๋ณ€์ˆ˜๋“ค

  • ์ฐธ์กฐ ๊ฐ€๋Šฅ: ์™ธ๋ถ€ ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค ๋ณ€์ˆ˜, static ๋ณ€์ˆ˜

 

์‚ฌ์šฉ ์˜ˆ์‹œ

  • GUI ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜: ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋‚˜ UI ์ปดํฌ๋„ŒํŠธ์™€ ๊ฐ™์€ ๊ธฐ๋Šฅ์ด ์™ธ๋ถ€ ํด๋ž˜์Šค์™€ ๊ฐ•ํ•˜๊ฒŒ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ์„ ๋•Œ Non-static Inner Class๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.
class Outer {
    private String name;

    class Inner {
        void showName() {
            System.out.println("Name: " + name);  // ์™ธ๋ถ€ ํด๋ž˜์Šค์˜ ํ•„๋“œ์— ์ ‘๊ทผ ๊ฐ€๋Šฅ
        }
    }
}

 

ํด๋ž˜์Šค ๋กœ๋“œ์™€ ์ƒ์„ฑ ์‹œ ๋ฉ”๋ชจ๋ฆฌ ๋™์ž‘

 

3.2 Local Inner class (Local Class)

class OuterClass {
    void someMethod() {
        class LocalClass {
            // Local class inside a method
        }
    }
}

 

์กด์žฌ ์ด์œ 

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

 

ํŠน์ง•

  • Local class๋Š” ๋ฉ”์„œ๋“œ ๋‚ด๋ถ€์— ์ •์˜๋œ ํด๋ž˜์Šค์ด๋‹ค.
  • Local Class๋Š” ๋ฉ”์„œ๋“œ๋‚˜ ์ƒ์„ฑ์ž์˜ ๋‚ด๋ถ€์—์„œ ์„ ์–ธ๋˜๋ฏ€๋กœ, ํ•ด๋‹น ๋ฉ”์„œ๋“œ๋‚˜ ์ƒ์„ฑ์ž๊ฐ€ ์‹คํ–‰๋  ๋•Œ์—๋งŒ ์œ ํšจํ•˜๋‹ค.
  • ๋ณต์žกํ•œ ๋กœ์ง์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ๋ฉ”์„œ๋“œ ๋‚ด๋ถ€์— ํด๋ž˜์Šค๋ฅผ ์„ ์–ธํ•˜์—ฌ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ๋‹ค.
  • ์™ธ๋ถ€ ํด๋ž˜์Šค์˜ ๋ฉค๋ฒ„์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๋ฉ”์„œ๋“œ์— ์„ ์–ธ๋˜ ๋กœ์ปฌ ๋ณ€์ˆ˜๋ฅผ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ์œผ๋‚˜, ์ฐธ์กฐ๋œ ๋ณ€์ˆ˜๋Š” final ๋˜๋Š” effectively final์ด์–ด์•ผ ํ•œ๋‹ค.
  • Local class๊ฐ€ ์ฐธ์กฐํ•˜๋Š” ๋ฉ”์„œ๋“œ ์•ˆ ๋กœ์ปฌ ๋ณ€์ˆ˜๊ฐ€ final ๋˜๋Š” effectively final ์ด์–ด์•ผ ํ•˜๋Š” ์ด์œ 
๋”๋ณด๊ธฐ

Local class๊ฐ€ ์ฐธ์กฐํ•˜๋Š” ๋ฉ”์„œ๋“œ ์•ˆ ๋กœ์ปฌ ๋ณ€์ˆ˜๊ฐ€ final ๋˜๋Š” effectively final ์ด์–ด์•ผ ํ•˜๋Š” ์ด์œ 

 

Local calss์—์„œ ๋กœ์ปฌ ๋ณ€์ˆ˜๋ฅผ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ์ฐธ์กฐ๋œ ๋ณ€์ˆ˜๋Š” final ๋˜๋Š” effectively final์ด์–ด์•ผ ํ•œ๋‹ค๋Š” ๊ทœ์น™์˜ ์ด์œ ๋Š” ์ž๋ฐ”์˜ ๋ฉ”๋ชจ๋ฆฌ ๋ชจ๋ธ๊ณผ ๊ด€๋ จ์ด ์žˆ๋‹ค.

 

1. ๋กœ์ปฌ ๋ณ€์ˆ˜์˜ ์ƒ๋ช… ์ฃผ๊ธฐ์™€ ํด๋ž˜์Šค์˜ ์ƒ๋ช… ์ฃผ๊ธฐ

 

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

๋กœ์ปฌ ํด๋ž˜์Šค๊ฐ€ ๋ฉ”์„œ๋“œ๊ฐ€ ์ข…๋ฃŒ๋œ ์ดํ›„์—๋„ ์‹คํ–‰๋  ์ˆ˜ ์žˆ๋Š” ์ƒํ™ฉ์— ๋Œ€ํ•œ ์˜ˆ์‹œ

๋กœ์ปฌ ํด๋ž˜์Šค๊ฐ€ ๋ฉ”์„œ๋“œ ๋‚ด๋ถ€์—์„œ ์ •์˜๋˜์—ˆ์ง€๋งŒ, ํ•ด๋‹น ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๊ฐ€ ๋ฉ”์„œ๋“œ ์™ธ๋ถ€์—์„œ๋„ ์ž‘๋™ํ•  ์ˆ˜ ์žˆ๋Š” ์ƒํ™ฉ์„ ์˜ˆ์‹œ๋กœ ๋“ค์„ ๊ฒƒ์ด๋‹ค.

์•„๋ž˜ ์˜ˆ์ œ๋Š” java.lang.Runnable ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ ํ”„๋กœ๊ทธ๋žจ์ด๋‹ค. ์ด ํ”„๋กœ๊ทธ๋žจ์—์„œ๋Š” ๋ฉ”์„œ๋“œ ๋‚ด๋ถ€์— ๋กœ์ปฌ ํด๋ž˜์Šค๋ฅผ ์ •์˜ํ•˜๊ณ , ๊ทธ ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๊ฐ€ ๋ฉ”์„œ๋“œ๊ฐ€ ์ข…๋ฃŒ๋œ ํ›„์—๋„ ์‹คํ–‰๋˜๋Š” ์ƒํ™ฉ์„ ๋ณด์—ฌ์ค€๋‹ค.

public class LocalClassExample {

    public void startThread() {
        // ๋ฉ”์„œ๋“œ ๋‚ด๋ถ€์—์„œ ๋กœ์ปฌ ํด๋ž˜์Šค ์ •์˜
        class Task implements Runnable {
            @Override
            public void run() {
                // ๋ฉ”์„œ๋“œ๊ฐ€ ์ข…๋ฃŒ๋œ ํ›„์—๋„ ์‹คํ–‰๋  ๋กœ์ง
                System.out.println("Task is running...");
            }
        }

        // ๋กœ์ปฌ ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ
        Task task = new Task();
        // ์ƒˆ๋กœ์šด ์Šค๋ ˆ๋“œ๋ฅผ ์‹œ์ž‘ํ•˜๋ฉด์„œ ๋กœ์ปฌ ํด๋ž˜์Šค ์ธ์Šคํ„ด์Šค ์‹คํ–‰
        Thread thread = new Thread(task);
        thread.start(); // ์Šค๋ ˆ๋“œ๊ฐ€ ์‹œ์ž‘๋˜๋ฉด ๋ฉ”์„œ๋“œ๊ฐ€ ์ข…๋ฃŒ๋œ ํ›„์—๋„ Task๊ฐ€ ์‹คํ–‰๋จ
    }

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

        System.out.println("Main method finished.");
    }
}

 

์‹คํ–‰ ๊ฒฐ๊ณผ

Main method finished.
Task is running...

 

์„ค๋ช…

 

  • startThread() ๋ฉ”์„œ๋“œ ๋‚ด๋ถ€์—์„œ Task๋ผ๋Š” ์ด๋ฆ„์˜ ๋กœ์ปฌ ํด๋ž˜์Šค๋ฅผ ์ •์˜ํ•œ๋‹ค. ์ด ํด๋ž˜์Šค๋Š” Runnable ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜์—ฌ ์Šค๋ ˆ๋“œ์—์„œ ์‹คํ–‰๋  ์ˆ˜ ์žˆ๋‹ค.
  • Task ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜๊ณ , ํ•ด๋‹น ์ธ์Šคํ„ด์Šค๋ฅผ Thread ๊ฐ์ฒด์— ์ „๋‹ฌํ•œ ๋’ค thread.start()๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค. ์ด๋กœ ์ธํ•ด ์ƒˆ๋กœ์šด ์Šค๋ ˆ๋“œ๊ฐ€ ์‹œ์ž‘๋˜๊ณ , Task ํด๋ž˜์Šค์˜ run() ๋ฉ”์„œ๋“œ๊ฐ€ ์‹คํ–‰๋œ๋‹ค.
  • startThread() ๋ฉ”์„œ๋“œ๋Š” ์Šค๋ ˆ๋“œ๊ฐ€ ์‹คํ–‰๋˜๋Š” ๋„์ค‘์— ์ข…๋ฃŒ๋˜์ง€๋งŒ, Task ํด๋ž˜์Šค๋Š” ์Šค๋ ˆ๋“œ ๋‚ด์—์„œ ์‹คํ–‰๋˜๋ฏ€๋กœ ๋ฉ”์„œ๋“œ๊ฐ€ ์ข…๋ฃŒ๋œ ํ›„์—๋„ Task์˜ run() ๋ฉ”์„œ๋“œ๊ฐ€ ๊ณ„์†ํ•ด์„œ ์‹คํ–‰๋œ๋‹ค.

์ด ์˜ˆ์‹œ์—์„œ์ฒ˜๋Ÿผ, ๋กœ์ปฌ ํด๋ž˜์Šค๋Š” ๋ฉ”์„œ๋“œ ๋‚ด๋ถ€์—์„œ ์ •์˜๋˜์ง€๋งŒ, ๊ทธ ์ธ์Šคํ„ด์Šค๋Š” ๋ฉ”์„œ๋“œ๊ฐ€ ์ข…๋ฃŒ๋œ ํ›„์—๋„ ์‹คํ–‰๋  ์ˆ˜ ์žˆ๋‹ค.

 

 

2. ์บก์ณ๋œ ๋ณ€์ˆ˜ ๋ณต์‚ฌ

  • ์ž๋ฐ”์—์„œ๋Š” ์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๋กœ์ปฌ ๋ณ€์ˆ˜์˜ ๊ฐ’์„ ๋ณต์‚ฌํ•ด์„œ ๋กœ์ปฌ ํด๋ž˜์Šค๊ฐ€ ํ•ด๋‹น ๊ฐ’์„ ์‚ฌ์šฉํ•˜๊ฒŒ ํ•œ๋‹ค. ์ด๋•Œ, ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜๋ฉด ๋ณต์‚ฌ๋œ ๊ฐ’๊ณผ ์›๋ž˜ ๋ณ€์ˆ˜์˜ ๊ฐ’์ด ์ผ์น˜ํ•˜์ง€ ์•Š๊ฒŒ ๋˜๋Š” ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธด๋‹ค. ์ด๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ํ•ด๋‹น ๋ณ€์ˆ˜๋Š” final์ด๊ฑฐ๋‚˜ effectively final์ด์–ด์•ผ ํ•œ๋‹ค๋Š” ์ œํ•œ์ด ์ ์šฉ๋œ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•จ์œผ๋กœ์จ, ๋กœ์ปฌ ํด๋ž˜์Šค๊ฐ€ ์ฐธ์กฐํ•˜๋Š” ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์Œ์„ ๋ณด์žฅํ•œ๋‹ค.

 

3. final ๋˜๋Š” effectively final์˜ ์˜๋ฏธ

 

  • final: ํ•ด๋‹น ๋ณ€์ˆ˜๊ฐ€ ํ•œ ๋ฒˆ๋งŒ ์ดˆ๊ธฐํ™”๋˜๊ณ  ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์Œ์„ ์˜ํ•œ๋‹ค. ์ฆ‰, ๋กœ์ปฌ ํด๋ž˜์Šค๊ฐ€ ์ฐธ์กฐํ•˜๋Š” ๊ฐ’์ด ๋ถˆ๋ณ€ํ•˜๊ฒŒ ๋ณด์žฅ๋œ๋‹ค.
  • effectively final: final ํ‚ค์›Œ๋“œ๊ฐ€ ๋ช…์‹œ์ ์œผ๋กœ ์„ ์–ธ๋˜์ง€ ์•Š์•˜์ง€๋งŒ, ํ•ด๋‹น ๋ณ€์ˆ˜๊ฐ€ ์ฝ”๋“œ์—์„œ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์Œ์„ ์˜๋ฏธํ•œ๋‹ค. ์ด๋Š” ์ž๋ฐ” 8 ์ดํ›„๋ถ€ํ„ฐ ๋„์ž…๋œ ๊ฐœ๋…์œผ๋กœ, ๋ณ€์ˆ˜์˜ ๊ฐ’์ด ํ•œ ๋ฒˆ ์„ค์ •๋œ ํ›„ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๋Š”๋‹ค๋ฉด effectively final๋กœ ๊ฐ„์ฃผ๋œ๋‹ค.

 

 

๊ฒฐ๋ก 

๋กœ์ปฌ ํด๋ž˜์Šค์—์„œ ์ฐธ์กฐ๋˜๋Š” ๋ณ€์ˆ˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ๋ชจ๋ธ๊ณผ ๋™์ž‘์— ๋Œ€ํ•œ ์ผ๊ด€์„ฑ์„ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด final ๋˜๋Š” effectively final๋กœ ์ œํ•œ๋œ๋‹ค. ์ด๋กœ์จ, ๋ฉ”๋ชจ๋ฆฌ์—์„œ ์‚ฌ๋ผ์ง€๊ฑฐ๋‚˜ ๋ณ€์งˆ๋œ ๋ณ€์ˆ˜๋ฅผ ์ฐธ์กฐํ•˜๋ ค๋Š” ์œ„ํ—˜์„ ๋ฐฉ์ง€ํ•˜๊ณ , ์•ˆ์ •์ ์ธ ์ฝ”๋“œ ๋™์ž‘์„ ๋ณด์žฅํ•œ๋‹ค.

 

์™ธ๋ถ€ ํด๋ž˜์Šค์—์„œ ์ฐธ์กฐ ๊ฐ€๋Šฅํ•œ ๋ณ€์ˆ˜๋“ค

  • ์ฐธ์กฐ ๊ฐ€๋Šฅ: ์™ธ๋ถ€ ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค ๋ณ€์ˆ˜/static ๋ณ€์ˆ˜, ์™ธ๋ถ€ ๋ฉ”์„œ๋“œ์˜ final ๋˜๋Š” effectively final ๋ณ€์ˆ˜

 

์‚ฌ์šฉ ์˜ˆ์‹œ

  • ์ด๋ฒคํŠธ ๊ธฐ๋ฐ˜ ํ”„๋กœ๊ทธ๋ž˜๋ฐ: ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ์— ํ•„์š”ํ•œ ๋กœ์ง์„ ๋ฉ”์„œ๋“œ ๋‚ด๋ถ€์—์„œ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•  ๋•Œ Local Class๊ฐ€ ์œ ์šฉํ•˜๋‹ค.
class Outer {
    public void someMethod() {
        class Local {
            void print() {
                System.out.println("This is a local class");
            }
        }
        Local local = new Local();
        local.print();
    }
}

 

ํด๋ž˜์Šค ๋กœ๋“œ์™€ ์ƒ์„ฑ ์‹œ ๋ฉ”๋ชจ๋ฆฌ ๋™์ž‘

 

3.3 Anonymouse Inner class (Anonymouse class)

class OuterClass {
    void someMethod() {
        Runnable r = new Runnable() {
            public void run() {
                // Anonymous inner class code
            }
        };
    }
}

 

์กด์žฌ ์ด์œ 

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

ํŠน์ง•

  • ์ต๋ช… ํด๋ž˜์Šค๋Š” ์ด๋ฆ„์ด ์—†๋Š” ๋‚ด๋ถ€ ํด๋ž˜์Šค๋‹ค.
  • ํด๋ž˜์Šค ์ •์˜์™€ ๋™์‹œ์— ์ธ์Šคํ„ด์Šคํ™”๋œ๋‹ค.
  • ์ฃผ๋กœ ์ธํ„ฐํŽ˜์ด์Šค๋‚˜ ์ถ”์ƒ ํด๋ž˜์Šค๋ฅผ ๊ตฌํ˜„ํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.
  • ์ผ์‹œ์ ์œผ๋กœ ํ•œ ๋ฒˆ๋งŒ ์‚ฌ์šฉํ•˜๊ณ  ๋ฒ„๋ ค์ง„๋‹ค. ์žฌ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š”๋‹ค.
  • ์žฌ์‚ฌ์šฉ์„ฑ์ด ์—†๊ณ  ํ™•์žฅ์„ฑ์„ ํ™œ์šฉํ•˜๋Š” ๊ฒƒ์ด ์œ ์ง€๋ณด์ˆ˜์— ๋” ๋ถˆ๋ฆฌํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.

 

์™ธ๋ถ€ ํด๋ž˜์Šค์—์„œ ์ฐธ์กฐ ๊ฐ€๋Šฅํ•œ ๋ณ€์ˆ˜๋“ค

  • ์ฐธ์กฐ ๊ฐ€๋Šฅ: ์™ธ๋ถ€ ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค ๋ณ€์ˆ˜, ์™ธ๋ถ€ ํด๋ž˜์Šค์˜ static ๋ณ€์ˆ˜, ์™ธ๋ถ€ ๋ฉ”์„œ๋“œ์˜ final ๋˜๋Š” effectively final ๋ณ€์ˆ˜

 

์‚ฌ์šฉ ์˜ˆ์‹œ

  • ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ: ๋ฒ„ํŠผ ํด๋ฆญ, ๋งˆ์šฐ์Šค ์ด๋ฒคํŠธ ๋“ฑ ์ด๋ฒคํŠธ ๊ธฐ๋ฐ˜ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ ๊ฐ„๋‹จํ•˜๊ฒŒ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ์ •์˜ํ•˜๋Š” ๋ฐ ์œ ์šฉํ•˜๋‹ค.
button.addActionListener(new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent e) {
        System.out.println("Button clicked!");
    }
});

 

ํด๋ž˜์Šค ๋กœ๋“œ์™€ ์ƒ์„ฑ ์‹œ ๋ฉ”๋ชจ๋ฆฌ ๋™์ž‘

 

์ •๋ฆฌ

  • Static nested class๋Š” ์™ธ๋ถ€ ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค ์—†์ด๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ฉ”๋ชจ๋ฆฌ ํšจ์œจ์„ฑ์„ ๋†’์ด๊ณ , ์™ธ๋ถ€ ํด๋ž˜์Šค์™€์˜ ๊ฒฐํ•ฉ์„ ์ค„์ด๋ฉด์„œ ๋…ผ๋ฆฌ์  ์‘์ง‘๋„๋ฅผ ์œ ์ง€ํ•˜๋Š” ๋ฐ ์œ ๋ฆฌํ•˜๋‹ค.
  • Member inner class๋Š” ์™ธ๋ถ€ ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค์™€ ๋ฐ€์ ‘ํ•œ ๊ด€๊ณ„๋ฅผ ๊ฐ€์ง€๋ฉฐ, ์™ธ๋ถ€ ํด๋ž˜์Šค์˜ ์ƒํƒœ๋ฅผ ์‰ฝ๊ฒŒ ์ฐธ์กฐํ•˜๊ฑฐ๋‚˜ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋Š” ๊ตฌ์กฐ์ด๋‹ค.
  • Local class์™€ Anonymous class๋Š” ํŠน์ • ์ปจํ…์ŠคํŠธ์—์„œ๋งŒ ์กด์žฌํ•˜๋Š” ์ผ์‹œ์ ์ธ ํด๋ž˜์Šค๋กœ, ์ฝ”๋“œ์˜ ๊ฐ€๋…์„ฑ๊ณผ ๋ช…๋ฃŒ์„ฑ์„ ๋†’์ด๊ธฐ ์œ„ํ•œ ์šฉ๋„๋กœ ์‚ฌ์šฉ๋œ๋‹ค.