쉽지않은 블로그
[JAVA] 제네릭 이란? 본문
다음과 같이 사용하고 싶은 자료구조 객체(ArrayList)를 호출할 때 <String>처럼 타입을 함께 불러주는 것을 많이 해봤을 것이다
ArrayList<String> arr = new ArrayList<String>(); ArrayList<Integer> nums = new ArrayList<>(); //java SE7 부터는 인스턴스생성시 앞의 참조형 변수를 통해 추론할수 있는경우는 생략이 가능합니다.
ArrayList <String> 변수의 타입을 지정해주는 부분을 Generic이라고 한다.
(data type 을 generalize 한다는 것을 의미함)
JAVA , C++ 에서
어떤 MainClass 안에 여러 형태의 클래스 A, B, C에 대한 동일한 동작을 하는 메서드가 있을 경우
MainClass{ public void foo (class A , class A){ ... } public void foo (class B , class B){ ... } public void foo (class C , class C){ ... } }
위에 있는 코드처럼 OOP에서 지원되는 오버 로딩을 사용할 수도 있지만
C++에서는 template을 지원하기 때문에
template <typename T> void foo(T a, T b){ Do something.... }
이런 식으로 처리할 수 있는 것을 본적 있을 것이다
이것과 비슷한 느낌으로 Java의 Generic 도 앞으로 어떤 객체가 들어오는지 는 모르지만
미리 Object를 이용하여 클래스를 구현해놓고
나중에 할당을 받을 때 내가 사용하려는 타입과 함께 호출을 해줄 수 있는 것이다.
이 Generic을 선언하기 위해서는 몇 가지 조심해야 될 게 있다
1. 클래스 선언부에 임시 클래스 <Temp>를 선언한다 //꼭 Temp가 아니라 다른 이름 이어도 상관이 없음
2. 해당 클래스에서 값을 가질 때는 Object와 같은 상위 클래스를 이용한다.
3.argument 와 return 할 때의 자료형을 항상 <Temp>로 받거나 Temp 자료형으로 변환을 하여 return 해주어야 한다.
ArrayList의 소스코드를 보면 다음과 같은 내용들을 확인할 수 있다.
public class ArrayList<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, java.io.Serializable { //class 정의부분에 Generic 선언 ... ... ... public void add(int index, E element) { // 받는 타입을 E 를 이용하여 명시 rangeCheckForAdd(index); modCount++; final int s; Object[] elementData; if ((s = size) == (elementData = this.elementData).length) elementData = grow(); System.arraycopy(elementData, index, elementData, index + 1, s - index); elementData[index] = element; size = s + 1; } .. .. }
'프로그래밍언어 > JAVA' 카테고리의 다른 글
[JAVA] Object 클래스 (0) | 2021.04.14 |
---|---|
[JAVA] 자바의 String (0) | 2021.04.13 |
[JAVA] Wrapper class 래퍼클래스란? (2) | 2021.04.13 |
[JAVA] 컬렉션 이란? (0) | 2021.03.31 |