스터디 포스트 >  자바 조금 더 알기

자바 프로그래밍의 제네릭

박두원 멘토
백엔드 개발자이고, 기술 공부를 좋아합니다.

자바 조금 더 알기 - 1주차

 
💡
제네릭에 대해 이해하고, 제네릭을 사용한다
 

제네릭 소개

  1. 다양한 타입(종류 매개변수)을 받는 클래스를 만들 수 있다.
public class MyCustomList<T> {

  private List<T> list = new ArrayList<>();

  public void addElement(T element) {
    list.add(element);
  }

  public void removeElement(T element) {
    list.remove(element);
  }

  public T get(int index) {  // T를 반환
    return list.get(index);
  }
}
  • T라는 종류 매개변수를 사용하여 어떤 타입이든 받을 수 있지만, 한번 T가 결정되고 나면 다른 타입은 들어오지 못하게 된다. → 강력한 타입 체킹을 제공
  • T 자체를 반환하여 사용할 수도 있다.
 
public class GenericMain {
  public static void main(String[] args) {
    MyCustomList<String> stringList = new MyCustomList<>();
    stringList.addElement("string1");
    stringList.addElement("string2");
    stringList.get(0);

    MyCustomList<Integer> intList = new MyCustomList<>();
    intList.addElement(1);
    intList.addElement(2);
    intList.get(0);
  }
}
  • 상황에 따라 필요한 종류 매개변수를 사용하여 유연하게 클래스를 사용할 수 있다.
 

제한점과 확장

public class MyCustomList<T extends Number> { // Number 클래스를 확장한 타입만 사용 가능

  private List<T> list = new ArrayList<>(); // Number의 하위 클래스 요소로만 이루어진다.

  public void addElement(T element) {
    element.doubleValue(); // Number 클래스의 메서드를 사용할 수 있다.
    element.intValue();
    list.add(element);
  }
  ...
}
  • Number 혹은 그 하위 클래스만 있음을 보장한다.
  • Number 타입만 담을 의도를 가지고 만들 수 있다. → Number가 아닌 타입이 들어오는 것을 원치않는 경우이며, Number가 아닌 타입이 들어오려는 경우엔 컴파일 에러를 발생시킨다.
 

제네릭 메서드

public class MyCustomList<T extends Number> {

  private List<T> list = new ArrayList<>();

  ...

  public static <T> T returnValue(T value) {
    return value;
  }

}
  • 클래스에서 사용하는 제네릭 타입과 상관없이 사용 가능하다.
  • 제네릭 메서드에 제한점(extends)을 두려면, <A extends Number> 로 변경하면 된다.
 
public <A extends Number> A returnValue(Integer value) {
  return value;  // Required Type : A, but Provided : Integer. ERROR
}

public <A extends Number> A returnValue(Integer value) {
  return (A)value; // cast to type A. OK
}
  • Number의 하위 클래스 Integer를 바로 반환하려하면, 에러가 발생한다. → 전달된 value를 (A)를 통해 타입 캐스트하면 반환된다.
 

와일드 카드

? 문자를 통해 표현한다.
상한 경계 와일드 카드, 하한 경계 와일드 카드가 있다.
와일드 카드는 지역 변수와 멤버 변수에 모두 사용 가능하다.
 

 
[ 재밌었던 부분 ]
 
 
본 스터디는 Udemy의 <【한글자막】 완전 초보자를 위한 Java 프로그래밍 : 단기간에 Java 완벽 정복> 강의를 활용해 진행됐습니다. 강의에 대한 자세한 정보는 아래에서 확인하실 수 있습니다.
 
 
프밍 스터디는 Udemy Korea와 함께 합니다.
 
원하는 스터디가 없다면? 다른 스터디 개설 신청하기
누군가 아직 원하는 스터디를 개설하지 않았나요? 여러분이 직접 개설 신청 해 주세요!
이 포스트는
"자바 조금 더 알기" 스터디의 진행 결과입니다
진행중인 스터디
자바 조금 더 알기
자바의 기본적인 문법(변수, if, for 등)을 알고 계신 분들과 함께 자바에 대해 조금 더 공부해보는 스터디를 진행하려고 합니다. 평소 제네릭, 함수형 프로그래밍, 스레드와 동시성, synchronized 등에 대한 궁금증을 가지고 계셨던 분들 함께 공부해요!
박두원 멘토
백엔드 개발자이고, 기술 공부를 좋아합니다.