CNU SW 아카데미/2주차

[자바 프로그래밍] 제네릭

하가네 2024. 7. 10. 16:17
Generics는 Generic이라는 단어가 주는 의미처럼, 다양한 타입에 적용할 수 있는 객체를 만들수 있도록 지원한다.

 

 

  1. Generics 개요
  2. 강력한 타입 검사
  3. 형 변환 감소
  4. 일반 알고리즘의 구현

 

 

 

# Generics

## Generics 개요

  • 객체 생성시 부여되는 타입을 이용한 파라미터 다형성(Parametric Polymorphism) 구현
  • 타입(Class, Interface) 또는 메소드에 정의
class Box<T> {
    T item;
    ...
}
Box<String> stringBox = new Box<>(“String”);
Box<Integer> integerBox = new Box<>(100);

class Box<T> {
    T item;

    public T simpleFunction(T item) { ... }
}

 

 

 

## 강력한 타입 검사

  • Generics는 타입 안정성(Type Safety)를 지원
    • 타입 파라미터를 통해 전달된 타입 정보를 이용하여 컴파일 타임에 검사
  • java.lang.Object 타입으로 변환되는 객체 형 변환은 런타임에 검사됨
    • 컴파일시에 오류를 발견할 수 없음
    • java.lang.ClassCastException 예외 발생
  • Generics는 타입이 명확히 명시되므로 컴파일 타임에 오류를 검출할 수 있음

 

 

 

## 형 변환 감소

  • 수퍼 타입을 서브 타입으로 변환하기 위해서는 타입 변환이 필요함
public class TypeSafetyExample {
    public static class Box {
        Object item;
        …
    }
    public static void main(String [] args) {
        …
        Integer value = (Integer) box.get();
        …
    }
}

 

  • Generic을 적용할 경우 별도의 타입 변환 과정을 필요로 하지 않음
public class TypeSafetyGenericsExample {
    public static class Box<T> {
        T item;
        …
    }
    public static void main(String [] args) {
        …
        Integer value = box.get();
        …
    }
}

 

 

 

## 일반 알고리즘의 구현

  • Generics는 알고리즘 일반화를 구현할 수 있도록 함
    • 다양한 타입의 객체들을 다루는 메소드나 컬렉션 클래스에 컴파일 시 타입 체크를 가능하도록 함
public static <T extends Comparable<T>> void bubbleSort(T[] items) {
    for(int i = items.length - 1 ; i > 0 ; i--) {
        for(int j = 0 ; j < i ; j++)  {
            if (items[j].compareTo(items[j+1]) > 0) {
                T item = items[j];
                items[j] = items[j+1];
                items[j+1] = item;
            }
        }
    }
}
  • 타입 파라미터가 Compatable의 서브 타입이면 정렬 가능하도록 정의
  • 비교 가능한 아이템의 경우 정렬이 가능하도록 선언하며, 특정 데이터 타입에 국한되지 않는 일반적인 알고리즘의 구현이 가능

 

 

 

# Generic 타입

  • 일반 타입 선언(클래스와 인터페이스)에 타입 파라미터를 추가한 형태로 사용
  • 타입 파라미터는 클래스나 인터페이스의 이름뒤에 선언하며, < > 기호 사이에 열거됨
  • 하나 이상의 타입 파라미터를 사용할 수 있음

 

 

# Generic 메소드

  • 일반 메소드 선언과 동일하며, 일반화 할 타입을 타입 파라미터로 선언
  • 메소드 앞에 <> 기호를 사용하여 타입 파라미터 목록을 선언
<Access Modifier> <Type Parameter List> <Return Type> Method name(Parameter list)

public <T> List<T> arrayToList(T[] array) { ... }