Link Search Menu Expand Document

Java Generic

Table of contents

  1. What is Generic?
  2. Declaration and Creation
  3. Why Use Generic Type?
  4. Advantage of Generic Type
  5. Delete Generic
  6. Generic Method
  7. Bounded Type Parameter

Generic Basic

What is Generic?

제네릭(generic)이란 데이터의 타입(data type)을 일반화한다(generalize)는 것

즉, 클래스나 메소드에서 사용할 내부 데이터 타입을 컴파일 시에 미리 지정하는 방법

자바 5부터 추가됨

제네릭은 클래스와 인터페이스, 메서드를 정의할 때 타입을 매개값으로 사용할 수 있도록 함

타입파라미터는 코드 작성시에 구체적인 타입으로 선언되어서 다양한 객체들을 생성할 수 있도록 함

Declaration and Creation

제네릭은 클래스와 메소드에만 다음과 같은 방법으로 선언가능함

제네릭타입은 타입을 파라미터로 갖는 클래스와 인터페이스를 말함

T : 타입 변수(type variable), 임의의 참조형 타입을 의미

▸ 어떠한 문자를 사용해도 상관없으며, 여러 개의 타입 변수는 쉼표(,)로 구분하여 명시

▸ 타입 변수는 클래스에서뿐만 아니라 메소드의 매개변수나 반환값으로도 사용

▸ 클래스 또는 인터페이스 이름 뒤에 <>부호를 붙이고 사이에 타입변수가 위치

▸ 타입 변수는 변수명과 동일한 규칙에 따라 선언이 가능하지만 일반적으로 대문자 알파벳 한글자로 선언

class MyArray<T> {

    T element;
    void setElement(T element) { this.element = element; }
    T getElement() { return element; }

}

위와 같이 선언된 제네릭 클래스(generic class)를 생성할 때에는 타입 변수 자리에 사용할 실제 타입을 명시해야 함

▸ Integer에는 타입 변수 자리에는 Wrapper Class를 사용해야함

MyArray<Integer> myArr = new MyArray();
MyArray<Integer> myArr = new MyArray<>(); // Java SE 7부터 가능
MyArray<Integer> myArr = new MyArray<Integer>();

Why Use Generic Type?

  1. 클래스나 메소드 내부에서 사용되는 객체의 타입 안정성을 높힘

  2. 반환값에 대한 타입 변환 및 타입 검사에 들어가는 노력을 줄일 수 있음

  3. 컴파일단계에서 잘못된 타입 사용될수 있는 문제를 제거 가능

  4. 컬렉션, 람다식(함수적 인터페이스), 스트림 NIO(New Input Output에서)에서 널리 사용되기 때문에 제네릭을 이해하지 못하면 자바의 API문서를 이해하지 못함

Advantage of Generic Type

  1. 컴파일시 강한 타입 체크 가능

    자바컴파일러는 코드에서 잘못 사용되는 타입때문에 발생하는 문제점을 사전에 제거하기 위해 제네릭 코드에서 강한 타입체크를 함

    실행시 타입 에러가 나는것 보다 컴파일 시 미리 타입을 강하게 체크해서 에러를 사전에 방지

  2. 타입변환 제거 가능

    비제네릭코드는 불필요한 타입변환을 하기 때문에 프로그램 성능에 악영향을 미치게 됨

    제네릭을 사용하면 사전에 정해진 타입으로만 제한시키기 때문에 불필요한 타입변환을 할 필요가 없어 프로그램의 성능이 향상됨

Delete Generic

자바 코드에서 선언되고 사용된 제네릭 타입은 컴파일 시 컴파일러에 의해 자동으로 검사되어 타입 변환됨

그리고서 코드 내의 모든 제네릭 타입은 제거되어, 컴파일된 class 파일에는 어떠한 제네릭 타입도 포함되지 않게 됨

이런 식으로 동작하는 이유는 제네릭을 사용하지 않는 코드와의 호환성을 유지하기 위해서임


Generic Method

<T,R> R method(T, t)

제네릭 메서드는 매개타입과 리턴타입으로 타입파라미터를 갖는 메서드를 말한다.

선언

리턴타입앞에 <>기호를 추가하고 타입파라미터를 기술한 후에 리턴 타입과 매개타입으로 타입파라미터를 사용하면 됨

public <타입파라미터> 리턴타입<타입파라미터> 메서드명(매개변수 ...) {...}

제네릭 메서드는 두가지 방식으로 호출할 수 있음.

코드에서 타입 파라미터의 구체적인 타입을 명시적으로 지정해도 되고, 컴파일러가 매개값의 타입으로 보고 구체적인 타입을 추정하도록 할 수 있음


Bounded Type Parameter

제한된 타입파라미터

타입 파라미터에 지정되는 구체적인 데이터 타입을 제한할 필요가 있을 경우,

예를 들어 숫자를 연산하는 제네릭 메서드가 있다면 이 메서드는 매개값으로 숫자만 들어와야 함

즉, 매개값을 Number 또는 하위클래스타입(Byte, Integer, Long, Float, Double)등의 인스턴스(객체)만 가져와야 함

이게 제한된 타입파라미터(Bounded Type Parameter)가 필요한 이유

제한된 파라미터를 선언하려면 타입 파라미터 뒤에 extends키워드를 붙이고 상위타입을 명시하면 됨

상위 타입은 클래스 뿐만 아니라 인터페이스도 가능한데 인터페이스라고 implements로 선언하지 않고 클래스와 동일하게 extends키워드를 사용

타입 파라미터에 지정되는 구체적인 타입은 상위타입이거나 상위타입의 하위 또는 구현 클래스만 가능


이 웹사이트는 jekyll로 제작되었습니다. Patrick Marsceill, Distributed by an MIT license.