[์ดํŽ™ํ‹ฐ๋ธŒ ์ž๋ฐ”] Item28. ๋ฐฐ์—ด๋ณด๋‹ค๋Š” ๋ฆฌ์ŠคํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋ผ.

2023. 3. 17. 10:17ใ†JAVA/Effective JAVA

728x90

 

[์ดํŽ™ํ‹ฐ๋ธŒ ์ž๋ฐ”] Item28. ๋ฐฐ์—ด๋ณด๋‹ค๋Š” ๋ฆฌ์ŠคํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋ผ. 

๋ฐฐ์—ด๊ณผ ์ œ๋„ค๋ฆญ ํƒ€์ž…์—๋Š” ์ค‘์š”ํ•œ ๋‘๊ฐ€์ง€ ์ฐจ์ด์ ์ด ์žˆ๋‹ค. 

 

1๏ธโƒฃ ๋ฐฐ์—ด์€ ๊ณต๋ณ€์ด๊ณ , ์ œ๋„ค๋ฆญ์€ ๋ถˆ๊ณต๋ณ€์ด๋‹ค. 

๊ณต๋ณ€, ๋ถˆ๊ณต๋ณ€ ๋ง์ด ์–ด๋ ค์šด๋ฐ ์šฐ์„  ๊ณต๋ณ€์€ 'ํ•จ๊ป˜ ๋ณ€ํ•œ๋‹ค' ๋ผ๋Š” ๋œป์ด๋‹ค. 

// ๊ณต๋ณ€
Object[] anything = new String[10]; // String ํƒ€์ž…์„ Object ํƒ€์ž…์— ๋‹ด์„ ์ˆ˜ ์žˆ๋‹ค. (ํ˜ธํ™˜์ด ๋˜๊ธฐ ๋•Œ๋ฌธ์—)
anything[0] = 1; // ์ปดํŒŒ์ผ ์—๋Ÿฌ๊ฐ€ ๋‚˜์ง€ ์•Š์ง€๋งŒ ๋ฌธ์ œ๊ฐ€ ์žˆ๋Š” ์ฝ”๋“œ๋‹ค.  (๋ฌธ์ž์—ด ๋ฐฐ์—ด์ธ๋ฐ ์ˆซ์ž๋ฅผ ๋„ฃ๊ณ  ์žˆ์œผ๋ฏ€๋กœ ๋ฒ„๊ทธ๋‹ค..!)

๋ฐฐ์—ด์—์„œ๋Š” Sub์ด Super์˜ ํ•˜์œ„ ํƒ€์ž…์ด๋ผ๋ฉด ๋ฐฐ์—ด Sub[]์€ Super[]์˜ ํ•˜์œ„ ํƒ€์ž…์ด ๋œ๋‹ค. 

์œ„์— ๋”ฐ๋ผ์„œ Object๋Š” String์˜ ์ƒ์œ„ ํƒ€์ž…์ด๊ธฐ ๋•Œ๋ฌธ์— Object[]์— String[]์„ ๋‹ด์„ ์ˆ˜ ์žˆ๋‹ค. 

 

       // ๋ถˆ๊ณต๋ณ€
      List<String> names = new ArrayList<>();
//    List<Object> objects = names; // List<String>์„ List<Object>์— ๋„ฃ์„ ์ˆ˜ ์—†๋‹ค. compile error ๋ฐœ์ƒ

ํ•˜์ง€๋งŒ ์ œ๋„ค๋ฆญ์€ ๋ถˆ๊ณต๋ณ€์œผ๋กœ ์ฆ‰, ์„œ๋กœ ๋‹ค๋ฅธ ํƒ€์ž… Type1 ๊ณผ Type2๊ฐ€ ์žˆ์„ ๋•Œ List<Type1> ์€ List<Type2>์˜ ํ•˜์œ„ ํƒ€์ž…๋„ ์•„๋‹ˆ๊ณ  ์ƒ์œ„ ํƒ€์ž…๋„ ์•„๋‹ˆ๋‹ค. 

 

 

์ง€๊ธˆ ์˜ˆ์ œ์—์„œ ๋ฐฐ์—ด์ด๋“  ๋ฆฌ์ŠคํŠธ์ด๋“  String์— ์ˆซ์ž๋ฅผ ๋„ฃ์„ ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ์—๋Ÿฌ๊ฐ€ ๋‚˜๋Š”๊ฑด ๋งž๋‹ค.

๊ทธ๋Ÿฐ๋ฐ ๋ฐฐ์—ด์—์„œ๋Š” ์ปดํŒŒ์ผ ์‹œ์ ์— ์—๋Ÿฌ๋ฅผ ๋ฐœ๊ฒฌํ•˜์ง€ ๋ชปํ•˜๊ณ  ๋Ÿฐํƒ€์ž„์—์„œ์•ผ ์•Œ ์ˆ˜ ์žˆ์ง€๋งŒ, ๋ฆฌ์ŠคํŠธ๋Š” ์ปดํŒŒ์ผํ•  ๋•Œ ๋ฐ”๋กœ ์•Œ ์ˆ˜ ์žˆ๋‹ค. 

๊ณ„~~์† ์–˜๊ธฐํ•˜๋Š”๊ฑฐ์ง€๋งŒ ์ปดํŒŒ์ผ ์‹œ์ ์— ์—๋Ÿฌ๋ฅผ ๋ฐœ๊ฒฌํ•˜๋Š”๊ฒŒ ํ›จ์”ฌ ์ข‹๋‹ค ใ…Žใ…Ž 

 

 

 

2๏ธโƒฃ ๋ฐฐ์—ด์€ ์‹ค์ฒดํ™”๊ฐ€ ๋˜๊ณ , ์ œ๋„ค๋ฆญ์€ ์‹ค์ฒดํ™” ๋˜์ง€ ์•Š๋Š”๋‹ค. (์†Œ๊ฑฐ) 

๋ฐฐ์—ด์€ ์‹ค์ฒดํ™”๊ฐ€ ๋œ๋‹ค๋Š” ๊ฒƒ์€ ๋ฐฐ์—ด์€ ๋Ÿฐํƒ€์ž„์—๋„ ์ž์‹ ์ด ๋‹ด๊ธฐ๋กœ ํ•œ ์›์†Œ์˜ ํƒ€์ž…์„ ์ธ์ง€ํ•˜๊ณ  ํ™•์ธํ•˜๊ณ  ์žˆ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. 

๋ฐ˜๋ฉด์— ์ œ๋„ค๋ฆญ์€ ํƒ€์ž… ์ •๋ณด๊ฐ€ ๋Ÿฐํƒ€์ž„์—๋Š” ์†Œ๊ฑฐ๊ฐ€ ๋œ๋‹ค. -> ์›์†Œ ํƒ€์ž…์„ ์ปดํŒŒ์ผ์—๋งŒ ๊ฒ€์‚ฌํ•˜๋ฉฐ ๋Ÿฐํƒ€์ž„์—๋Š” ์•Œ ์ˆ˜ ์กฐ์ฐจ ์—†๋‹ค๋Š” ๋œป์ด๋‹ค. 

public static void main(String[] args)
{
   // ์ปดํŒŒ์ผํ•˜๊ณ  ๋‚˜๋ฉด ์ œ๋„ค๋ฆญ์ด ์‚ฌ๋ผ์ง„๋‹ค. (์†Œ๊ฑฐ) -> ํ•˜์œ„ ํ˜ธํ™˜์„ฑ์„ ์œ„ํ•ด์„œ ์†Œ๊ฑฐ์˜ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜๊ณ  ํ˜•๋ณ€ํ™˜ ์ฝ”๋“œ๋ฅผ ๋„ฃ์–ด์คŒ
   List<String> names = new ArrayList<>();
   names.add("hyejin");
   String name = names.get(0);
   System.out.println("name = " + name);
}

byte code๋กœ ํ™•์ธ์„ ํ•ด๋ณด๋ฉด (IntelliJ ์—์„œ๋Š” shift ๋‘๋ฒˆ ๋ˆ„๋ฅด๊ณ  show bytecode ํ•˜๋ฉด ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.) 

List๋Š” ์ œ๋„ค๋ฆญ์ด ์†Œ๊ฑฐ๋˜๊ณ  ๋กœ ํƒ€์ž…์ธ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๊ณ , ๋ฐ‘์—์„œ String์œผ๋กœ cast ํ•˜๊ณ  ์žˆ๋‹ค. 

 

* ์†Œ๊ฑฐ๋Š” ์ œ๋„ค๋ฆญ์ด ์ง€์›๋˜๊ธฐ ์ „์— ๋ ˆ๊ฑฐ์‹œ ์ฝ”๋“œ์™€ ์ œ๋„ค๋ฆญ ํƒ€์ž…์„ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ๋ฉ”์ปค๋‹ˆ์ฆ˜์œผ๋กœ ์ž๋ฐ” 5๊ฐ€ ์ œ๋„ค๋ฆญ์œผ๋กœ ์ˆœ์กฐ๋กญ๊ฒŒ ์ „ํ™˜๋  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์คฌ๋‹ค. 

 

 

์ด๋Ÿฐ ์ฐจ์ด๋กœ ์ธํ•ด ๋ฐฐ์—ด๊ณผ ์ œ๋„ค๋ฆญ์€ ์ž˜ ์–ด์šฐ๋Ÿฌ์ง€์ง€ ๋ชปํ•œ๋‹ค. 

๋ฐฐ์—ด์€ ์ œ๋„ค๋ฆญ ํƒ€์ž…, ๋งค๊ฐœ๋ณ€์ˆ˜ํ™” ํƒ€์ž…, ํƒ€์ž… ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค. -> ์ฆ‰, new List<E>[], new List<String>[], new E[] ์ด๋Ÿฐ์‹์œผ๋กœ ์‚ฌ์šฉํ•˜์ง€ ๋ชปํ•œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. ์ด๋Ÿฐ์‹์œผ๋กœ ์ž‘์„ฑํ•˜๋ฉด ์ปดํŒŒ์ผํ•  ๋•Œ ์ œ๋„ค๋ฆญ ๋ฐฐ์—ด ์ƒ์„ฑ ์˜ค๋ฅ˜๋ฅผ ์ผ์œผํ‚จ๋‹ค. 

-> ์ œ๋„ค๋ฆญ ๋ฐฐ์—ด์„ ์ƒ์„ฑํ•˜์ง€ ๋ชปํ•˜๊ฒŒ ํ•˜๋Š” ์ด์œ ๋Š” ํƒ€์ž… ์•ˆ์ „ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค!  ์ด๋ฅผ ํ—ˆ์šฉํ•˜๋ฉด ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ž๋™ ์ƒ์„ฑํ•œ ํ˜•๋ณ€ํ™˜ ์ฝ”๋“œ์—์„œ ๋Ÿฐํƒ€์ž„ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์œผ๋กœ ๋Ÿฐํƒ€์ž„์ด ๋ฐœ์ƒํ•˜๋Š” ์ผ์„ ๋ง‰์•„์ฃผ๊ฒ ๋‹ค๋Š” ์ œ๋„ค๋ฆญ ํƒ€์ž… ์‹œ์Šคํ…œ์˜ ์ทจ์ง€์— ๋งž์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. 

 

 

public class Chooser_Array // ๋ฐฐ์—ด ๊ธฐ๋ฐ˜ Chooser
{
   private final Object[] choiceList;
   
   public Chooser_Array(Collection choices)
   {
      choiceList = choices.toArray();
   }
   
   public Object choose()
   {
      Random rnd = ThreadLocalRandom.current();
      return choiceList[rnd.nextInt(choiceList.length)];
   }
   
   public static void main(String[] args)
   {
      List<Integer> intList = List.of(1, 2, 3, 4, 5, 6);
      Chooser_Array chooser = new Chooser_Array(intList);
      
      for (int i = 0; i < 10; i++)
      {
         Number choice = (Number) chooser.choose();
         System.out.println("choice = " + choice);
      }
   }
}

-> ์ƒ์„ฑ์ž์—์„œ ์ปฌ๋ ‰์…˜์„ ๋ฐ›๋Š” Chooser_Array ํด๋ž˜์Šค๊ฐ€ ์žˆ๋‹ค. 

์ด ํด๋ž˜์Šค์—์„œ๋Š” ์ปฌ๋ ‰์…˜ ์•ˆ์˜ ์›์†Œ ์ค‘ ํ•˜๋‚˜๋ฅผ ๋ฌด์ž‘์œ„๋กœ ์„ ํƒํ•ด ๋ฐ˜ํ™˜ํ•˜๋Š” choose ๋ฉ”์„œ๋“œ๋ฅผ ์ œ๊ณตํ•œ๋‹ค. 

์ผ๋‹จ Choose_Array ํด๋ž˜์Šค๋Š” ์ œ๋„ค๋ฆญ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ๋ฐฐ์—ด์„ ์‚ฌ์šฉํ•œ ๊ฐ€์žฅ ๊ฐ„๋‹จํ•œ ๋ฒ„์ „์ด๋‹ค. 

 

๋ฐฐ์—ด ๊ธฐ๋ฐ˜ Chooser ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด choose ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ ๋งˆ๋‹ค ๋ฐ˜ํ™˜๋œ Object๋ฅผ ์›ํ•˜๋Š” ํƒ€์ž…์œผ๋กœ ํ˜•๋ณ€ํ™˜ํ•ด์ค˜์•ผ ํ•œ๋‹ค. 

Number choice = (Number) chooser.choose();

๊ทผ๋ฐ ์ด๋•Œ ํ˜น์‹œ๋‚˜ ํƒ€์ž…์ด ๋‹ค๋ฅธ ์›์†Œ๊ฐ€ ๋“ค์–ด ์žˆ๋‹ค๋ฉด ๋Ÿฐํƒ€์ž„์— ํ˜•๋ณ€ํ™˜ ์˜ค๋ฅ˜๊ฐ€ ๋‚  ๊ฒƒ์ด๋‹ค. 

 

 

public class Chooser_List<T> // ๋ฆฌ์ŠคํŠธ ๊ธฐ๋ฐ˜ Chooser
{
   private final List<T> choiceList;
   
   public Chooser_List(Collection<T> choices)
   {
      choiceList = new ArrayList<>(choices);
   }
   
   public T choose()
   {
      Random rnd = ThreadLocalRandom.current();
      return choiceList.get(rnd.nextInt(choiceList.size()));
   }
   
   public static void main(String[] args)
   {
      // ๋ฆฌ์ŠคํŠธ ๊ธฐ๋ฐ˜ chooser๋Š” ํ›จ์”ฌ ๋” ์•ˆ์ „ํ•œ ์ฝ”๋“œ๊ฐ€ ๋œ๋‹ค.
      List<Integer> intList = List.of(1, 2, 3, 4, 5, 6);
      Chooser_List<Integer> chooser = new Chooser_List<>(intList);
      
      for (int i = 0; i < 10; i++)
      {
         Number choice = chooser.choose();
         System.out.println("choice = " + choice);
      }
   }
}

์ด ํด๋ž˜์Šค๋Š” ์ด์ œ ๋ฐฐ์—ด ๋Œ€์‹  ๋ฆฌ์ŠคํŠธ๋ฅผ ์‚ฌ์šฉํ•œ ํด๋ž˜์Šค๋กœ ํƒ€์ž… ์•ˆ์ •์„ฑ๊ณผ ์ƒํ˜ธ์šด์šฉ์„ฑ์ด ํ›จ์”ฌ ์ข‹์•„์ง„๋‹ค. 

 

 

 

๐Ÿ“š ์ •๋ฆฌ

๋ฐฐ์—ด๊ณผ ์ œ๋„ค๋ฆญ์€ ๋‘๊ฐ€์ง€ ๋‹ค๋ฅธ ํƒ€์ž… ๊ทœ์น™์ด ์ ์šฉ๋œ๋‹ค. 

๋ฐฐ์—ด์€ ๊ณต๋ณ€์ด๊ณ  ์‹ค์ฒดํ™”๋˜๋Š” ๋ฐ˜๋ฉด, ์ œ๋„ค๋ฆญ์€ ๋ถˆ๊ณต๋ณ€์ด๊ณ  ํƒ€์ž… ์ •๋ณด๊ฐ€ ์†Œ๊ฑฐ๋œ๋‹ค. ๊ทธ ๊ฒฐ๊ณผ ๋ฐฐ์—ด์€ ๋Ÿฐํƒ€์ž„์—๋Š” ํƒ€์ž… ์•ˆ์ „ํ•˜์ง€๋งŒ ์ปดํŒŒ์ผํƒ€์ž„์—๋Š” ๊ทธ๋ ‡์ง€ ์•Š๋‹ค. ์ œ๋„ค๋ฆญ์€ ๊ทธ ๋ฐ˜๋Œ€๊ณ ,, 

๋”ฐ๋ผ์„œ ์ด ๋‘˜์€ ์„ž์–ด ์“ฐ๊ธฐ๊ฐ€ ์–ด๋ ต๋‹ค. ๋”ฐ๋ผ์„œ ๋ฐฐ์—ด๋ณด๋‹ค๋Š” ๋ฆฌ์ŠคํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋” ์ข‹๋‹ค!! 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

728x90