본문 바로가기
개발/Java

자바 기본 - 제네릭

by 컴쏘 2024. 11. 6.

 

제네릭은 자바 기본과 객체 지향(4) 에서 잠깐 언급한 적이 있다. 간단하게 복습해보자면 다음과 같다. 

  • Primitive Type은 Generic Type에 사용 불가하다. 
  • Reference Type은 Generic Type에 사용 가능하다. 

Generic이 무엇이길래 그럴까? 이번에 알아보자. 

 

Generics

Java에서 Generics는 클래스 내부에서 사용할 데이터 타입을 외부에서 지정하는 기법을 의미한다. 객체별로 다른 타입의 자료가 저장될 수 있도록 한다. 

  • 컬렉션 클래스나 메소드에서 사용할 내부 데이터 타입(type)파라미터(parameter) 주듯이 외부에서 지정하는 타입을 변수화 한 기능이다. 
ArrayList<String> list = new ArrayList<>();

 

위의 코드 처럼 <> 괄호가 제네릭이다. <> 안에는 타입명을 기재한다. 그러면 해당 타입명만 다룰 수 있다. 

  • <> 괄호는 다이아몬드 연산자라고도 한다. 
  • <> 안에 식별자 기호를 지정함으로써 파라미터화 할 수 있다. 그리고 이를 마치 메소드가 매개변수를 받아 사용하는 것과 비슷하다고 하여 제네릭 타입 매개 변수 / 타입 변수라고 부른다. 
  • T 식별자 기호가 클래스 필드와, 메소드의 매개변수의 타입을 지정하는데 사용된다. (<T> 이런식으로 사용)
제네릭 타입 전파
부분에서 타입을 받아와 내부의 T 타입으로 지정한 멤버들에게 전파하여 타입이 구체적으로 설정되는 것

구체화라고도 한다.

 

타입 파라미터 할당 가능 타입

위에서 미리 보았듯이, 제네릭에서 할당 받을 수 있는 타입은 Reference 타입이다. int, double 과 같은 Primitive 타입은 사용할 수 없는데, 이를 위해서 Wrapper 클래스인 Integer, Double 클래스가 사용된다. 

 

 

그럼 Generic을 왜 사용할까? 

Generic 사용 이유

  1. 컴파일 타임에 타입 검사를 통해 예외를 방지 : 만약, Object 타입이라면 특정 타입으로 사용하기 위해 타입 캐스팅이 필요하다. 이때 잘못된 타입 캐스팅을 방지할 수 있다. 
  2. 불필요한 캐스팅을 없애 성능 향상 : 위 처럼 Object일 때 특정 타입으로 사용하기 위한 타입 캐스팅을 생략할 수 있다. 

 

+) 더 알아보기 : Generic 사용 시 주의 사항 

더보기
  1. 제네릭 타입 자체로 타입의 지정하여 객체를 생성하는 것은 불가능하다. (new 연산자 뒤에 제네릭 타입 파라미터가 올 수 없다.)
  2. static 멤버에 제네릭 타입이 올 수 없다. (static 변수의 데이터 타입으로 제네릭 타입 파라미터가 올 수 없다. - static 멤버는 클래스가 동일하게 공유하는 변수로 제네릭 객채가 생성되기 때문에 이미 자료 타입이 정해져 있어야 하기 때문(논리적 오류))
  3. 제네릭 클래스 자체를 배열(ex. new ArrayList<T>[10])로 만들 수 없다. (제네릭 타입의 배열 선언은 허용 - 명시적 캐스팅 필요 | ex. List<Integer>[] = new ArrayList[10];) 

 

참조 1