Java

Java - 제네릭스의 기본 개념( Generics )

비뀨_ 2022. 3. 11. 21:45

제네릭스란 무엇인가?

간단하게 말해서 Java에서 컴파일 시 컴파일러가 타입을 체크해 주는 기능이다.

List a = new ArrayList<>(); // 1번
//List<Object> a = new ArrayList<>(); //2번

Java 1.5 버전 이후 버전(JDK 1.7버전 부터) 지원이 된다.

위처럼 List형태의 ArrayList의 객체를 생성할 때 1번처럼 지네릭스를 사용하지 않고 객체를 생성한다면

타입을 명시 안했을 때 발생하는 경고

이런  raw type (파라미터가 없는 제네릭 타입)이며 타입을 지정하라는 경고가 뜬다.

 

타입 지정하지 않으면 문제점이 있는데 바로 여러 가지 타입이 짬뽕되어 있기 때문에 실행시 예외를 발생시키기 쉽다.

ClassCastException 발생 예

여러가지 타입이 있으면 나는 int를 꺼내다가 쓰고 싶은데, 실행하면 클래스 캐스트 예외가 발생합니다.

에러 없애려면 각각 담긴 타입을 아래처럼 처리해줘야한다.

이렇게 여러 타입은 꺼낼 때마다 맞는 형 변환을 해줘야 하기 때문이 복잡하고 경고가 떠서 보기 지저분하다.

 

제네릭의 역할

그렇기 때문에 제네릭의 역할은

  •  잘못된 타입이 들어가는 것을 막아주는 것 ( =데이터 타입 체크를 해서. 컴파일 전에 에러를 내서 수정하게.)
  •  데이터를 꺼낼 때의 형번환의 번거로움을 줄여주는 것

이라고 볼 수 있다.

 

제네릭을 썼을 때

그럼 위의 예제를 어떻게 바꿀 수 있을까?

 Integer로 이루어진 ArrayList와 String으로 이루어진 것을 만들어보자.

List<Integer> a = new ArrayList<>();
List<String> b = new ArrayList<>();

Generic 명시

위에서 썼을 때보다 코드의 가독성도 좋아지고 조건문 if를 통해서 추가적인 작업을 하지 않아도 되니 좋다.

그리고 String만 들어가야하는 b에 숫자를 넣을 때에는 바로 컴파일러가 오류를 나타내주기 때문에 좋다.

 

제네릭을 써야되는 클래스

이렇게 ArrayList처럼 <E>가 달린 클래스를 사용할 때 제네릭 타입을 작성해줘야 한다.