Hello

Java 지네릭스(Generics)

by 볼빵빵오춘기

지네릭스(Generics)

  • 컴파일시 타입을 체크해 주는 기능이다.(compile-time-type check) - JDK1.5
더보기

ArrayList는 Object 배열을 가지고 있어서 모든 종류의 객체가 저장가능하다.

그런데 만약에 Tv만 저장하고 싶은데 지네릭스가 있기전에 Audio처럼 다른 것을 넣어도 잡아낼 수 없었다.

⇒ 따라서 지네릭스가 있고 난 후에 tvList처럼 Tv타입만 넣고 싶고 다른 타입을 넣으면 못들어오게 막아낸다.

 

예제 코드 - 컴파일시 타입을 체크해 주는 기능

import java.util.*;
import static java.util.Collections.*;

public class Try {

	public static void main(String[] args) {
	
		ArrayList list = new ArrayList();
		list.add(10);
		list.add(20);
		list.add("30"); // String을 추가 

//		Integer i = (Integer)list.get(2); // 주석처리 해제 전
		System.out.println(list);
	}

}

⇒ 빨간색 줄로 뜨거나 문제된다고 알려주는 표시가 나오지 않음. 컴파일해서 실행하면 결과값 잘나온다.

 

		Integer i = (Integer)list.get(2); // 주석처리 해제. 컴파일 시에는 문제 없음

예제 코드1에서 주석처리를 해제 하면

⇒ 컴파일 시에는 문제 없었지만 실행을 하면 형변환 에러발생한다.

🤔 why? 컴파일러의 한계로 인해서 코드의 문제를 잡아내지 못했다. 

이러한 이유로 지네릭스가 나왔다.

 

Integer타입만 저장할려면 다음과 같이 코드를 변경한다.

import java.util.*;
import static java.util.Collections.*;

public class Try {

	public static void main(String[] args) {
	
		ArrayList<Integer> list = new ArrayList<Integer>();
		list.add(10);
		list.add(20);
		list.add("30"); // String을 추가 
		
		Integer i = (Integer)list.get(2); 
		System.out.println(list);
	}

}

list.add("30"); 부분에 빨간줄이 뜨기 때문에 컴파일시에도 잘못됐다는 것을 알아차릴 수 있다.

또한 list.get(2)하면서 형변환을 해주고 변수 i에 넣어주는데 이 부분도 생략이 가능해진다.

 

🤔 위에 예로 Integer 타입만 들어올 수 있도록 해줬는데 Integer타입 말고 다른 타입도 넣고 싶다면?

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

Integer 썼던 부분에 Object로 넣어주면 된다.

But, <Object>가 생략이 가능하나 일반클래스에서 지네릭클래스로 변경된 부분이 있기때문에 써주길 바란다.

또한 위에서 (Integer)list.get(2); 형변환코드는 생략이 가능했으나 Object를 써줌으로써 다시 형변환코드를 다시 넣어주어야한다.

 

  • 객체의 타입 안정성을 높이고 형변환의 번거로움을 줄여준다.

 

지네릭스의 장점

  • 타입 안정성을 제공한다. 
  • 타입체크와 형변환을 생략할 수 있으므로 코드가 간결해진다.

 

지네릭스 & Exception

  • Exception ⇒ Runtime에러, 즉 실행중에 발생하는 에러
  • RuntimeException ⇒ 프로그래머실수로 발생하는 에러
  • ClssCastException ⇒ 형변환에러

✨ Runtime에러는 실행중에 발생하는 에러로 발생하면 프로그램이 종료가 된다.

실행시에 발생하는것보다 CompileTime에러가 낫다.(why? 우리가 프로그램을 실행하기전에 수정가능하기 때문이다.)

 

따라서 Runtime에러들을 컴파일에러들로 끌어올수있을까 고민하다가 ClssCastException는 컴파일타임에 타입정보를 줘서 Compile시 알 수 있도록 해온것이 지네릭스이다.

블로그의 정보

Hello 춘기's world

볼빵빵오춘기

활동하기