CNU SW 아카데미/2주차
[자바 프로그래밍] 제네릭
하가네
2024. 7. 10. 16:17
Generics는 Generic이라는 단어가 주는 의미처럼, 다양한 타입에 적용할 수 있는 객체를 만들수 있도록 지원한다.
- Generics 개요
- 강력한 타입 검사
- 형 변환 감소
- 일반 알고리즘의 구현
# 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) { ... }