백기선 라이브 자바 스터디 14: 제네릭

Hoyoung Jung·2021년 2월 27일
1

Generics

  • 클래스를 정의할 때 타입을 매개변수로 넘겨준다.
  • 컴파일시에 매개변수로 넘겨준 타입을 체크한다.-
  • 자바 1.5부터 도입되었다.
  • 타입 안정성을 높여준다
  • 캐스팅, 타입체크를 생략하므로 코드가 간결해지고, 가독성도 높아진다.
  • 형변환과 관련된 런타임 오류를 컴파일 타임에 잡을 수 있도로 고안되었다고 한다.

제네릭 사용하기

선언 예시

class Box<T> {
 private T t;
 
 public void set(T t) { this.t = t;}
 public T get() { return t; }
}
  • T를 타입 변수라고 한다.

제네릭 제약 조건

  • static 변수에 사용 불가
  • primitive는 사용 불가 (Wrapper 클래스를 사용하면 된다.)
  • 배열 사용 불가능

사용 예시

  • 보통 가장 처음 제네릭을 사용하는 것은 Collection 을 사용하면서 일 듯.
  • JDK를 1.5로 업그레이드하고 이클립쓰를 썼더니, 이전 방식으로 사용하지 못하게 했다.
  • 처음에는 생소했지만 사용하다 보니 익숙해지고 훨씬 편리했던 추억.
    @Test
    void listTest() {
        List l = new ArrayList();
        l.add(10);
        l.add(5.0);
        int n = (Integer) l.get(0);
        assertEquals(10, n);
        assertEquals(5.0, (Double) l.get(1));

        List<Integer> gl = new ArrayList<>();
        gl.add(20);
        // gl.add(5.3); compile error
        assertEquals(20, gl.get(20));
    }
  • 1.5 이전에는 콜렉션에 Object를 넣은 후에 형변환을 했었다.
  • 1.5 이전에는 오토박싱, 언박싱도 없어서, 박싱, 언박싱, 타입체크, 널체크까지 하면 코드가 진짜 지저분했다, 후...
  • 제네릭이 생겨서 참 좋아졌다.

제네릭 주요 개념 (바운디드 타입, 와일드 카드)

Bounded Type Parameter

  • 타입변수의 범위를 제한하기 위해 사용한다.
  • 아래 코드에서 과일 상자는 이제 과일만 담을 수 있다.
class FruitBox <T extends Fruit> {
//
}

Multiple bound

  • 바운디드 타입으로 여러 타입을 지정 가능
  • & 사용
class Box <T entends Fruit & Vegetable> {
}

와일드 카드

  • 타입변수에 사용된 ? 를 와일드 카드라고한다.
  • 와일드 카드에는 &를 사용할 수 없다.
? extends T: T와 자손들 사용 가능
? super T: T와 조상들 사용가능

제네릭 메소드 만들기

제네릭 메소드

  • 리턴 타입 앞에 타입 변수를 선언한 메소드.
  • 클래스에서 선언한 타입 변수와는 다르므로 주의할 것
  • 실제 사용시 타입을 지정해도 되지만, 주로 타입 추론을 통해서 타입을 자동으로 알아낼 수 있다.
  • static 변수에는 제네릭을 사용할 수 없지만 static 메소드에는 제네릭 메소드를 활용할 수 있다.
 public static <T> void sort(T t) {
 //
 }

Erasure (소거)

  • 컴파일 타임에만 타입을 확인하고 런타임에서는 타입을 무시하는 것
  • 아래의 제네릭 메소드가 런타임에서는 아래아래처럼 되는 것이다.
public static  <E> boolean containsElement(E [] elements, E element){
    for (E e : elements){
        if(e.equals(element)){
            return true;
        }
    }
    return false;
}
public static  boolean containsElement(Object [] elements, Object element){
    for (Object e : elements){
        if(e.equals(element)){
            return true;
        }
    }
    return false;
}

자세한 내용은 아래 블로그 글들이 좋았다.

TODO

  • Update this!!
  • 제네릭 잘 알고 있다고 생각했는데, 공부하려니 시간이 많이 걸렸다.
  • 마감시간이 다가온 관계로 일단 여기서 제출.
  • 나중에 더 보강하자.

참고자료

profile
주짓수를 좋아하는 개발자

0개의 댓글