개발 일기

제네릭, 타입변수 본문

Java&Spring/Java

제네릭, 타입변수

flow123 2021. 12. 13. 09:28

제네릭 

 

-컴파일 시 타입을 체크해주는 기능 (ClassCastException 형변환 에러 방지)

-객체의 타입 안정성을 높이고 형변환의 번거로움을 줄여줌 (코드도 간결해짐)

 

왼쪽 예제를 보면, get(0)이 object 타입이기에 형변환을 해야한다. 

반면 오른쪽예제에서는 tvLIst가 <Tv> 형이기 때문에 형변환이 불필요하다. 

 

ArrayList<E> 지네릭 클래스. 클래스 안에 object 타입이 있는 것들은 일반 클래스에서 Generic class 로 바뀌었다. 

이전에는 다른 타입을 저장하면 체크를 못해줬는데, 제네릭스의 등장이후 이를 컴파일 에러로 잡을 수 있게 되었다. \

클래서 옆에 <E> 가 들어가면, 지네릭 클래스다  

 

<Integer>라고 지정해줬기 때문에, (Integer)형변환을 생략할 수 있다. 

 

public class GenericTest {
	public static void main(String[] args) {
//		ArrayList<Integer> list = new ArrayList<E>(); // JDK 1.5 이전 지네릭스 도입 이전. 
//		ArrayList<Object> list = new ArrayList<Object>(); //jdk 1.5 이후
		ArrayList<Integer> list = new ArrayList<Integer>(); //jdk 1.5 이후

		list.add(10); //list.add(new Integer(10)); 
		list.add(20);
		list.add(30);
		
		Integer i = list.get(2); //형변환 생략 가능 
		System.out.println(list);
		

	}
}

Generics 는 타입 체크를 강화한다.

여러 타입을 넣고 싶다면, ArrayList<Object>라고 넣어준다. 단 Object Class 는 형변환이 필요하다. 

public class GenericTest {
	public static void main(String[] args) {
//		ArrayList<Integer> list = new ArrayList<E>(); // JDK 1.5 이전 지네릭스 도입 이전. 
		ArrayList<Object> list = new ArrayList<Object>(); //jdk 1.5 이후

		list.add(10); //list.add(new Integer(10)); 
		list.add(20);
		list.add("30");
		
		String i = (String)list.get(2); //Object -> spring convert 가 안되기 때문에, String 형변환 추가. 
		System.out.println(list);

	}
}

 

타입변수란? 

제네릭 클래스 작성시 기존의 Object 타입 대신 타입변수(E) 선언해서 사용 (JDK 1.5이후로 바뀌었다) 

JDK 1.5 이후로 Object를 포함한 클래스들은 Generic 클래스로 바뀌었다. 

<T> 타입 혹은 <E> element 로 선언한다. 

실제로 응용할 때는, <T> 혹은 <E> 대신 실제 타입을 지정한다. 

글 맨 처음에 나온 예제처럼, 타입변수대신 실제 타입이 지정되면 형변환을 생략할 수 있다. 

 

제네릭 메서드

public <자료형 매개변수> 반환형 메서드 이름 (자료형 매개변수) { }

 

*반환형 앞에 사용하는 <자료형 매개변수> 는 여러개일 수 있으며, 이는 메서드 내에서만 유효하다. 

 

출처: 자바의 정석 ch12-1 , 자바 프로그래밍 입문 

 

Comments