제네릭스(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
복사했습니다!