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

์•„์ดํ…œ 24 ๋ฉค๋ฒ„ ํด๋ž˜์Šค๋Š” ๋˜๋„๋ก static์œผ๋กœ ๋งŒ๋“ค๋ผ

  • ์ค‘์ฒฉ ํด๋ž˜์Šค๋Š” ๋‹ค๋ฅธ ํด๋ž˜์Šค ์•ˆ์— ์ •์˜๋œ ํด๋ž˜์Šค
  • ์ค‘์ฒฉ ํด๋ž˜์Šค๋Š” ์ž์‹ ์„ ๊ฐ์‹ผ ๋ฐ”๊นฅ ํด๋ž˜์Šค์—์„œ๋งŒ ์“ฐ์—ฌ์•ผ ํ•˜๋ฉฐ, ๊ทธ ์™ธ์˜ ์“ฐ์ž„์ƒˆ๊ฐ€ ์žˆ๋‹ค๋ฉด ํ†ฑ ๋ ˆ๋ฒจ ํฌ๋ž˜์Šค๋กœ ๋งŒ๋“ค์–ด์•ผ ํ•œ๋‹ค.
  • ์ค‘์ฒฉ ํด๋ž˜์Šค์˜ ์ข…๋ฅ˜
  1. ์ •์  ๋ฉค๋ฒ„ ํด๋ž˜์Šค
  2. (๋น„์ •์ ) ๋ฉค๋ฒ„ ํด๋ž˜์Šค
  3. ์ต๋ช… ํด๋ž˜์Šค
  4. ์ง€์—ญ ํด๋ž˜์Šค

์ด ์ค‘ ์ •์  ๋ฉค๋ฒ„ ํด๋ž˜์Šค๋ฅผ ์ œ์™ธํ•œ ๋‚˜๋จธ์ง€๋Š” ๋‚ด๋ถ€ ํด๋ž˜์Šค์— ํ•ด๋‹นํ•œ๋‹ค.

๋‚ด๋ถ€ํด๋ž˜์Šค (Inner Class)

  • ๋‚ด๋ถ€ ํด๋ž˜์Šค๋กœ์„œ ์ผ๋ฐ˜ํด๋ž˜์Šค ๋‚ด๋ถ€์— ์ƒ์„ฑ๋œ๋‹ค. Non-Static Nested Class ๋ผ๊ณ ๋„ ๋ถˆ๋ฆฐ๋‹ค.
  • ๋ฐ–์— ์žˆ๋Š” ํด๋ž˜์Šค๋Š” ๋‚ด๋ถ€ํด๋ž˜์Šค๋ฅผ ๋ฉค๋ฒ„๋ณ€์ˆ˜์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ์‚ฌ์šฉํ•˜๋ ค๋ฉด new๋กœ ์ธ์Šคํ„ด์Šค๋ฅผ ๋งŒ๋“ค์–ด์•ผํ•œ๋‹ค.
  • ๋‚ด๋ถ€ ํด๋ž˜์Šค๋Š” ์ž์‹ ์˜ ๋ฐ–์— ์žˆ๋Š” ํด๋ž˜์Šค์˜ ์ž์›์„ ์ง์ ‘ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
๋ชจ์–‘์ƒˆ
class Outer {
    ๋ณ€์ˆ˜;
    ๋ฉ”์†Œ๋“œ;

    public class Inner {

    }
}
๊ฐ์ฒด ์ƒ์„ฑ
Outer ๊ฐ์ฒด1 = new Outer();
Outer.Inner ๊ฐ์ฒด2 = ๊ฐ์ฒด1.new Inner();

์ค‘์ฒฉํด๋ž˜์Šค ์ข…๋ฅ˜

์ •์  ๋ฉค๋ฒ„ ํด๋ž˜์Šค

  • ์ •์  ๋ฉค๋ฒ„ ํด๋ž˜์Šค๋Š” ๋‹ค๋ฅธ ํด๋ž˜์Šค ์•ˆ์— ์„ ์–ธ๋˜๊ณ  ๋ฐ”๊นฅ ํด๋ž˜์Šค์˜ private ๋ฉค๋ฒ„์—๋„ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ๋งŒ ์ œ์™ธํ•˜๊ณ ๋Š” ์ผ๋ฐ˜ ํด๋ž˜์Šค์™€ ๋˜‘๊ฐ™๋‹ค.
  • ์ •์  ๋ฉค๋ฒ„ ํด๋ž˜์Šค๋Š” ํ”ํžˆ ๋ฐ”๊นฅ ํด๋ž˜์Šค์™€ ํ•จ๊ป˜ ์“ฐ์ผ ๋•Œ๋งŒ ์œ ์šฉํ•œ public ๋„์šฐ๋ฏธ ํด๋ž˜์Šค๋กœ ์“ฐ์ธ๋‹ค.

์ •์  ๋ฉค๋ฒ„ ํด๋ž˜์Šค๋Š” ๋ฐ”๊นฅ ํด๋ž˜์Šค(private ๊นŒ์ง€๋„)์˜ ๋ชจ๋“  ๋ฉค๋ฒ„์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค.

๋ฐ”๊นฅ ํด๋ž˜์Šค ๊ฐ์ฒด์— ์ ‘๊ทผํ•  ํ•„์š”๊ฐ€ ์—†๋Š” ๋ฉค๋ฒ„ ํด๋ž˜์Šค๋ฅผ ์ •์˜ํ•  ๋•Œ๋Š” ํ•ญ์ƒ ์„ ์–ธ๋ฌธ ์•ž์— static์„ ๋ถ™์—ฌ์„œ ๋น„-์ •์  ๋ฉค๋ฒ„ ํด๋ž˜์Šค ๋Œ€์‹  ์ •์  ๋ฉค๋ฒ„ ํด๋ž˜์Šค๋กœ ๋งŒ๋“ค์ž

๋‚ด๋ถ€ ํด๋ž˜์Šค๋ฅผ static์œผ๋กœ ์„ ์–ธํ•˜๋Š” ๊ฒƒ์€ '์ •์ ๋ฉค๋ฒ„ ํด๋ž˜์Šค'๋กœ ๋ฐ”๊นฅ ํด๋ž˜์Šค ๊ฐ์ฒด๋ฅผ ์“ธ๋•Œ๋งŒ ๋‚ด๋ถ€ ํด๋ž˜์Šค ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์—

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

๋น„์ •์  ๋ฉค๋ฒ„ ํด๋ž˜์Šค

  • ๋น„์ •์  ๋ฉค๋ฒ„ ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๋Š” ๋ฐ”๊นฅ ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค์™€ ์•”๋ฌต์ ์œผ๋กœ ์—ฐ๊ฒฐ๋œ๋‹ค.
  • ๋น„์ •์  ๋ฉค๋ฒ„ ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค ๋ฉ”์„œ๋“œ์—์„œ ์ •๊ทœํ™”๋œ this๋ฅผ ์‚ฌ์šฉํ•ด ๋ฐ”๊นฅ ์ธ์Šคํ„ด์Šค์˜ ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๊ฑฐ๋‚˜ ๋ฐ”๊นฅ ์ธ์Šคํ„ด์Šค์˜ ์ฐธ์กฐ๋ฅผ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋‹ค.
  • ์ •๊ทœํ™”๋œ this๋ž€ ํด๋ž˜์Šค๋ช….this ํ˜•ํƒœ๋กœ ๋ฐ”๊นฅ ํด๋ž˜์Šค์˜ ์ด๋ฆ„์„ ๋ช…์‹œํ•˜๋Š” ์šฉ๋ฒ•์„ ๋งํ•œ๋‹ค.
  • ๋น„์ •์  ๋ฉค๋ฒ„ ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค์™€ ๋ฐ”๊นฅ ์ธ์Šคํ„ด์Šค ์‚ฌ์ด์˜ ๊ด€๊ณ„๋Š” ๋ฉค๋ฒ„ ํด๋ž˜์Šค๊ฐ€ ์ธ์Šคํ„ด์Šคํ™”๋  ๋•Œ ํ™•๋ฆฝ ๋˜๋ฉฐ, ๋” ์ด์ƒ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๋‹ค.
  • ๋น„์ •์  ๋ฉค๋ฒ„ ํด๋ž˜์Šค๋Š” ์–ด๋Œ‘ํ„ฐ๋ฅผ ์ •์˜ํ•  ๋•Œ ์ž์ฃผ ์“ฐ์ธ๋‹ค. ์ฆ‰, ์–ด๋–ค ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ๊ฐ์‹ธ ๋งˆ์น˜ ๋‹ค๋ฅธ ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค์ฒ˜๋Ÿผ ๋ณด์ด๊ฒŒ ํ•˜๋Š” ๋ทฐ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด๋‹ค.
  • ๋น„์Šทํ•˜๊ฒŒ, Set๊ณผ List ๊ฐ™์€ ๋‹ค๋ฅธ ์ปฌ๋ ‰์…˜ ์ธํ„ฐํŽ˜์ด์Šค ๊ตฌํ˜„ ๋“ค๋„ ์ž์‹ ์˜ ๋ฐ˜๋ณต์ž๋ฅผ ๊ตฌํ˜„ํ•  ๋•Œ ๋น„์ •์  ๋ฉค๋ฒ„ ํด๋ž˜์Šค๋ฅผ ์ฃผ๋กœ ์‚ฌ์šฉํ•œ๋‹ค.
public class MySet<E> extends AbstractSet<E> {
    ... // ์ƒ๋žต

    @Override 
    public Iterator<E> iterator() {
        return new MyIterator();
    }

    private class MyIterator implements Iterator<E> {
    ...
    }
}

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

static์„ ์ƒ๋žตํ•˜๋ฉด ๋ฐ”๊นฅ ์ธ์Šคํ„ด์Šค๋กœ์˜ ์ˆจ์€ ์™ธ๋ถ€ ์ฐธ์กฐ๋ฅผ ๊ฐ–๊ฒŒ ๋œ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜์ด ๋ฐ”๊นฅ ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์ˆ˜๊ฑฐํ•˜์ง€ ๋ชปํ•˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๊ฐ€ ์ƒ๊ธธ ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์ด๋‹ค.

์ต๋ช… ํด๋ž˜์Šค

  • ์ต๋ช… ํด๋ž˜์Šค๋Š” ๋ฐ”๊นฅ ํด๋ž˜์Šค์˜ ๋ฉค๋ฒ„๋„ ์•„๋‹ˆ๋‹ค. ๋ฉค๋ฒ„์™€ ๋‹ฌ๋ฆฌ, ์“ฐ์ด๋Š” ์‹œ์ ์— ์„ ์–ธ๊ณผ ๋™์‹œ์— ์ธ์Šคํ„ด์Šค๊ฐ€ ๋งŒ๋“ค์–ด์ง„๋‹ค.
  • ์˜ค์ง ๋น„์ •์ ์ธ ๋ฌธ๋งฅ์—์„œ ์‚ฌ์šฉ๋  ๋•Œ๋งŒ ๋ฐ”๊นฅ ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๋‹ค. ์ •์  ๋ฌธ๋งฅ์—์„œ๋ผ๋„ ์ƒ์ˆ˜ ๋ณ€์ˆ˜ ์ด์™ธ์˜ ์ •์  ๋ฉค๋ฒ„๋Š” ๊ฐ€์งˆ ์ˆ˜ ์—†๋‹ค.
  • ์ฆ‰, ์ƒ์ˆ˜ ํ‘œํ˜„์„ ์œ„ํ•ด ์ดˆ๊ธฐํ™” ๋œ final ๊ธฐ๋ณธ ํƒ€์ž…๊ณผ ๋ฌธ์ž์—ด ํ•„๋“œ๋งŒ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋‹ค.
๋ชจ์–‘์ƒˆ
Class Inner {
    ๋ณ€์ˆ˜;
    ๋ฉ”์†Œ๋“œ;
}

class Outer {
    ๋ณ€์ˆ˜;
    ๋ฉ”์†Œ๋“œ1;

    ๋ฉ”์†Œ๋“œ2() {
        ์ง€์—ญ๋ณ€์ˆ˜;

        new Inner() {
            override๋œ ๋‚ด์šฉ๋“ค..
        }
    }
}

์ง€์—ญ ํด๋ž˜์Šค

  • ๋„ค๊ฐ€์ง€ ์ค‘์ฒฉ ํด๋ž˜์Šค ์ค‘ ๊ฐ€์žฅ ๋“œ๋ฌผ๊ฒŒ ์‚ฌ์šฉ๋œ๋‹ค.
  • ์ง€์—ญ ํด๋ž˜์Šค๋Š” ์ง€์—ญ ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•  ์ˆ˜ ์žˆ๋Š” ๊ณณ์ด๋ฉด ์‹ค์งˆ์ ์œผ๋กœ ์–ด๋””์„œ๋“  ์„ ์–ธ ๊ฐ€๋Šฅ
  • ์œ ํšจ ๋ฒ”์œ„๋„ ์ง€์—ญ ๋ณ€์ˆ˜์™€ ๊ฐ™๋‹ค.
  • ์„ธ ์ค‘์ฒฉ ํด๋ž˜์Šค์™€์˜ ๊ณตํ†ต์ ๋„ ํ•˜๋‚˜์”ฉ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.
  • ๋ฉค๋ฒ„ ํด๋ž˜์Šค์ฒ˜๋Ÿผ ์ด๋ฆ„์ด ์žˆ๊ณ  ๋ฐ˜๋ณตํ•ด์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
๋ฉ”์†Œ๋“œ ๋‚ด๋ถ€์— ํด๋ž˜์Šค๋ฅผ ์ •์˜ํ•˜๋Š” ๊ฒฝ์šฐ์ด๋‹ค. ๋งˆ์น˜ ๋ฉ”์†Œ๋“œ ๋‚ด์˜ ์ง€์—ญ๋ณ€์ˆ˜์ฒ˜๋Ÿผ ์“ฐ์ธ๋‹ค.
๋ฉ”์†Œ๋“œ ๋‚ด๋ถ€์—์„œ new ํ•œ ๋’ค ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค. ๋ฉ”์†Œ๋“œ ๋ฐ–์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค(์ง€์—ญ๋ณ€์ˆ˜ ๋ฃฐ)

๋ชจ์–‘์ƒˆ
class Outer {
    ๋ณ€์ˆ˜;
    ๋ฉ”์†Œ๋“œ1;

    ๋ฉ”์†Œ๋“œ2() {
        ์ง€์—ญ๋ณ€์ˆ˜;

        class Inner {

        }
    }
}

[ํ•ต์‹ฌ ์ •๋ฆฌ]

  1. ๋ฉ”์„œ๋“œ ๋ฐ–์—์„œ๋„ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๊ฑฐ๋‚˜ ๋ฉ”์„œ๋“œ ์•ˆ์— ์ •์˜ํ•˜๊ธฐ์—” ๋„ˆ๋ฌด ๊ธธ๋‹ค๋ฉด ๋ฉค๋ฒ„ ํด๋ž˜์Šค๋กœ ๋งŒ๋“ ๋‹ค.

  2. ๋ฉค๋ฒ„ ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค ๊ฐ๊ฐ์ด ๋ฐ”๊นฅ ์ธ์Šคํ„ด์Šค๋ฅผ ์ฐธ์กฐํ•œ๋‹ค๋ฉด ๋น„์ •์ ์œผ๋กœ ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์ •์ ์œผ๋กœ ๋งŒ๋“ค์ž.

  3. ์ค‘์ฒฉ ํด๋ž˜์Šค๊ฐ€ ํ•œ ๋ฉ”์„œ๋“œ ์•ˆ์—์„œ๋งŒ ์“ฐ์ด๋ฉด์„œ ๊ทธ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜๋Š” ์ง€์ ์ด ๋‹จ ํ•œ ๊ณณ์ด๊ณ  ํ•ด๋‹น ํƒ€์ž…์œผ๋กœ ์“ฐ๊ธฐ์— ์ ํ•ฉํ•œ ํด๋ž˜์Šค๋‚˜ ์ธ์Šคํ„ด์Šค๊ฐ€ ์ด๋ฏธ ์žˆ๋‹ค๋ฉด ์ต๋ช… ํด๋ž˜์Šค๋กœ ๋งŒ๋“ค๊ณ  ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์ง€์—ญ ํด๋ž˜์Šค๋กœ ๋งŒ๋“ค์ž.