본문으로 바로가기

1. 제네릭의 등장

  • Java 5부터 Generic이라는 타입이 새로 추가되었습니다.
  • 잘못된 타입이 사용될 수 있는 문제를 컴파일 과정에서 제거가 가능해졌습니다.
  • 컬렉션, 람다, 스트림 등에서도 사용되므로 자바를 잘 활용하려면 이해해야 합니다.
  • 제네릭은 클래스, 인터페이스, 메소드를 정의할 때 타입을 파라미터로 사용할 수 있도록 도와줍니다.

 

2. 제네릭의 장점

컴파일 시 강한 타입 체크를 할 수 있다.

컴파일 시 에러를 다 도출해내기 때문에 실행 중에 일어나는 에러(RuntimeException)를 방지할 수 있습니다.

// List Integer 타입으로 제네릭 타입 적용
List<Integer> list = new ArrayList();
list.add(1);
list.add("5"); // ERROR java: incompatible types: java.lang.String cannot be converted to java.lang.Integer

 

 

타입 변환을 제거한다.(casting)

다음 예시와 같이 제네릭을 사용하지 않는 경우 불필요한 타입 변환이 필요하게 됩니다.

따라서 프로그램 성능에 좋지 않은 영향을 미칩니다.

List list = new ArrayList();
list.add(1);

// 강제 형 변환 필요 
Integer number = (Integer) list.get(0);

 

물론 제네릭을 사용하지 않으면 다음과 같이 모든 종류의 객체를 저장할 수 있습니다.

1. Object 형태로 변환되어 List에 쌓입니다.

이렇게 되면 저장할 때 타입 변환 발생, 2. 읽어올 때에도 타입 변환이 발생하게 됩니다.

List list = new ArrayList();
list.add(1);
list.add("5");
list.add(0.1);

Object o1 = list.get(0);
Object o2 = list.get(1);
Object o3 = list.get(2);

Integer num = (Integer) o1;
String str = (String) o2;
Long L = (Long) o3;

 

제네릭을 사용할 경우 List에 저장되는 요소를 Integer로 제한하기 때문에 get(index)할 경우 타입 변환이 필요가 없게 되어 프로그램 성능이 향상됩니다. 

List<Integer> list = new ArrayList();
list.add(1);

// 형 변환 필요 없음
Integer number = list.get(0);