You will be fine

<이펙티브 자바> 5. 제네릭

by BFine
반응형

www.yes24.com/Product/Goods/65551284

 

이펙티브 자바 Effective Java 3/E

자바 플랫폼 모범 사례 완벽 가이드 - Java 7, 8, 9 대응자바 6 출시 직후 출간된 『이펙티브 자바 2판』 이후로 자바는 커다란 변화를 겪었다. 그래서 졸트상에 빛나는 이 책도 자바 언어와 라이브

www.yes24.com

5장

  • 제네릭을 지원하기전 컬렉션에서 객체를 꺼낼때마다 형변환 문제
    • 지원 후에 컴파일 과정에서 차단

26. 로 타입은 사용하지 말자

  • 로타입이란 제네릭에서 타입 매개변수를 사용하지 않는 것

  • 로타입은 안정성, 표현력 모두 잃는다

  • List

    는 모든 타입을 허용한다는 의사를 컴파일러에게 전달한 것
  • 와일드카드(<?>)

    • Collection<?>에는 null 외에 어떤 원소도 넣을 수 없다.

        public static <E extends SKT> void test(List<E> a){
              a.add((E) new SKP());
          }
      
          public static void test2(List<? extends SKT> a){
              a.add(new SKP()); // 컴파일오류
          }
      

27. Warnning을 제거하자

  • javac 인수로 -Xlint:uncheck 옵션을 추가 하면 컴파일러가 알려준다
  • 타입 안전하다고 확식하면 @SuppressWarnings 를 달아 표시하자(좁은 범위로 사용)
    • 사용하고 왜 안전한지 주석으로 남겨라

28. 배열보다는 리스트 사용하자

  • 차이점
    • 배열은 함께 변한다. (sub extends super 이면 super[]는 sub[] 상위 타입이 된다)
    • List list = new Array() 될수없다. (컴파일 오류)
  • 제네릭은 배열을 허용하지 않는다
    • ArrayList<String> list[] = new ArrayList<String>[3] 컴파일 오류!

29. 이왕이면 제네릭 타입으로 만들자

  • E[] 처럼 제네릭 배열은 실체화가 불가능 하다.
    • Object[] element = new E[3](x), (E[]) new Objcet[3] (o)

30. 이왕이면 제네릭 메서드로 만들자

  • 제네릭 메서드를 쓸경우 메서드에 를 써줘야한다.

    • 예시

      public static void main(String[] args) {
          List<SKB> skbs = new ArrayList<>();
          List<SKP> skps = new ArrayList<>();
          union(skbs);
          union(skps);
       }
      
      public static <E extends SKT> List<E> union(List<E> a){...}
      public static <E extends SKT> List<E> union(List<E> a, List<E> b){...}
      
  • 표식으로 사용할 수 도 있다.

    • <E extends Comparable<E>>는 모든 타입 E는 자신과 비교 할 수 있다.

31. 한정적 와일드 카드를 사용해 API 유연성을 높이자

  • 유연성을 극대화하려면 원소의 생산자나 소비자용 입력 매개변수에 와일드카드 타입을 사용하자.
  • T가 생산자라면 extends T, 소비자면 super T

32. 제네릭과 가변인수를 함께 쓸때는 신중하자

  • 가변인수(varargs)는 메서드에 넘기는 인수의 개수를 클라이언트가 조절 할 수 있게 한다

    • public void varargs(String ... params) 배열형태로 사용가능하다.
  • List ... 처럼 사용시 타입 안전성이 깨진다

  • @SafeVarargs 는 타입 안정성을 보장하는 장치

  • 가변인수 메서드를 호출할때 제네릭 배열이 만들어진다.

33. 타입 안전 이종 컨테이너를 고려하라

반응형

블로그의 정보

57개월 BackEnd

BFine

활동하기