본문 바로가기
Language/java

[Java] 지네릭스란?

by gamxong 2022. 7. 28.

1. 지네릭스란?

: 다양한 타입의 객체들을 다루는 메서드나 컬렉션 클래스에 컴파일 시의 타입체크를 해주는 기능이다.

: 객체의 타입을 컴파일 시에 체크하기 때문에 객체의 타입 안정성을 높이고 형변환의 번거로움이 줄어든다.

 

지네릭스의 장점
 1. 타입 안정성을 제공
 2. 타입체크와 형변환을 생략할 수 있으므로 코드가 간결해 진다.

 

2. 지네릭 클래스의 선언

class Box {
	Object item;
    
    void setItem(Object item) { this.item = item; }
    Object getItem() { return item; }
}

// 지네릭 클래스로 변경

class Box<T> {
	T item;
    
    void setItem(T item) { this.item = item; }
    T getItem() { return item; }
}

 

 - Box<T> 에서 T를 '타입 변수'라고 한다.

 - 타입 변수가 여러 개인 경우에는 Map<K,V> 와 같이 콤마를 구분자로 나열한다.

  ▶ 기호의 종류만 다를 뿐 '임의의 참조형 타입'을 의미한다는 것은 모두 같다.

 

 

- 이제 지네릭 클래스가 된 Box클래스의 객체를 생성할 때는 참조변수와 생성자에 타입 T대신에,

   사용될 실제 타입을 지정해주어야 한다.

Box<Stirng> b = new Box<String>();  // 타입 T 대신, 실제 타입을 지정
b.setItem(new Object());            // 에러. String이외의 타입은 지정불가
b.setItem("ABC");                   // OK. String타입이므로 가능
String item = b.getItem();  // 형 변환이 필요없음

 

 

 

2.1 지네릭스의 용어

class Box<T> {}
Box<T> 지네릭 클래스. 'T의 Box' 또는 'T Box'라고 읽는다.
T 타입 변수 또는 타입 매개변수. (T는 타입 문자)
Box 원시 타입(raw type)

 

Box<String> b = new Box<String>();

  ▶ Box<String> b : 지네릭 타입 호출

 

 

2.2 지네릭스의 제한

: 지네릭 클래스 Box의 객체를 생성할 때, 객체별로 다른 타입을 지정하는 것이 적절하다.

Box<Apple> appleBox = new Box<Apple>();  // Apple 객체만 저장가능
Box<Grape> grapeBox = new Box<Grape>();  // Grape 객체만 저장가능

 

static멤버에 타입 변수 T를 사용할 수 없다. T는 인스턴스 변수로 간주되기 때문.

class Box<T> {
    static T item;  // 에러
    static int compare(T t1, T t2) {...{. // 에러
    ...
}

 

 

지네릭 배열을 생성하는 것도 허용되지 않는다.

class Box<T> {
	T[] itemArr;  // Ok. T타입의 배열을 위한 참조변수
    
    T[] toArray() {
    	T[] tmpArr = new T[itemArr.length];  // 에러. 지네릭 배열 생성불가
        
        return tmpArr;
    }
}

: 위의 코드에 정의된 Box<T>클래스를 컴파일하는 시점에서는 T가 어떤 타입이 될지 전혀 알 수 없음.

  ▶ instanceof연산자, new 연산자는 T를 피연산자로 사용 불가.

 

댓글