Notice
Recent Posts
Recent Comments
Link
«   2025/04   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
Tags
more
Archives
Today
Total
관리 메뉴

쉽지않은 블로그

[JAVA] 제네릭 이란? 본문

프로그래밍언어/JAVA

[JAVA] 제네릭 이란?

쉽지않네 2021. 3. 31. 01:53

 

다음과 같이 사용하고 싶은 자료구조 객체(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
Comments