notepad

Generics - 제네릭 사용 이유 본문

JAVA/JAVA

Generics - 제네릭 사용 이유

likewise_ 2020. 5. 27. 13:44

Lesson: Generics (Updated) (The Java™ Tutorials > Learning the Java Language)
Java Java의 Generics. Java 언어에서 언어적으로 가장 이해하기 어렵고 제대로 사용하기가… | by Leopold (백중원) | Medium

Generics

  • 클래스 내부에서 사용할 데이터 타입을 외부에서 지정하는 기법
  • 클래스, 인터페이스, 메서드를 정의할 때 유형이 매개 변수가 되도록 한다.
  • 일반 변수와 구분하기 위해 대분자 1자리 변수를 사용한다 T, S, etc

사용 이유

  1. 컴파일 타임에 유형 검사 -> 안정성 추가
  2. 불필요한 타입 캐스팅 제거
  3. 코드 재사용 가능

컨벤션

The most commonly used type parameter names are:

  • E - Element (used extensively by the Java Collections Framework)
  • K - Key
  • N - Number
  • T - Type
  • V - Value
  • S,U,V etc. - 2nd, 3rd, 4th types

바운드 타입 매개변수 > 특정 타입으로 제한한다 | 특정 타입의 서브타입으로만 유형 제한

  • class Pair {} - Number타입만 올 수 있도록 범위 제한
  • class <T extends A & B & C> Pair{} - Multiple Bounds , 클래스 하나와 인터페이스 여러개 선언 가능
    interface A {...}
    interface B {...}
    class C {...}
    class D <T extends C & B & A> {...} // Class 가 앞에 와야한다. 인터페이스가 먼저 오면 컴파일 오류
    // call
    D<AB> d = new D<>();
  • 제너릭 타입으로 받은 매개변수로 큰 값 비교와 같은 로직 구현 시 ‘>’ 와 같은 연산자를 사용할 경우 컴파일 오류가 발생한다. -> 연산자는 int, double, char 과 같은 기본 유형에만 적용되기 때문이다.
  • Comparable 인터페이스로 제한되는 형식 매개변수를 사용하여 구현한다.
    public static <T extends Comparable<T>> int countGreaterThan(T[] anArray, T elem) {
      int count = 0;
      for (T t : anArray) {
          if (t.compareTo(elem) > 0)
              ++count;
      }
      return count;
    }

와일드카드

  • 상한/하한/무제한 와일드카드
    • List <? extends T> : 데이터 타입을 자신과 자식으로 제한
    • List <? super T>: 데이터 타입을 자신과 부모 객체만 허용
    • List <?> : 자기 자신의 타입만 허용

upper, lower 와일드카드 사용 지침

사용 예제

class | interface

public class Pair<K, V> {
    private K key;
    private V value;

    public Pair(K key, V value) {
        this.key = key;
        this.value = value;
    }

    public void setKey(K key) { this.key = key; }
    public void setValue(V value) { this.value = value; }
    public K getKey()   { return key; }
    public V getValue() { return value; }
}

method

public class Util {
    public static <K, V> boolean compare(Pair<K, V> p1, Pair<K, V> p2) {
        return p1.getKey().equals(p2.getKey()) &&
               p1.getValue().equals(p2.getValue());
    }
}

//call
Pair<Integer, String> p1 = new Pair<>(1, "apple");
Pair<Integer, String> p2 = new Pair<>(2, "pear");
boolean same = Util.compare(p1, p2);

'JAVA > JAVA' 카테고리의 다른 글

[레시피2] 스프링코어 - POJO와 IOC컨테이너를 다루는 기술  (0) 2021.03.10
리플렉션  (0) 2020.09.04
JVM 이해하기  (0) 2020.09.01
Comments