Java Generic은 데이터 형식에 의존하지 않고, 하나의 값이 여러 다른 데이터 타입들을 가질 수 있도록 하는 Java 프로그래밍 언어의 기능이다.
특정 타입이 아닌 모든 타입에 함께 작동할 수 있는 클래스, 인터페이스 및 메서드를 만들 수 있어 코드의 재사용성을 높일 수 있다는 장점이 있다.
제네릭이란?
제네릭(Generic)은
•
클래스 내부에서 지정하는 것이 아닌 외부에서 사용자에 의해 지정되는 것을 의미
•
특정(Specific) 타입을 미리 지정해주는 것이 아닌 필요에 의해 지정할 수 있도록 하는 일반(Generic) 타입이라는 것
ArrayList<Integer> list1 = new ArrayList<Integer>();
ArrayList<String> list2 = new ArrayList<String>();
LinkedList<Double> list3 = new LinkedList<Double>():
LinkedList<Character> list4 = new LinkedList<Character>();
Java
복사
Box라는 클래스를 선언하고 내용물에 content 필드를 선언하려고 할 때,
타입을 무엇으로 해야 할까?
Box에는 다양한 내용물을 넣을 예정이라 특정 클래스 타입이 아닌 Object로 선언해보자.
public class box {
public Object content;
}
Java
복사
→ 모든 객체는 부모 타입으로 자동 타입 변환이 되므로 cotent 필드에는 어떤 객체든 대입이 가능하다.
하지만 문제는 Box 안의 내용물을 얻을 때이다.
content는 Object 타입이므로 어떤 객체가 대입되어 있는지 확실치 않아 얻을 때 마다 강제 타입 변환을 해야한다.
String content = (String) box.content;
Java
복사
이러한 문제점을 어떻게 해결할 수 있을까?
우리는 Box를 생성하기 전에 어떤 내용물을 넣을지 이미 알고 있다. 따라서 Box를 생성할 때 저장할 내용물의 타입을 미리 알려주면 되지 않을까?
→ 제네릭 등장!
위 관점에서 제네릭이란, 결정되지 않은 타입을 파라미터로 처리하고 실제 사용할 때 파라미터를 구체적인 타입으로 대체시키는 기능이다.
public class Box <T> {
public T content;
}
public static void main(String[] args) {
Box<String> box = new Box<String>();
box.content = "안녕하세요";
String content = box.content; // 강제 타입 변환 없이 값을 바로 얻음!
}
Java
복사
장점 및 활용점
•
타입 안정성
잘못된 타입이 들어오는 것을 컴파일 단계에서 인지하고 에러 발생시켜 실행 중에 일어나는 에러(RuntimeException)을 방지한다
•
타입 변환(casting)을 제거
프로그램 성능에 좋지 않은 강제형변환 불필요
•
코드의 재사용성
특징
•
클래스, 인터페이스, 메소드를 정의할 때 타입을 파라미터로 사용할 수 있다.
단, 타입 파라미터로 명시할 수 있는 것은 참조 타입(Reference Type)만 가능.
→ int, double, char 같은 primitive type은 올 수 없다.
•
제네릭 타입을 사용하여 객체를 생성하는 것은 불가능
참조
•
이것이 자바다 - 책