CH12-1 지네릭스란?

[자바의 정석 - 기초편] ch12-1 지네릭스란?

지네릭스(Generics)란? **컴파일타임때 타입을 체크(**Compile-time type check)해주는 기능이다!

이 기능이 언제필요할까?

예를 들면… ArrayList같은 컬렉션들은 모든 타입의 객체(Object obj)를 인자로 받을 수 있다.

때로는 이 인자의 타입에 제한을 두고 싶다. 이때 사용하는게 지네릭스임.

Untitled

이렇게 ArrayList생성시 지네릭스에 Tv를 넣어주면… 컴파일타임때 이외의 타입이 들어가는걸 막아준다.

예제를 보자.

import java.util.ArrayList;

public class GenericText {

	public static void main(String[] args) {
		ArrayList list = new ArrayList();
		list.add(10);
		list.add(20);
		list.add("30");
		
		Integer i = (Integer)list.get(2); //실행시 에러 (ClassCastException)
		
		System.out.println(i);
	}
}

위의 코드를 실행시키면… 컴파일타임때는 문제없이 컴파일되지만, 문제의 줄을 실행하는 순간 에러가 난다. list[2]String인데, 이걸 강제로 (Integer)로 형변환하고있기 때문이다.

실행 에러는 컴파일에러보다 치명적이다. 컴파일에러는 애초에 실행이 안되므로 문제를 잡을 수 있지만.. 실행 에러는 잘 실행되는 것 처럼 보이던 프로그램이 갑자기 종료되어버릴 수 있기 때문

위처럼 컴파일타임때 잡아주지 못하는 에러를 어떻게 해결할지에 대한 대답이 지네릭스다. 지네릭 문법은 실행에러를 컴파일에러로 끌고오기위한 고민의 결과이다.

ArrayList<Integer> list = new ArrayList<Integer>();

이렇게 실행하면… integer 만 저장할 수 있는 컬렉션이 만들어진다. (보니까 원시타입은 안되고, 래퍼타입을 넣어줘야 한다.)

위처럼 선언하고 나면 다른 타입을 list에 넣으려고 할때 컴파일 오류가 난다.

import java.util.ArrayList;

public class GenericText {

	public static void main(String[] args) {
		ArrayList<Integer> list = new ArrayList<Integer>()
		list.add(10);
		list.add(20);
		list.add("30"); //컴파일 오류
	}
}

Untitled