JAVA Generics

엉엉 자바는 어려워·2022년 8월 4일
0

JAVA

목록 보기
2/2

Generics이란?

Generics은 컴파일 시간에 더 많은 버그를 감지할 수 있어 코드의 안정성을 추가해준다. 클래스, 인터페이스 및 메서드를 정의할 때 타입이 매개변수가 된다.
클래스 내부에서 지정하는 것이 아닌 외부에서 사용자에 의해 지정되는 것을 의미한다.

장점

1. 컴파일 시 타입확인

2. 캐스팅을 사용하지 않아도된다.

타입 파라미터

  • 타입 파라미터로 명시할 수 있는 것은 참조 타입밖에 없다. int, double, char같은 기본 타입은 올 수 없다

Generics class

Generics Method

  • 메소드 선언 부에 적은 제네릭으로 리턴 타입이 정해지는 메소드이다.
    ❌static 변수는 제네릭을 사용할 수 없다 클래스가 인스턴스 되기 전에 static은 메모리에 올라가야하는데 이때 제네릭 타입인T가 결정되지 않기 때문이다.
public class Student<T> {
  
    static T getName(T name) {   
        return name;
    }
}
  • 오류

제네릭 메소드로 만들면 static이 가능하다. -> T가 지역변수로 바뀐다.

public class Student<T> {
    
    static <T> T getOneStudent(T id) {
        return id;
    }
}

Generics Method 사용방법

  1. 호출시 타입 지정
ArrayList<Integer> list1 = new ArrayList<Integer>();
  • 컴파일러가 <Integer>를 보고 타입을 지정함
  1. 암시적 호출
ArrayList<Integer> list2 = new ArrayList<>();
  • 매개변수를 보고 값을 추정함

Generics Type 제한하기

  1. 클래스로 제한하기
class FruitBox<T extends Fruit> {  // Fruit의 자손만 타입으로 지정가능
    // Logic
}
  1. 인터페이스로 제한하기
interface Eatable {}
class FruitBox<T extends Eatable> { ... }
  • 해당 클래스 서브 클래스들도 지정 가능하다.

❗ Integer가 Number이 서브클래스라도 Box<Integer>가 Box<Number>의 서브 타입은 아니다.
-> Box<Integer>와 Box<Number> 공통 부모는 Object이다.

  • ArrayList는 List를 상속 받고 List는 Collection 클래스를 상속 받기 때문에 아래 그림이 성립된다.

와일드 카드

  • 제네릭 클래스의 객체를 메소드의 매개변수로 받을 때, 그 객체의 타입 변수를 제한하는 것을 말한다.
    unknown 타입이기 때문에 타입이 정해지지 않아 자식 여부 검사를 하지 않는다.
  1. < ? extends T> 와일드 카드의 상한 제한(upper bound) - T와 그 자손들을 구현한 객체들만 매개변수로 가능
  2. < ? super T> 와일드 카드의 하한 제한(lower bound) -T와 그 조상들을 구현한 객체들만 매개변수로 가능
  3. < ? > 제한 없음

0개의 댓글