1. 제네릭스(Generics)란?
-
- 다양한 타입의 객체들을 다루는 메소드나 컬렉션 클래스에 컴파일 시의 타입 체크를 해주는 기능을 의미합니다.(이미 컬렉션을 배울때 한번 만나본적있습니다!)
- 제네릭스를 왜 사용해야할까? → 객체의 타입을 컴파일 시에 체크하기 때문에 안정성이 높아집니다. (의도하지 않은 타입의 객체가 저장되는 것을 막고 잘못된 형변환을 막을 수 있기 때문입니다!)
2. 제네릭스의 형식과 약어
- 제네릭스의 형식
-
public class 클래스명<T> {...} public interface 인터페이스명<T> {...}
- 자주 사용되는 타입인자 약어
- <T> == Type
- <E> == Element
- <K> == Key
- <V> == Value
- <N> == Number
- <R> == Result
3. 제네릭스를 활용한 예제
- 제네릭스를 우리는 이미 사용하고 있었는데요. 제네릭스를 가장 잘 사용한 예제는 바로 Collection (또는 Collection 을 구현한 다른 자료구조들) 이랍니다. Collection 클래스를 살펴보면서 제네릭스가 어떻게 사용되었는지 확인해볼게요.
- 제네릭스를 활용한 예제
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
public class Main {
public static void main(String[] args) {
List<String> list = new ArrayList();
Collection<String> collection = list;
}
}
- Collection.java 중 일부
public interface Collection<E> extends Iterable<E> {
int size();
boolean isEmpty();
Iterator<E> iterator();
boolean add(E e);
<T> T[] toArray(T[] a);
boolean containsAll(Collection<?> c);
boolean addAll(Collection<? extends E> c);
}
- List.java 중 일부
public interface List<E> extends Collection<E> {
// Collection 에 있는 메소드들 모두 포함
// + List 에만 있는 메소드들
boolean add(E e);
}
- ArrayList.java 중 일부
public class ArrayList<E> extends AbstractList<E>
implements List<E>, RandomAccess, Cloneable, java.io.Serializable
{
public <T> T[] toArray(T[] a) {
if (a.length < size)
// Make a new array of a's runtime type, but my contents:
return (T[]) Arrays.copyOf(elementData, size, a.getClass());
System.arraycopy(elementData, 0, a, 0, size);
if (a.length > size)
a[size] = null;
return a;
}
public E get(int index) {
rangeCheck(index);
return elementData(index);
}
public boolean add(E e) {
ensureCapacityInternal(size + 1); // Increments modCount!!
elementData[size++] = e;
return true;
}
}
- 제네릭스를 활용하면 동작은 같지만 클래스 타입만 바뀌어야 하는 경우를 쉽게 다룰 수 있습니다.
- 제네릭스를 통해 컴파일언어어의 특징인 타입 안정성을 보장하면서도 유연한 프로그램을 작성할 수 있습니다!
'프로그래밍 > Java' 카테고리의 다른 글
스트림(stream)이란? (0) | 2022.05.18 |
---|---|
람다(Lambda)란? (0) | 2022.05.18 |
Collection(2) - 스택(Stack)/ 큐(Queue)/ ArrayDeque (0) | 2022.05.18 |
Collection(1) (List, Set, Map) (0) | 2022.05.18 |
날짜, 시간 (0) | 2022.05.18 |