JAVA - Generics

TopOfTheHead·2025년 7월 26일

자바 ( JAVA )

목록 보기
9/23

Generics : <Type>
타입 안정성( type safety )을 제공하기위해 타입 형 변환에서 발생할 수 있는 문제점을 사전에 없애기 위해 구축됨
type이 일치하지않아 발생하는 자료형 문제로부터 자유롭고 안전함

Class를 서로 다른 Type에도 재사용 가능한 코딩을 수행하기 위해 사용.
List<Integer> 처럼 Type을 강제하는것을 Generics이라고 한다.
Type이 일치하지 않는 데이터를 추가 시 문법 오류를 발생시켜 타입 안정성을 보장

。처리대상의 자료형에 의존하지 않으면서 Class 또는 Interface를 구현할 수 있다.
▶ 자료형에 의존하지 않으므로 범용(generic)으로 활용가능.

castingboxing / unboxing에 따른 성능 저하를 없앰

placeholder ( <> ) 라는 template 활용
<> 안에 아무런 문자가 들어가도 상관 없으나 관습적으로 T를 사용.

 public class Stack<T>
  {
      T[] data = new T[5];
  }
  public class Program
  {
      static void Main(string[] args)
      {
          Stack<int> s1 = new Stack<int>(); // 정수형 설정.
          Stack<string> s2 = new Stack<string>(); // 문자열 설정.
      }    
  }
  • 매개변수를 쉼표로 구분 시 여러개를 지정 가능
    class 클래스이름 < 매개변수1, 매개변수2 , .... >
class TwoGen<T,V>
{
  T ob1;
  V ob2;
  public TwoGen(T ob1, V ob2)
  {
      this.ob1 = ob1;
      this.ob2 = ob2;
  }
  public T OB1 { get { return ob1; } }
  public V OB2 { get { return ob2; } }
}
internal class Program
{
  static void Main(string[] args)
  {
      TwoGen<int, string> t1 = new TwoGen<int, string>(150,"hello");
      Console.WriteLine(t1.OB1 + t1.OB2) ;
  }
}
  • Generic type의 명명규칙
    place holder에서 정의하는 규칙
    ▶ 규칙을 지켜야 컴파일이 되거나 하는건 아니지만 통일성을 위해 규칙을 따르는게 좋다.

    <E> : 요소 ( Element )
    Collection에서 주로 사용
    ex ) ArrayList<E>

    <K> : Key

    <V> : Value

    <N> : 숫자

    <T> : Type

    <S>,<U>,<V> : 2 , 3 , 4번째에 선언된 Type.

Type Wildcard : <?>
。어떤 타입이든 올 수 있다는 의미의 unknown type
Genericplaceholder에 지정.
List<?> : 모든 typeList를 의미.
List<?> list1 = new ArrayList<String>();

와일드카드 종류

  • Unbounded Wildcard ( <?> ) :
    。아무 타입이나 상관없이 사용 가능.
    ex ) List<?>

  • 상한 제한 Wildcard ( <? extends T> ) :
    T 또는 T의 하위 type만 허용
    읽기 전용으로 주로 활용
    ▶ 값을 읽을 수 있어도 구체적인 type을 모르므로 요소 추가는 불가능

    ex ) List<? extends Number> list = new ArrayList<Integer>(); :
    Number의 하위 TypeNumber , Integer , Double , Float를 허용.

  • 하한 제한 Wildcard ( <? super T> ) :
    T 또는 T의 상위 type만 허용
    쓰기 위주로 주로 사용
    ▶ 요소 값 추가가 가능

    ex ) List<? super Integer> list = new ArrayList<Number>(); :
    Integer의 상위 TypeInteger , Number , Object를 허용

    Producer extends, Consumer super 법칙
    <? extends T> : 데이터 읽기용도로 활용

    <? super T> : 데이터 쓰기용도로 활용
    ex ) Comparator<? super T>는 비교용도로 활용하므로 super 사용

profile
공부기록 블로그

0개의 댓글