코린이의 소소한 공부노트

지네릭스 본문

Java

지네릭스

무지맘 2022. 11. 9. 01:33

// 지네릭스를 사용하지 않던 시절..

// ArrayList에는 Object[]가 있음
ArrayList list = new ArrayList(); // 아무 객체나 다 저장 가능

list.add(10);
list.add(20);
list.add(“30”); // ??

System.out.println(list); // [10, 20, 30]

Integer i = list.get(2); // 에러. 2번째 요소는 String이므로 Integer에 저장 불가
Integer i = (Integer)list.get(2); // 컴파일 통과. get()의 반환타입이 Object이므로 형변환 가능.
				// 하지만 실행단계에서 ClassCastException 발생

 

[지네릭스]

1. 컴파일시 타입을 체크해주는 기능

  - ClassCastException RuntimeException의 자손인데, 지네릭스를 이용하면 rum-time error compile-time error로 바꿔 프로그램을 죽이기보다 수정이 가능한 방향으로 바꿀 수 있다.

2. 객체의 타입 안정성을 높여준다.

3. 타입 체크와 형변환의 번거로움을 줄여줌으로써 코드가 간결해진다.

// int만 저장 가능하게 지네릭스 이용
ArrayList<Integer> list = new ArrayList<Integer>();

list.add(10); // OK
list.add(20); // OK
list.add(“30”); // 컴파일 에러. 타입 체크가 강화됨
list.add(30); // OK

Integer i = list.get(2); // i = 30, 지네릭스 덕분에 형변환 생략 가능

// 여러 타입의 객체를 담고 싶을 때는
ArrayList list = new ArrayList(); // 이렇게 쓰기 보다
ArrayList<Object> list = new ArrayList<Object>(); // 지네릭스를 꼭 이용하자.

 

[지네릭스 용어]

1. 타입 변수 (또는 타입 매개변수)

- 일반 클래스 중 Object를 포함하는 클래스들을 지네릭 클래스로 바꿀 때, Object타입 대신 E, T와 같은 타입변수를 사용한다. (Eelement, Ttype)

- 타입 문자는 보통 대문자 1자를 쓴다.

- 객체 생성시 타입 변수 대신 실제 타입을 지정한다.

- 타입 변수는 참조변수와 생성자에 써주고, 일치해야 한다.

- 실제 타입이 지정되면 형변환 생략이 가능하다.

public class ArrayList<E> extends ... { // 지네릭 클래스
    private transient E[] elementData;
    public boolean add(E o) { }
    public E get(int index) { }
    ...
}

2. Box<T>

- 지네릭 클래스의 표현. T Box 또는 T Box라고 읽는다.

- 여기서 Box에 해당하는 클래스는 원시 타입(raw type)이다. 지네릭 클래스로 바뀌기 전 일반 클래스를 뜻한다.

class Box<T> { }
// T에 String 대입
Box<String> b = new Box<String>();

 

'Java' 카테고리의 다른 글

지네릭 클래스의 예시와 제한  (0) 2022.11.14
지네릭스와 다형성  (0) 2022.11.09
Collections 클래스  (0) 2022.11.08
HashMap, Hashtable 클래스  (0) 2022.11.08
TreeSet 클래스  (0) 2022.11.07