[์ดํŽ™ํ‹ฐ๋ธŒ ์ž๋ฐ”] Item24. ๋ฉค๋ฒ„ ํด๋ž˜์Šค๋Š” ๋˜๋„๋ก static์œผ๋กœ ๋งŒ๋“ค๋ผ.

2023. 3. 14. 09:52ใ†JAVA/Effective JAVA

728x90

 

[์ดํŽ™ํ‹ฐ๋ธŒ ์ž๋ฐ”] Item24. ๋ฉค๋ฒ„ ํด๋ž˜์Šค๋Š” ๋˜๋„๋ก static์œผ๋กœ ๋งŒ๋“ค๋ผ. 

 

์ค‘์ฒฉ ํด๋ž˜์Šค(nested class)๋ž€ ๋‹ค๋ฅธ ํด๋ž˜์Šค ์•ˆ์— ์ •์˜๋œ ํด๋ž˜์Šค๋ฅผ ๋งํ•œ๋‹ค. 

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

์ค‘์ฒฉ ํด๋ž˜์Šค์˜ ์ข…๋ฅ˜๋Š” ์ •์  ๋ฉค๋ฒ„ ํด๋ž˜์Šค, ๋น„์ •์  ๋ฉค๋ฒ„ ํด๋ž˜์Šค, ์ต๋ช… ํด๋ž˜์Šค, ์ง€์—ญ ํด๋ž˜์Šค ๋„ค๊ฐ€์ง€๊ฐ€ ์žˆ๋‹ค. 

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

 

 

1๏ธโƒฃ ์ •์  ๋ฉค๋ฒ„ ํด๋ž˜์Šค 

: ์ •์  ๋ฉค๋ฒ„ ํด๋ž˜์Šค๋Š” ๋‹ค๋ฅธ ํด๋ž˜์Šค ์•ˆ์— ์„ ์–ธ๋˜๊ณ , ๋ฐ”๊นฅ ํด๋ž˜์Šค์˜ private ๋ฉค๋ฒ„์—๋„ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์„ ์ œ์™ธํ•˜๊ณ ๋Š” ์ผ๋ฐ˜ ํด๋ž˜์Šค์™€ ๋˜‘๊ฐ™๋‹ค. 

ex) ๊ณ„์‚ฐ๊ธฐ๊ฐ€ ์ง€์›ํ•˜๋Š” ์—ฐ์‚ฐ ์ข…๋ฅ˜๋ฅผ ์ •์˜ํ•˜๋Š” ์—ด๊ฑฐํƒ€์ž…์„ ์ƒ๊ฐํ•ด๋ณด๋ฉด Operation ์—ด๊ฑฐ ํƒ€์ž…์€ Calculator ํด๋ž˜์Šค์˜ public ์ •์  ๋ฉค๋ฒ„ ํด๋ž˜์Šค๊ฐ€ ๋˜์–ด์•ผ ํ•œ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด Calculator์˜ ํด๋ผ์ด์–ธํŠธ์—์„œ Calculator.Operation.PLUS ๋‚˜ Calculator.Operation.MINUS ์™€ ๊ฐ™์€ ํ˜•ํƒœ๋กœ ์—ฐ์‚ฐ์„ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๋‹ค. 

public class OuterClass
{
   private static int number = 10;
   
   
   // static ๋ฉค๋ฒ„ ํด๋ž˜์Šค
   // static ํ•„๋“œ์— ์ ‘๊ทผ ๊ฐ€๋Šฅ
   // Outer class์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ํ•„์š”๋กœ ํ•˜์ง€ ์•Š๋Š”๋‹ค. (static์ด๋ผ outer class์™€ ๋…๋ฆฝ์ )
   static private class InnerClass {
      void doSomething()
      {
         System.out.println("number = " + number);
      }
   }
   
   public static void main(String[] args)
   {
      InnerClass innerClass = new InnerClass();
      innerClass.doSomething();
      
   }
}

 

 

2๏ธโƒฃ ๋น„์ •์  ๋ฉค๋ฒ„ ํด๋ž˜์Šค 

๋น„์ •์  ๋ฉค๋ฒ„ ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๋Š” ๋ฐ”๊นฅ ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค์™€ ์•”๋ฌต์ ์œผ๋กœ ์—ฐ๊ฒฐ๋œ๋‹ค. 

๋”ฐ๋ผ์„œ ๋น„์ •์  ๋ฉค๋ฒ„ ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค ๋ฉ”์„œ๋“œ์—์„œ ์ •๊ทœํ™”๋œ this๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๋ฐ”๊นฅ ์ธ์Šคํ„ด์Šค์˜ ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๊ฑฐ๋‚˜ ๋ฐ”๊นฅ ์ธ์Šคํ„ด์Šค์˜ ์ฐธ์กฐ๋ฅผ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋‹ค. (์ •๊ทœํ™”๋œ this๋ž€ ํด๋ž˜์Šค๋ช….this ํ˜•ํƒœ๋กœ ๋ฐ”๊นฅ ํด๋ž˜์Šค์˜ ์ด๋ฆ„์„ ๋ช…์‹œํ•˜๋Š” ์šฉ๋ฒ•์„ ๋งํ•œ๋‹ค.) 

๋”ฐ๋ผ์„œ ๊ฐœ๋…์„ฑ ์ค‘์ฒฉ ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๊ฐ€ ๋ฐ”๊นฅ ์ธ์Šคํ„ด์Šค์™€ ๋…๋ฆฝ์ ์œผ๋กœ ์กด์žฌํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ์ •์  ๋ฉค๋ฒ„ ํด๋ž˜์Šค๋กœ ๋งŒ๋“ค์–ด์•ผ ํ•œ๋‹ค.!! 

(๋น„์ •์  ๋ฉค๋ฒ„ ํด๋ž˜์Šค๋Š” ๋ฐ”๊นฅ ์ธ์Šคํ„ด์Šค ์—†์ด๋Š” ์ƒ์„ฑํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ) 

public class OuterClass
{
   private int number = 10;
   
   void printNumber()
   {
      InnerClass innerClass = new InnerClass();
   }
   
   
   // ๋น„์ •์  ๋ฉค๋ฒ„ ํด๋ž˜์Šค (static์ด ์—†๋Š” inner class)
   // outer class์˜ ์ธ์Šคํ„ด์Šค์— ๋Œ€ํ•œ ์ฐธ์กฐ๊ฐ€ ์•”๋ฌต์ ์œผ๋กœ ์ƒ๊ธด๋‹ค. -> ์ฆ‰ outer class ์—†์ด๋Š” inner class ์‚ฌ์šฉ x
   private class InnerClass {
      void doSomething()
      {
         System.out.println("number = " + number);
         OuterClass.this.printNumber(); // outer class์˜ ๋ฉค๋ฒ„์— ์ ‘๊ทผ ๊ฐ€๋Šฅ
      }
   }
   
   public static void main(String[] args)
   {
      InnerClass innerClass = new OuterClass().new InnerClass();
      innerClass.doSomething();
   }
}

๋น„์ •์  ๋ฉค๋ฒ„ ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค์™€ ๋ฐ”๊นฅ ์ธ์Šคํ„ด์Šค ์‚ฌ์ด์˜ ๊ด€๊ณ„๋Š” ๋ฉค๋ฒ„ ํด๋ž˜์Šค๊ฐ€ ์ธ์Šคํ„ด์Šคํ™” ๋  ๋•Œ ํ™•๋ฆฝ๋˜๋ฉฐ ๋” ์ด์ƒ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๋‹ค. 

์ด ๊ด€๊ณ„๋Š” ๋ฐ”๊นฅ ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค ๋ฉ”์„œ๋“œ์—์„œ ๋น„์ •์  ๋ฉค๋ฒ„ ํด๋ž˜์Šค์˜ ์ƒ์„ฑ์ž๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ ์ž๋™์œผ๋กœ ๋งŒ๋“ค์–ด์ง€๋Š”๊ฒŒ ๋ณดํ†ต์ด์ง€๋งŒ ๋“œ๋ฌผ๊ฒŒ๋Š” ์ง์ ‘ ๋ฐ”๊นฅ ์ธ์Šคํ„ด์Šค์˜ ํด๋ž˜์Šค.new MemberClass(args)๋ฅผ ํ˜ธ์ถœํ•ด ์ˆ˜๋™์œผ๋กœ ๋งŒ๋“ค๊ธฐ๋„ ํ•œ๋‹ค. 

-> ์ด ๊ด€๊ณ„ ์ •๋ณด๋Š” ๋น„์ •์  ๋ฉค๋ฒ„ ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค ์•ˆ์— ๋งŒ๋“ค์–ด์ ธ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์„ ์ฐจ์ง€ํ•˜๋ฉฐ, ์ƒ์„ฑ ์‹œ๊ฐ„๋„ ๋” ๊ฑธ๋ฆฐ๋‹ค. 

 

 

public class MySet<E> extends AbstractSet<E>
{
   @Override
   public Iterator<E> iterator()
   {
      return new MyIterator();
   }
   
   @Override
   public int size()
   {
      return 0;
   }
   
   private class MyIterator implements Iterator<E>
   {
      @Override
      public boolean hasNext()
      {
         return false;
      }
      
      @Override
      public E next()
      {
         return null;
      }
   }
}

๋น„์ •์  ๋ฉค๋ฒ„ ํด๋ž˜์Šค๋Š” ์–ด๋Œ‘ํ„ฐ๋ฅผ ์ •์˜ํ•  ๋•Œ ์ž์ฃผ ์‚ฌ์šฉํ•œ๋‹ค. 

์–ด๋–ค ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ๊ฐ์‹ธ ๋งˆ์น˜ ๋‹ค๋ฅธ ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค์ฒ˜๋Ÿผ ๋ณด์ด๊ฒŒ ํ•˜๋Š” ๋ทฐ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด๋‹ค. 

Set, List์™€ ๊ฐ™์€ ๋‹ค๋ฅธ ์ปฌ๋ ‰์…˜ ์ธํ„ฐํŽ˜์ด์Šค ๊ตฌํ˜„๋“ค๋„ ์ž์‹ ์˜ ๋ฐ˜๋ณต์ž๋ฅผ ๊ตฌํ˜„ํ•  ๋•Œ ๋น„์ •์  ๋ฉค๋ฒ„ ํด๋ž˜์Šค๋ฅผ ์ฃผ๋กœ ์‚ฌ์šฉํ•œ๋‹ค. 

 

 

 

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

 

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

์ฐธ์กฐ๊ฐ€ ๋ˆˆ์— ๋ณด์ด์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๋ฌธ์ œ์˜ ์›์ธ์„ ์ฐพ๊ธฐ ์–ด๋ ค์›Œ ๋•Œ๋•Œ๋กœ ์‹ฌ๊ฐํ•œ ์ƒํ™ฉ์„ ์ดˆ๋ž˜ํ•˜๊ธฐ๋„ ํ•œ๋‹ค. 

 

 

 

3๏ธโƒฃ ์ต๋ช… ํด๋ž˜์Šค 

: ๋ฐ”๊นฅ ํด๋ž˜์Šค์˜ ๋ฉค๋ฒ„๊ฐ€ ์•„๋‹Œ, ์“ฐ์ด๋Š” ์‹œ์ ์— ์„ ์–ธ๊ณผ ๋™์‹œ์— ์ธ์Šคํ„ด์Šค๊ฐ€ ๋งŒ๋“ค์–ด์ง„๋‹ค. ๋”ฐ๋ผ์„œ ์ฝ”๋“œ์˜ ์–ด๋””์„œ๋“  ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค. 

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

์ต๋ช… ํด๋ž˜์Šค๋Š” ์„ ์–ธํ•œ ์ง€์ ์—์„œ๋งŒ ์ธ์Šคํ„ด์Šค๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๊ณ , instanceof ๊ฒ€์‚ฌ๋‚˜ ํด๋ž˜์Šค์˜ ์ด๋ฆ„์ด ํ•„์š”ํ•œ ์ž‘์—…์€ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์—†๋‹ค. 

์ž๋ฐ”์—์„œ ์ต๋ช… ํด๋ž˜์Šค๋Š” ๋žŒ๋‹ค๋ฅผ ์ง€์›ํ•˜๊ธฐ ์ „์— ์ฆ‰์„์—์„œ ์ž‘์€ ํ•จ์ˆ˜ ๊ฐ์ฒด๋‚˜ ์ฒ˜๋ฆฌ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค ๋•Œ ์‚ฌ์šฉํ–ˆ๋‹ค. 

์ต๋ช… ํด๋ž˜์Šค์˜ ๋˜ ๋‹ค๋ฅธ ์ฃผ ์“ฐ์ž„์€ ์ •์  ํŒฉํ„ฐ๋ฆฌ ๋ฉ”์„œ๋“œ๋ฅผ ๋งŒ๋“ค ๋•Œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. 

public class IntArrays
{
   static List<Integer> intArrayAsList(int[] a)
   {
      Objects.requireNonNull(a);
      
      return new AbstractList<>()
      {
         @Override
         public Integer get(int index)
         {
            return a[index];
         }
         
         @Override
         public Integer set(int index, Integer element)
         {
            int oldVal = a[index];
            a[index] = element;
            return oldVal;
         }
         
         @Override
         public int size()
         {
            return a.length;
         }
      };
   }
   
   public static void main(String[] args)
   {
      int[] a = new int[10];
      for (int i = 0; i < a.length; i++)
      {
         a[i] = i;
      }
   }
}

 

 

4๏ธโƒฃ ์ง€์—ญ ํด๋ž˜์Šค 

: ์ง€์—ญ ํด๋ž˜์Šค๋Š” ๋„ค๊ฐ€์ง€ ์ค‘์ฒฉ ํด๋ž˜์Šค ์ค‘ ๊ฐ€์žฅ ๋“œ๋ฌผ๊ฒŒ ์‚ฌ์šฉ๋œ๋‹ค. 

์ง€์—ญ ํด๋ž˜์Šค๋Š” ์ง€์—ญ ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•  ์ˆ˜ ์žˆ๋Š” ๊ณณ์ด๋ผ๋ฉด ์‹ค์งˆ์ ์œผ๋กœ ์–ด๋””๋“  ์„ ์–ธํ•  ์ˆ˜ ์žˆ๊ณ , ์œ ํšจ ๋ฒ”์œ„๋„ ์ง€์—ญ๋ณ€์ˆ˜์™€ ๊ฐ™๋‹ค. 

public class MyClass
{
   private int number = 10;
   
   void doSomething()
   {
      // ๋ฉค๋ฒ„ ํด๋ž˜์Šค๊ฐ€ ์•„๋‹Œ local class -> ๊ฑฐ์˜ ์‚ฌ์šฉ x
      class LocalClass {
         private void printNumber()
         {
            System.out.println("number = " + number);
         }
      }
      
      LocalClass localClass = new LocalClass();
      localClass.printNumber();
   }
   
   public static void main(String[] args)
   {
      MyClass myClass = new MyClass();
      myClass.doSomething();
   }
}

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

 

 

 

 

๐Ÿ“š ์ •๋ฆฌ

์ค‘์ฒฉ ํด๋ž˜์Šค์—๋Š” ๋„ค๊ฐ€์ง€, ์ •์  ๋ฉค๋ฒ„ ํด๋ž˜์Šค, ๋น„์ •์  ๋ฉค๋ฒ„ ํด๋ž˜์Šค, ์ต๋ช… ํด๋ž˜์Šค, ์ง€์—ญ ํด๋ž˜์Šค๊ฐ€ ์žˆ๊ณ  ๊ฐ๊ฐ์˜ ์“ฐ์ž„์ด ๋‹ค๋ฅด๋‹ค. 

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

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

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

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

728x90