Java

[Effective Java] ์•„์ดํ…œ 31. ํ•œ์ •์  ์™€์ผ๋“œ์นด๋“œ๋ฅผ ์‚ฌ์šฉํ•ด API ์œ ์—ฐ์„ฑ์„ ๋†’์ด๋ผ.

quedevel 2023. 3. 21. 09:57
728x90
๋ฐ˜์‘ํ˜•

๐ŸŽฏ ์•„์ดํ…œ 31. ํ•œ์ •์  ์™€์ผ๋“œ์นด๋“œ๋ฅผ ์‚ฌ์šฉํ•ด API ์œ ์—ฐ์„ฑ์„ ๋†’์ด๋ผ.

๋งค๊ฐœ๋ณ€์ˆ˜ํ™” ํƒ€์ž…์€ ๋ถˆ๊ณต๋ณ€์ด๋‹ค. ์ฆ‰ ์„œ๋กœ ๋‹ค๋ฅธ ํƒ€์ž… Type1๊ณผ Type2๊ฐ€ ์žˆ์„ ๋•Œ List์€ List์˜ ํ•˜์œ„ ํƒ€์ž…๋„ ์ƒ์œ„ ํƒ€์ž…๋„ ์•„๋‹ˆ๋‹ค.
์ฆ‰, List์€ List๊ฐ€ ํ•˜๋Š” ์ผ์„ ์ œ๋Œ€๋กœ ์ˆ˜ํ–‰ํ•˜์ง€ ๋ชปํ•˜๋‹ˆ ํ•˜์œ„ ํƒ€์ž…์ด ๋  ์ˆ˜ ์—†๋‹ค. ( ๋ฆฌ์Šค์ฝ”ํ”„ ์น˜ํ™˜ ์›์น™ ์— ์–ด๊ธ‹๋‚œ๋‹ค. )


  • ์™€์ผ๋“œ์นด๋“œ ํƒ€์ž…์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์€ pushAll ๋ฉ”์„œ๋“œ - ๊ฒฐํ•จ์ด ์žˆ๋‹ค!
// Stack์˜ public API
public void pushAll(Iterable<E> src){
  for (E e : src) {
      push(e);
  }
}
์–ธ๋œป๋ณด๋ฉด ์ปดํŒŒ์ผ๋„ ๋˜๊ณ  ์™„๋ฒฝํ•ด ๋ณด์ด์ง€๋งŒ ๊ฒฐํ•จ์ด ์žˆ๋‹ค.

public final class Integer extends Number implements Comparable<Integer>{}
public static void main(String[] args) {
    Stack<Number> stack = new Stack<>();
    List<Integer> integers = List.of(1,2,3);
    stack.pushAll(integers);
}

Integer๋Š” Number์˜ ํ•˜์œ„ํƒ€์ž…์ž„์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ์œ„ ์ฝ”๋“œ๋Š” ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.




์ž๋ฐ”๋Š” ์ด๋Ÿฐ ์ƒํ™ฉ์— ๋Œ€์ฒ˜ํ•  ์ˆ˜ ์žˆ๋Š” ํ•œ์ •์  ์™€์ผ๋“œ์นด๋“œ ํƒ€์ž…์ด๋ผ๋Š” ํŠน๋ณ„ํ•œ ๋งค๊ฐœ๋ณ€์ˆ˜ํ™” ํƒ€์ž…์„ ์ง€์›ํ•œ๋‹ค.

  • E ์ƒ์‚ฐ์ž ๋งค๊ฐœ๋ณ€์ˆ˜์— ์™€์ผ๋“œ์นด๋“œ ํƒ€์ž… ์ ์šฉ
    public void pushAll(Iterable<? extends E> src){
      for (E e : src) {
          push(e);
      }
    }
    E ํƒ€์ž…์„ ํ™•์žฅํ•œ ๋ชจ๋“  ํƒ€์ž…์„ ๋ฐ›์„ ์ˆ˜ ์žˆ๊ฒŒ๋œ๋‹ค.

  • ์™€์ผ๋“œ์นด๋“œ ํƒ€์ž…์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์€ popAll ๋ฉ”์„œ๋“œ - ๊ฒฐํ•จ์ด ์žˆ๋‹ค!
    public void popAll(Collection<E> dst){
      while (!isEmpty())
          dst.add(pop());
    }
    ์ด ๋˜ํ•œ ๋ฌธ์ œ์—†์ด ์™„๋ฒฝํ• ๊ฑฐ๋ผ ์ƒ๊ฐํ•˜์ง€๋งŒ ๊ฒฐํ•จ์ด ์กด์žฌํ•œ๋‹ค.
public static void main(String[] args) {
    Stack<Number> stack = new Stack<>();
    List<Integer> integers = List.of(1,2,3);
    stack.pushAll(integers); // ์™€์ผ๋“œ ์นด๋“œ ์ ์šฉ

    Collection<Object> objects = new ArrayList<>();
    stack.popAll(objects);
}

์œ„ ์ฒ˜๋Ÿผ Object๋Š” Number์˜ ํ•˜์œ„ํƒ€์ž…์ด ์•„๋‹ˆ๋ผ๋Š” ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๊ฒŒ ๋œ๋‹ค.

  • E ์†Œ๋น„์ž ๋งค๊ฐœ๋ณ€์ˆ˜์— ์™€์ผ๋“œ์นด๋“œ ํƒ€์ž… ์ ์šฉ์œ ์—ฐ์„ฑ์„ ๊ทน๋Œ€ํ™”ํ•˜๋ ค๋ฉด ์›์†Œ์˜ ์ƒ์‚ฐ์ž๋‚˜ ์†Œ๋น„์ž์šฉ ์ž…๋ ฅ ๋งค๊ฐœ๋ณ€์ˆ˜์— ์™€์ผ๋“œ์นด๋“œ ํƒ€์ž…์„ ์‚ฌ์šฉํ•˜๋ผ.
  • public void popAll(Collection<? super E> dst){ while (!isEmpty()) dst.add(pop()); }
  • but. ์ž…๋ ฅ ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์ƒ์‚ฐ์ž์™€ ์†Œ๋น„์ž ์—ญํ• ์„ ๋™์‹œ์— ํ•œ๋‹ค๋ฉด ์™€์ผ๋“œ์นด๋“œ ํƒ€์ž…์„ ์จ๋„ ์ข‹์„ ๊ฒŒ ์—†๋‹ค.
  • ํŽ™์Šค(PECS) : producer-extends, consumer-super
  • ์ฆ‰, ๋งค๊ฐœ๋ณ€์ˆ˜ํ™” ํƒ€์ž… T๊ฐ€ ์ƒ์‚ฐ์ž๋ผ๋ฉด <? extends T>๋ฅผ ์‚ฌ์šฉํ•˜๊ณ , ์†Œ๋น„์ž๋ผ๋ฉด <? super T>๋ฅผ ์‚ฌ์šฉํ•˜๋ผ.

union ๋ฉ”์„œ๋“œ

public static <E> Set<E> union(Set<E> s1, Set<E> s2)

s1, s2๊ฐ€ ๋ชจ๋‘ ์ƒ์‚ฐ์ž์ด๋‹ˆ ํŽ™์Šค๊ณต์‹์— ๋”ฐ๋ผ

public static <E> Set<E> union(Set<? extends E> s1, Set<? extends E> s2)

โœ… ๋ฐ˜ํ™˜ ํƒ€์ž…์—๋Š” ํ•œ์ •์  ์™€์ผ๋“œ์นด๋“œ ํƒ€์ž…์„ ์‚ฌ์šฉํ•˜๋ฉด ์•ˆ ๋œ๋‹ค. ์œ ์—ฐ์„ฑ์„ ๋†’์—ฌ์ฃผ๊ธฐ๋Š”์ปค๋…• ํด๋ผ์ด์–ธํŠธ ์ฝ”๋“œ์—์„œ๋„ ์™€์ผ๋“œ์นด๋“œ ํƒ€์ž…์„ ์จ์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.


โญ ํด๋ž˜์Šค ์‚ฌ์šฉ์ž๊ฐ€ ์™€์ผ๋“œ์นด๋“œ ํƒ€์ž…์„ ์‹ ๊ฒฝ ์จ์•ผ ํ•œ๋‹ค๋ฉด ๊ทธ API์— ๋ฌด์Šจ ๋ฌธ์ œ๊ฐ€ ์žˆ์„ ๊ฐ€๋Šฅ์„ฑ์ด ํฌ๋‹ค.


์ฐธ๊ณ  ์ž๋ฃŒ

Joshua Bloch, ใ€ŽEffective Java 3/Eใ€, ๊ฐœ์•ž๋งต์‹œ ์˜ฎ๊น€, ํ”„๋กœ๊ทธ๋ž˜๋ฐ์ธ์‚ฌ์ดํŠธ(2018)
http://www.kyobobook.co.kr/product/detailViewKor.laf?ejkGb=KOR&mallGb=KOR&barcode=9788966262281&orderClick=LEa&Kc=

728x90
๋ฐ˜์‘ํ˜•