본문 바로가기

프로그래밍/JAVA

[ JAVA ] 지네릭스(Generics) - ①

1. 지네릭스란?

지네릭스는 다양한 타입의 객체들을 다루는 메서드나 컬렉션 클래스에 컴파일 시의 타입 체크(compile-time type check)를 해주는 기능이다. 객체의 타입을 컴파일 시에 체크하기 때문에 객체의 타입 안정성을 높이고 형변환의 번거로움이 줄어든다.
 ⭐️ 지네릭스의 장점
  1. 타입 안정성을 제공한다.
  2. 타입체크와 형변환을 생략할 수 있으므로 코드가 간결해 진다. 

2. 지네릭 클래스의 선언

class Box<T> { // 지네릭 타입 T를 선언
    T item;

    void setItem(T item) { this.item = item; }
    T getItem() { return item; }
}

// 지네릭 클래스가 된 Box클래스의 객체를 생성할 때는 참조변수와 생성자에 타입 T대신에 사용될 실제 타입을 지정해주어야 한다.
Box a = new Box();                 // 지네릭 타입을 지정하지 않아도 객체 생성 가능. 
                                   // 다만 지네릭 타입을 지정하지 않아서 안전하지 않다는 경고가 발생함
Box<String> b = new Box<String>(); // 타입 T 대신, 실제 타입을 지정
b.setItem(new Object());           // 에러. String이외의 타입은 지정불가
b.setItem("ABC");                  // String타입이므로 가능
String item = b.getItem();         // 형변환이 필요없음
- 지네릭 타입은 클래스와 메서드에 선언할 수 있다.
- Box<T> : 지네릭 클래스. 'T의 Box' 또는 'T Box'라고 읽는다.
- T : 타입 변수 또는 타입 매개변수. (T는 타입 문자, 'Type'의 첫 글자에서 따온 것이다.)
        타입 변수는 T가 아닌 다른 것을 사용해도 된다. 
        ArrayList<E>의 경우, 타입 변수 E는 'Element(요소)'의 첫글자를 따서 사용
        Map<K, V>의 경우, K는 'Key', V는 'Value'를 의미한다.
        상황에 맞게 의미있는 문자를 선택해서 사용하는 것이 좋음
- Box : 원시 타입 (raw type)

▶ 지네릭 타입 호출 : 타입 매개변수에 타입을 지정하는 것
▶ 매개변수화된 타입(parameterized type) : 지정된 타입을 의미

* 지네릭스의 제한

▶ 타입 변수 T는 인스턴스 변수로 간주되기 때문에 static 멤버에 타입 변수 T를 사용할 수 없다.
  - static 멤버는 타입 변수에 지정된 타입, 즉 대입된 타입의 종류에 관계없이 동일한 것이어야 함
▶ 지네릭 타입의 배열 생성은 허용되지 않는다. (지네릭 배열 타입의 참조변수를 선언하는 것은 가능)
  -  new연산자, instanceof 연산자는 컴파일 시점에 타입 T가 뭔지 정확히 알아야 하는데 지네릭 클래스를 컴파일하는 시점에서 T가 어떤 타입이 될지 알 수 없기 때문
class Box<T> {
    static T item; // 에러
    static int compare(T t1, T t2) {...} // 에러
    
    T[] itemArr; // OK. T타입의 배열을 위한 참조변수
    
    T[] toArray() {
        T[] tmpArr = new T[itemArr.length]; // 에러. 지네릭 배열 생성불가
        ...
        return tmpArr;
    }
}

'프로그래밍 > JAVA' 카테고리의 다른 글

[ JAVA ] 지네릭스(Generics) - ③  (0) 2023.02.07
[ JAVA ] 지네릭스(Generics) - ②  (0) 2023.02.06
[ JAVA ] Arrays  (0) 2023.01.08
[ JAVA ] Iterator, ListIterator, Enumeration  (0) 2023.01.08
[ JAVA ] Queue(큐)  (0) 2023.01.08