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

+ Recent posts