자바 제네릭(Generic) | 자바 입문강좌 40

자바 제네릭(Generic)

프로그램에서는 자료형을 사용합니다. 자료형에는 기본 자료형이 있고 객체 자료형이 있습니다. 프로그램 마다 자료형에 맞게 맞춰야 한다는 것은 많은 작업량을 의미합니다.

이런 문제들에서 해결하기 위해 자바 제네릭을 사용합니다. 제네릭 프로그래밍에서는 필요에 따라 자료형을 다양하게 바꿀 수 있습니다.

제네릭 예제

간단한 제네릭 예제를 통해 알아보겠습니다.

제네릭 클래스는 <> 다이아몬드 연산자를 사용합니다. <> 이 안은 식별자 규칙에 따라 이름을 지을 수 있습니다. 이름은 별로 중요하지는 않습니다. 예를 들어 <DT> 를 했다면 컴파일 과정에서 DT 는 Object 로 변형될 것 입니다.

Object로 변형하는 것은 타입캐스팅을 통하여 어떤 클래스라도 적용시킬 수 있도록 하기 위해서입니다. 제네릭 클래스의 생성이 가능한지 여부는 컴파일러가 판단하기 때문에 런타임 안정성이 향상됩니다.

제네릭 클래스는 다양한 응용이 가능한데 JDK의 콜렉션 프레임워크에서 유용하게 사용됩니다. 예를 들어 ArrayList 는 제네릭 클래스를 사용하여 어떤 클래스라도 배열로 만들 수 있습니다. 콜렉션 프레임워크에서 제네릭을 지원하지 않았다면 프로그래머가 각각 자료형을 따로 만들어야 했겠죠?

제네릭을 사용하면 그냥 < > 다이아몬드에 넣기만 하면 되기 때문에 상당히 유용합니다.

아래 예제에서는 두개의 클래스 A1 과 B1 을 하나의 제네릭 클래스에서 멤버변수로 사용하는 것을 볼 수 있습니다.

package com.kay;

public class Main {

    public static void main(String[] args) {
        GenericClass<A1> ngr1 = new GenericClass<A1>();

        ngr1.setData(new A1());
        ngr1.getData().showInfo();

        GenericClass<B1> ngr2 = new GenericClass<B1>();

        ngr2.setData(new B1());
        ngr2.getData().showInfo();
    }
}

// DT는 Object 로 컴파일됨
class GenericClass<DT>{
    private DT obj1;

    public DT getData() {
        return obj1;
    }
    public void setData(DT obj1) {
        this.obj1 = obj1;
    }
}

class A1{
    public void showInfo(){
        System.out.println("A1 sout");
    }
}

class B1{
    public void showInfo(){
        System.out.println("B1 sout");
    }
}
A1 sout
B1 sout

요약

아주 간단하게 자바 제네릭에 대하여 살펴봤습니다. 제네릭은 말 그대로 일반적인 무엇인가를 의미합니다. 그냥 제네릭 코드만 많이 짠다고 이해가 빨리 되지 않으니까 제네릭을 많이 쓰고 또 자바에서 가장 중요한 데이터 구조인 컬렉션 프레임워크를 통해서 배우는게 좋습니다.

콜렉션 프레임워크가 제네릭의 실습에 좋습니다.

여기서 가져갈 아이디어는 제네릭의 <T> 의 T는 Object 클래스라는 것 입니다. Object 이기 때문에 모든 클래스로 캐스팅할 수 있습니다. 제네릭도 결국 다형성을 사용하는 것 입니다.

C++ 에는 템플릿이라는게 자바의 제네릭과 비슷합니다. 어느 언어건 비슷한 문제를 해결하기 위해 비슷한 알고리즘을 사용합니다. 그래서 언어 하나를 제대로 하는게 중요합니다.

다음 포스팅은 콜렉션 프레임워크를 알아보겠습니다.

외부참고문서

Why Use Generics? 자바 제네릭을 왜 사용하나? (oracle.com)

The Basics of Java Generics | Baeldung

Java – Generics – Tutorialspoint

Generics in Java – javatpoint

Generics in Java – GeeksforGeeks

Leave a Comment