제네릭스(Generics)이란?
- 다양한 타입의 객체들을 다루는 메소드나 컬렉션 클래스에 컴파일 시의 타입 체크를 해주는 기능을 의미합니다.
제네릭스를 왜 사용해야할까?
- 객체의 타입을 컴파일 시에 체크하기 때문에 안정성이 높아집니다.
의도하지 않은 타입의 객체가 저장되는 것을 막고 잘못된 형변환을 막을 수 있기 때문입니다!
제네릭스의 형식과 약어
- 제네릭스의 형식
public class 클래스명<T> {...}
public interface 인터페이스명<T> {...}
- 자주 사용되는 타입인자 약어
- <T> == Type
- <E> == Element
- <K> == Key
- <V> == Value
- <N> == Number
- <R> == Result
제네릭스를 활용한 예제
- 제네릭스를 우리는 이미 사용하고 있었는데요. 제네릭스를 가장 잘 사용한 예제는 바로 Collection (또는 Collection 을 구현한 다른 자료구조들) 이랍니다
- Collection.java 중 일부
E 라는 타입을 받아 add() 를 보면 E라는 타입을 사용하는걸 볼 수 있다.
addAll
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 중 일부
E라는 타입을 사용해 add()에 E를 사용하는 걸 볼 수 있다.
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&Spring' 카테고리의 다른 글
[java]String vs StringBuffer/StringBuilder (0) | 2022.06.10 |
---|