[์ดํŽ™ํ‹ฐ๋ธŒ ์ž๋ฐ”] Item27. ๋น„๊ฒ€์‚ฌ ๊ฒฝ๊ณ ๋ฅผ ์ œ๊ฑฐํ•˜๋ผ.

2023. 3. 16. 10:23ใ†JAVA/Effective JAVA

728x90

 

[์ดํŽ™ํ‹ฐ๋ธŒ ์ž๋ฐ”] Item27. ๋น„๊ฒ€์‚ฌ ๊ฒฝ๊ณ ๋ฅผ ์ œ๊ฑฐํ•˜๋ผ. 

์ œ๋„ค๋ฆญ์„ ์ด์ œ ์‚ฌ์šฉํ•˜๊ธฐ ์‹œ์ž‘ํ•˜๋ฉด ๋งŽ์€ ์ปดํŒŒ์ผ๋Ÿฌ ๊ฒฝ๊ณ ๋ฅผ ๋ณด๊ฒŒ ๋œ๋‹ค. 

๋น„๊ฒ€์‚ฌ ํ˜•๋ณ€ํ™˜ ๊ฒฝ๊ณ , ๋น„๊ฒ€์‚ฌ ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ ๊ฒฝ๊ณ , ๋น„๊ฒ€์‚ฌ ๋งค๊ฐœ๋ณ€์ˆ˜ํ™” ๊ฐ€๋ณ€์ธ์ˆ˜ ํƒ€์ž… ๊ฒฝ๊ณ , ๋น„๊ฒ€์‚ฌ ๋ณ€ํ™˜ ๊ฒฝ๊ณ  ๋“ฑ์ด ์žˆ๋‹ค. 

 

 

๋Œ€๋ถ€๋ถ„์˜ ๋น„๊ฒ€์‚ฌ ๊ฒฝ๊ณ ๋Š” ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๋ฌด์—‡์ด ์ž˜๋ชป๋˜์—ˆ๋Š”์ง€ ์„ค๋ช…ํ•ด์ฃผ๊ธฐ ๋•Œ๋ฌธ์— ์‰ฝ๊ฒŒ ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ๋‹ค. 

์œ„์—์„œ๋Š” ๋กœ ํƒ€์ž…์„ ์‚ฌ์šฉํ–ˆ๋‹ค๊ณ  ๊ฒฝ๊ณ ํ•˜๋Š” ๊ฒƒ์ด๋‹ค. 

 

 

ํ•  ์ˆ˜ ์žˆ๋Š” ํ•œ ๋ชจ๋“  ๋น„๊ฒ€์‚ฌ ๊ฒฝ๊ณ ๋ฅผ ์ œ๊ฑฐํ•˜์ž!

 

 ๋น„๊ฒ€์‚ฌ ๊ฒฝ๊ณ ๋ž€, ์ปดํŒŒ์ผ ์‹œ์— ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ž๋ฐ” ์ฝ”๋“œ๋ฅผ ์ปดํŒŒ์ผํ•˜๊ณ  ๋‚˜์„œ ์ž˜๋ชป๋œ ๊ฒƒ๋“ค์— ๋Œ€ํ•ด ๊ฒฝ๊ณ ํ•˜๋Š” ์˜ต์…˜์„ ์˜๋ฏธํ•œ๋‹ค.

๋ชจ๋‘ ์ œ๊ฑฐํ•œ๋‹ค๋ฉด ๊ทธ ์ฝ”๋“œ๋Š” ํƒ€์ž… ์•ˆ์ •์„ฑ์ด ๋ณด์žฅ๋œ๋‹ค. ์ฆ‰, ๋Ÿฐํƒ€์ž„์— ClassCastException์ด ๋ฐœ์ƒํ•  ์ผ์ด ์—†๋‹ค. 

๊ทธ๋Ÿฐ๋ฐ  ๊ฒฝ๊ณ ๋ฅผ ์ œ๊ฑฐํ•  ์ˆ˜๋Š” ์—†์ง€๋งŒ ํƒ€์ž… ์•ˆ์ „ํ•˜๋‹ค๊ณ  ํ™•์‹ ํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด @SuppressWarnings("unchecked") ์• ๋„ˆํ…Œ์ด์…˜์„ ๋‹ฌ์•„์„œ ๊ฒฝ๊ณ ๋ฅผ ์ˆจ๊ธฐ๋ฉด ๋œ๋‹ค. 

 

public class ListExample
{
   private int size;
   
   Object[] elements;
   
   public <T> T[] toArray(T[] a)
   {
      if (a.length < size) {
         /**
          * ์–ด๋…ธํ…Œ์ด์…˜์ด ์•ˆ์ „ํ•œ ์ด์œ ๋„ ์ฃผ์„์œผ๋กœ ์จ์ฃผ๋ฉด ์ข‹๋‹ค.
          */
         @SuppressWarnings("unchecked") // ๊ฐ€๋Šฅํ•œํ•œ ์ข์€ ๋ฒ”์œ„๋กœ ์–ด๋…ธํ…Œ์ด์…˜ ๋ถ™์ด๊ธฐ
         T[] result = (T[]) Arrays.copyOf(elements, size, a.getClass());
         return result;
      }
      System.arraycopy(elements, 0, a, 0, size);
      
      if (a.length > size) {
         a[size] = null;
      }
      return a;
   }
   
   public static void main(String[] args)
   {
   
   }
}

toArray ๋ฉ”์„œ๋“œ๋Š” ArrayList ์—์„œ ๊ทธ๋Œ€๋กœ ๊ฐ€์ ธ์˜จ ๋ฉ”์„œ๋“œ์ธ๋ฐ ์—ฌ๊ธฐ์„œ๋Š” ๊ฒฝ๊ณ ๋ฅผ ์ œ๊ฑฐํ•  ์ˆ˜ ์—†์ง€๋งŒ ํƒ€์ž…์ด ์•ˆ์ „ํ•˜๋‹ค๊ณ  ํ™•์‹ ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— @SuppressWarnings ์–ด๋…ธํ…Œ์ด์…˜์„ ๋ถ™์—ฌ์„œ ๋น„๊ฒ€์‚ฌ ๊ฒฝ๊ณ ๋ฅผ ์ œ๊ฑฐํ–ˆ๋‹ค. 

 

โ— ๊ทผ๋ฐ ์ด๋•Œ ํƒ€์ž… ์•ˆ์ „ํ•จ์„ ๊ฒ€์ฆํ•˜์ง€ ์•Š์€ ์ฑ„ ๊ฒฝ๊ณ ๋ฅผ ์ˆจ๊ธฐ๋ฉด ์Šค์Šค๋กœ์—๊ฒŒ ์ž˜๋ชป๋œ ๋ณด์•ˆ ์ธ์‹์„ ์ฃผ๋Š” ๊ผด์ด๋‹ค. 

์–ด๋…ธํ…Œ์ด์…˜์„ ๋ถ™์—ฌ์„œ ๊ฒฝ๊ณ ๋ฅผ ์ˆจ๊ธฐ๋ฉด ๊ทธ ์ฝ”๋“œ๋Š” ๊ฒฝ๊ณ  ์—†์ด ์ปดํŒŒ์ผ ๋˜๊ฒ ์ง€๋งŒ, ๋Ÿฐํƒ€์ž„์—๋Š” ClassCastException์„ ๋˜์งˆ ์ˆ˜ ์žˆ๋‹ค. 

 

โ• ํ•œํŽธ์œผ๋กœ๋Š” ์•ˆ์ „ํ•˜๋‹ค๊ณ  ๊ฒ€์ฆ๋œ ๋น„๊ฒ€์‚ฌ ๊ฒฝ๊ณ ๋ฅผ ์ œ๊ฑฐํ•˜์ง€ ์•Š๊ณ  ๊ทธ๋Œ€๋กœ ๋‘๋ฉด, ์ง„์งœ ๋ฌธ์ œ๋ฅผ ์•Œ๋ฆฌ๋Š” ์ƒˆ๋กœ์šด ๊ฒฝ๊ณ ๊ฐ€ ๋‚˜์™€๋„ ๋ˆˆ์น˜์ฑ„์ง€ ๋ชปํ•  ์ˆ˜ ์žˆ๋‹ค. ์ œ๊ฑฐํ•˜์ง€ ์•Š์€ ์ˆ˜๋งŽ์€ ๊ฑฐ์ง“ ๊ฒฝ๊ณ  ์†์— ์ƒˆ๋กœ์šด ๊ฒฝ๊ณ ๊ฐ€ ๋ฌปํžˆ๊ธฐ ๋•Œ๋ฌธ!

 

 

๐Ÿšฉ @SuppressWarnings ์–ด๋…ธํ…Œ์ด์…˜์€ ํ•ญ์ƒ ๊ฐ€๋Šฅํ•œํ•œ ์ข์€ ๋ฒ”์œ„์— ์ ์šฉํ•ด์•ผ ํ•œ๋‹ค. 

๋ณ€์ˆ˜ ์„ ์–ธ, ์•„์ฃผ ์งง์€ ๋ฉ”์„œ๋“œ, ์ƒ์„ฑ์ž ์ •๋„๊ฐ€ ๋  ๊ฒƒ์ธ๋ฐ ์ด ์–ด๋…ธํ…Œ์ด์…˜์„ ํด๋ž˜์Šค ์ „์ฒด์— ์ ์šฉํ•˜๋ฉด ์ž์นซ ์‹ฌ๊ฐํ•œ ๊ฒฝ๊ณ ๋ฅผ ๋†“์น  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ํด๋ž˜์Šค ์ „์ฒด์— ์ ์šฉํ•˜๋ฉด ์•ˆ๋œ๋‹ค!! 

 

๋˜ํ•œ @SuppressWarnings("unchekced") ์–ด๋…ธํ…Œ์ด์…˜์„ ์‚ฌ์šฉํ•  ๋•Œ๋ฉด ๊ทธ ๊ฒฝ๊ณ ๋ฅผ ๋ฌด์‹œํ•ด๋„ ์•ˆ์ „ํ•œ ์ด์œ ์— ๋Œ€ํ•ด์„œ ์ฃผ์„์œผ๋กœ ๋‚จ๊ฒจ๋‘๋ฉด ์ข‹๋‹ค. 

๋‹ค๋ฅธ ์‚ฌ๋žŒ์ด ๊ทธ ์ฝ”๋“œ๋ฅผ ์ดํ•ดํ•˜๋Š”๋ฐ ๋„์›€์ด ๋˜๊ณ , ๋‹ค๋ฅธ ์‚ฌ๋žŒ์ด ๊ทธ ์ฝ”๋“œ๋ฅผ ์ž˜๋ชป ์ˆ˜์ •ํ•˜์—ฌ ํƒ€์ž… ์•ˆ์ •์„ฑ์„ ์žƒ๋Š” ์ƒํ™ฉ์—ญ์‹œ ์ค„์–ด๋“ ๋‹ค. 

 

 

 

 

๐Ÿ“š ์ •๋ฆฌ

๋น„๊ฒ€์‚ฌ ๊ฒฝ๊ณ ๋Š” ์ค‘์š”ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฌด์‹œํ•˜๋ฉด ์•ˆ๋œ๋‹ค. 

๋ชจ๋“  ๋น„๊ฒ€์‚ฌ ๊ฒฝ๊ณ ์—๋Š” ๋Ÿฐํƒ€์ž„์— ClassCastException์„ ์ผ์œผํ‚ฌ ์ˆ˜ ์žˆ๋Š” ์ž ์žฌ์  ๊ฐ€๋Šฅ์„ฑ์„ ๋œปํ•˜๋Š” ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— ์ตœ์„ ์„ ๋‹คํ•ด์„œ ์ด ๋น„๊ฒ€์‚ฌ ๊ฒฝ๊ณ ๋ฅผ ์ œ๊ฑฐํ•ด์•ผ ํ•œ๋‹ค. 

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

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

728x90