Back-end/JAVA

JAVA - Generic

개발자 키우기 2023. 10. 15. 14:54

Generic은 자바에서 컴파일 시 타입을 안전하게 처리하기 위한 기능이다.

 

Generic 장점

 

1. 컴파일러가 타입을 검증하기 때문에 에러 조기 발견

 

2. 코드의 재사용성 및 유연성 ( 특히 컬랙션 )


Generic 클래스

 

객체를 생성할 때 Generic 타입을 지정

 

Box박스 클래스는 <T, M>의 T와 M이라는 타입 매게 변수를 가지고 있다가

 

객체 생성시 원하는 타입을 넣어 사용할 수 있다.

 

public class Box<T, M> {
  private T t;
  private M m;

  public M getM() {
    return m;
  }

  public void setM(M m) {
    this.m = m;
  }

  public T getT() {
    return t;
  }

  public void setT(T t) {
    this.t = t;
  }
}
public static void main(String[] args) throws Exception {
  Box<String, Integer> stringBox = new Box<>();
  Box<Integer, String> integerBox = new Box<>();
}
public static void main(String[] args) throws Exception {
  Box<String, Integer> stringBox = new Box<>();
  Box<Integer, String> integerBox = new Box<>();
}

Generic 메서드

 

메서드를 호출할때 Generic 타입을 지정 ( 생략 가능 )

 

타입 매개변수 - <T extends String, M extends Integer >

반환 타입 - void

메서드명 - printBox

매개변수 - (T t, M m)

 

일반적인 메서드와 다르게 반환타입 앞에 타입 매개변수가 추가되었다.

 

그 이유는 매개변수란에 타입 매개변수까지 들어가면 너무 많은 길이의 매개변수란으로 채워지기 때문에 가독성이

 

떨어지기 때문이며 사용할 때는 아래와 같이 생략이 가능하다

 

public <T extends String, M extends Integer> void printBox(T t, M m){
  System.out.println("t = " + t);
  System.out.println("m = " + m);
}
public static void main(String[] args) throws Exception {
  Box<String, Integer> stringBox = new Box<>();
  stringBox.printBox("사과", 123);
  stringBox.<String, Integer>printBox("사과", 123);
}

와일드카드의 종류

 

<?> 와일드카드

 

어떤 타입이든 사용 가능한 것을 나타내며 타입 안정성을 유지하면서 다양한 타입을 다룰 때 사용

 

<? extends 상위타입> 상위 한정 와일드카드

 

상위타입과 상위타입의 모든 하위 타입까지 사용

 

<? super 하위타입> 하위 한정 와일드카드

 

하위타입과 하위타입의 모든  상위 타입까지 사용


Generic 상속 ( 클래스 / 인터페이스 )

 

클래스를 만들면서 Generic 타입을 지정할 수도 있고

 

객체를 생성하면서 타입을 지정할 수도 있다.

 

public class StrIntBox extends Box<List<String>, Integer> { }

public class StrIntBox extends Box { }

자주 사용되는 약어 관행

 

<T> Type

<E> Element

<K> Key

<V> Value

<N> Number