IT/Java

[Java] 제네릭 Generic

Huitopia 2024. 3. 20. 20:56
728x90

1. 제네릭(Generic)

자바에서 제네릭(generic)이란 데이터의 타입을 일반화한다는 것을 의미한다.

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

타입이 클래스 내부에서  지정하는 것이 아닌 외부에서 사용자에 의해 지정되는 것이며, 특정 타입을 미리 지정해주는 것이 아닌 필요에 의해 지정할 수 있도록 하는 타입이다.

 

미리 타입 검사 시 장점

  • 클래스나 메소드 내부에서 사용되는 객체의 타입 안정성을 높일 수 있다.
  • 타입체크와 형변환을 생략하므로 코드가 간결하다.

 

1-1. Generic 선언 및 생성

class MyArray<T> {
    T element;
    void setElement(T element) { this.element = element; }
    T getElement() { return element; }
}
// 클래스 선언
public class ClassName <T> { ... }
// 인터페이스 선언
public interface InterfaceName <T> { ... }
// 제네릭 클래스 생성
MyArray<Integer> myArr = new MyArray<Integer>();
// Java SE 7부터 가능한 인스턴스 생성시 타입 추정
MyArray<Integer> myArr = new MyArray<Integer>();
  • 타입 파라미터(<>) 안에는 T가 아닌 다른 문자 사용 가능하며, 여러개의 타입 변수는 쉼표(,)로 구분하여 명시한다.
  • 타입 변수는 클래스 및 메소드의 매개변수나 반환값으로도 사용 가능하다.
  • 제네릭 클래스 생성시 타입 변수 자리에 사용할 실제 타입을 명시한다.

 

1-2. Generic Type

타입 설명
<T> Type
<E> Element
<K> Key
<V> Value
<N> Number
<R> Return, Result
  • 제네릭 타입이란 결정되지 않은 타입을 파라미터로 가지는 클래스와 인터페이스를 의미한다.

 

 

2. Generic Method

public <타입 파라미터> 리턴타입 메소드명(매개변수, ...) { ... }
public static <T> void sort(...) {...}
  • 제네릭 메소드란 메소드의 선언부에 타입 변수(generic)를 사용한 메소드를 의미한다.
  • 타입 변수의 선언은 메소드 선언부 반환 타입 바로 앞에 위치한다.
  • 제네릭 클래스에 정의된 타입 매개변수와 제네릭 메소드에 정의된 타입 매개변수는 완전 별개이다.

 

예제 코드

더보기
public class Box<T> {
    private T t; // field
    // Getter method
    public T get() {
        return t;
    }
    // Setter method
    public void set(T t) {
        this.t = t;
    }
}
package ch13.sec03.exam01;

public class GenericExample {
    // Generic Method에 Type Parameter로 T 정의
    public static <T> Box<T> boxing(T t) {
        Box<T> box = new Box<T>();
        box.set(t);
        return box;
    }
    public static void main(String[] args) {
        // T를 Integer로 대체
        Box<Integer> box1 = boxing(100);
        System.out.println("box1.get() = " + box1.get());
        // T를 String으로 대체
        Box<String> box2 = boxing("집 언제 가");
        System.out.println("box2.get() = " + box2.get());
    }
}

 

 

3. 제한된 타입 파라미터(Bounded Type Parameter)

public <T extends 상위타입> 리턴타입 메소드(매개변수, ...) { ... }

class 클래스명<T extends 인터페이스명> { ... }
class 클래스명<T extends 클래스명&인터페이스명> { ... }
  • 모든 타입으로 대체할 수 없고, 특정 타입과 자식 또는 구현 관계에 있는 타입만 대체할 수 있는 타입 파라미터이다.
  • extends 키워드를 사용하여 타입 변수에 특정 타입만을 사용하도록 제한한다.
  • 제한을 걸어두면 클래스 내부에서 사용된 모든 타입 변수에 제한이 걸린다.
  • 인터페이스를 구현해도 extends 키워드를 사용한다.
  • 클래스와 인터페이스를 동시 상속받고 구현한다면 & 기호를 사용한다.

 

 

4. 와일드 카드(Wild Card)

// 타입에 제한 없음
리턴타입 메소드명(제네릭타입<?> 변수) { ... }
리턴타입 메소드명(제네릭타입<? extends Object> 변수) { ... }
// T와 그 자손들만 가능
리턴타입 메소드명(제네릭타입<? extends T> 변수) { ... }
// T와 그 조상들만 가능
리턴타입 메소드명(제네릭타입<? super T> 변수) { ... }
  • 제네릭 타입을 매개값이나 리턴 타입으로 사용할 때 타입 파라미터로 ?(와일드카드)를 사용할 수 있다.
  • ?는 범위에 있는 모든 타입으로 대체할 수 있다는 의미다.

public static void registerCourse1(Applicant<?> applicant) {...}
public static void registerCourse1(Applicant<? extends Student> applicant) {...}
public static void registerCourse1(Applicant<? super Worker> applicant) {...}
  1. 모든 타입 가능
  2. Student 포함 하위만 가능
  3. Worker 포함 상위만 가능

 

 

 

참고 링크

 

코딩교육 티씨피스쿨

4차산업혁명, 코딩교육, 소프트웨어교육, 코딩기초, SW코딩, 기초코딩부터 자바 파이썬 등

tcpschool.com

728x90