🔙뒤로가기

Generics 개요

제네릭스(Generics)는 클래스나 메서드에서 사용할 내부 데이터 타입을 컴파일 시에 미리 지정하는 방법을 제공한다. 제네릭스를 사용하면 코드 내에서 사용되는 객체의 타입 안정성을 높이고, 형변환을 줄일 수 있다.

예를 들어, ArrayList를 사용할 때 List 객체를 만들고 데이터를 추가하거나 가져올 때마다 데이터 타입을 체크하고 형변환하는 작업을 반복해야 했다.

ArrayList list = new ArrayList();

// 데이터 추가
list.add("Hello");
list.add("World");

// 데이터 가져오기
String first = (String) list.get(0);
String second = (String) list.get(1);

이 예시에서는 ArrayList에 문자열을 저장하고 있지만, 컴파일러는 리스트가 어떤 타입의 객체를 저장하는지 알 수 없다. 따라서 데이터를 가져올 때마다 String 타입으로 형변환을 수행해야 한다.

더욱이, 이 리스트에는 어떤 타입의 객체든지 저장할 수 있기 때문에, 실수로 잘못된 타입의 객체를 추가하는 것을 컴파일 타임에 방지할 수 없다. 예를 들어, 다음과 같은 코드는 컴파일 에러 없이 실행된다.

list.add(123); // 정수타입 데이터 추가

그러나 이 리스트의 모든 요소가 문자열이라고 가정한 상황에서, 이 리스트에서 요소를 가져오려고 하면 ClassCastException이 발생할 것이다.

String third = (String) list.get(2); // ClassCastException 발생

하지만 제네릭스를 이용하면, 처음 List를 만들 때 그 List가 다루게 될 데이터 타입을 명시할 수 있고, 이후에는 데이터를 추가하거나 가져올 때마다 형변환을 하지 않아도 된다.

컬렉션 프레임워크에서 Generics 사용법

컬렉션 프레임워크에서 제네릭스를 사용하면, 컬렉션에 저장되는 객체의 타입을 명시적으로 선언할 수 있다. 이를 통해 타입 안정성을 높이고, 형변환을 줄일 수 있다.

다음은 컬렉션 프레임워크에서 제네릭스를 사용하는 예시이다.

// Integer 타입의 객체만 저장할 수 있는 ArrayList
ArrayList<Integer> integerList = new ArrayList<Integer>();

// String 타입의 객체만 저장할 수 있는 HashSet
HashSet<String> stringSet = new HashSet<String>();

// Key가 String 타입이고 Value가 Integer 타입인 HashMap
HashMap<String, Integer> map = new HashMap<String, Integer>();