Java

[Java] generic - 1

비번변경 2026. 3. 6. 10:04

개요

2026.02.25-[Java] ArrayList 등의 글에서 리스트 내 데이터 원소의 타입을 지정할 때 데이터 타입을 꺽쇠로 감싸서 지정하는데, 이는 제네릭(generic)이라는 개념이다. 뭔지 정확하게 모르고 사용을 해왔으니 이번 글에서는 generic에 대해서 조금 다뤄볼까 한다.

 

 

generic

generic은 사전적으로 '일반적인'이라는 의미를 가지고 있는데, Java에서는 하나의 값이 데이터 형식에 의존하지 않고 여러 데이터 타입을 가질 수 있도록 하는 방법을 의미한다. 다른 말로는 클래스 내에서 사용할 데이터 타입을 외부에서 지정하는 기법이라고 한다.

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

주로 List 등에 사용되는데, List와 같은 자료구조를 직접 구현하여 배포하려고 한다. 이 자료구조는 String, Integer, Double 등 다양한 타입을 지원하고자 한다. 이때 각 데이터 타입에 대한 클래스를 별도로 구현해야 할까? 이러한 비효율을 해소하기 위해 generic을 사용한다.

ArrayList 선언을 통해 확인할 수 있듯, generic은 컬렉션 내에서 사용할 내부 데이터 타입을 파라미터로 전달하듯 외부에서 지정한다. 조금 풀어서 말하면 타입을 변수화한 것이라고 생각할 수 있다.

 

 

장점

컴파일 시 타입 오류 방지

generic은 java 1.5에 추가된 기법으로, 그 전에는 여러 타입을 다루기 위해서는 Object를 사용했다. 이때 객체를 다시 원하는 타입으로 변환해주어야 했기 때문에 런타임에서 오류가 발생할 가능성이 많았다.

하지만 generic을 사용하면 컴파일 타임에 타입 오류를 확인할 수 있기 때문에 개발에 용이하다.

 

불필요한 캐스팅 방지

Object를 통해 여러 타입을 다룰 때는 요소를 가져오면서 다운캐스팅이 필요했다. 하지만 generic은 사전에 데이터 타입을 지정하고 제한하기 때문에 캐스팅에 대한 번거로움과 오버헤드를 줄일 수 있다. 뿐만 아니라 타입 검사에 들어가는 메모리도 절감하며 가독성도 챙길 수 있다.

 

 

제네릭 타입 매개변수

generic에서 데이터 타입을 지정하는 꺽쇠는 다이아몬트 연산자라고 한다. 꺽쇠 내에 식별자 기호를 지정함으로써 파라미터화하는데, 메서드가 매개변수를 받아 사용하는 것과 비슷하기 때문에 타입 매개변수, 타입 변수라고 부른다.

타입 매개변수는 generic을 이용한 클래스, 메서드를 설계할 때 사용한다. 아래는 generic을 사용한 클래스 정의 코드로, 클래스 이름 옆에 <T>로 generic을 붙여주었다.

class FruitBox<T> {
    List<T> fruits = new ArrayList<>();

    public void add(T fruit) {
        fruits.add(fruit);
    }
}

그리고 클래스 내에서 T를 클래스 필드와 메서드 매개변수의 타입으로 지정했다. 이를 인스턴스화하면 아래와 같다.

// 제네릭 타입 매개변수에 정수 타입을 할당
FruitBox<Integer> intBox = new FruitBox<>(); 

// 제네릭 타입 매개변수에 실수 타입을 할당
FruitBox<Double> intBox = new FruitBox<>();

// 다른 클래스
FruitBox<Apple> intBox = new FruitBox<Apple>();

생성 코드에서 다이아몬드 연산자 내에 타입을 지정하면 generic 클래스 선언 내에서 T로 지정된 부분이 모두 전달받은 타입으로 변환된다.

이것을 generic 타입 전파 또는 구체화라고 한다.

 

 

참고 문서

☕ 자바 제네릭(Generics) 개념 & 문법 정복하기

https://st-lab.tistory.com/153

 

 

728x90