[JAVA] Generic

kjihye0340·2021년 5월 6일
0

java

목록 보기
5/9

Generic

데이터의 타입을 일반화하는 것을 말한다.
클래스나 메소드에서 사용할 내부 데이터 타입을 컴파일 시에 미리 지정한다.

장점

  1. 클래스나 메소드 내부에서 사용되는 객체의 타입 안정성을 높일 수 있다.
  2. 반환값에 대한 타입 변환 및 타입 검사에 들어가는 노력을 줄일 수 있다.

여러 데이터 타입을 사용해야 되는 경우에 Object 타입을 이용하는 경우도 있다.
그러나, Object 객체가 반환이 되면 다시 원하는 타입으로 변환해야 하며, 이때 오류가 발생할 가능성도 있다.

Generic은 다음과 같이 선언된다.

class MyArray<T> {
    public T element;
    public void setElement(T element) { this.element = element; }
    public T getElement() { return element; }
}

Generic Type parameter
사실 아무 문자열이나 써도 된다. 하지만 코드를 좀 더 알아보기 쉽게 규칙대로 사용하는 게 좋다.

Type
EElement
KKey
NNumber
TType
VValue
S, U, V2번째, 3번째, 4번째 타입

와일드 카드

Generic type의 객체를 메소드의 매개변수로 받을 때 그 객체의 타입 변수를 제한
public void check(MyArray<? extends Number>){}

만약 check(MyArray)를 하려고 할 때
다음과 같이 코드가 짜여있다고 생각해보자.

public class MyClass<E>{
	public myClass();
	public void check(MyArray<E>);
}
---------------------------------------------
MyClass<Number> mc = new MyClass<>();
MyArray<Integer> marr = ...;
mc.check(marr);

이 때의 코드는 오류가 날 것이다.
왜냐하면 Number가 Integer를 상속하는 것이지, MyArray<Number>가 MyArray<Integer>를 상속하는 것이 아니기 때문이다.
그러므로 public void check(MyArray)에서 E에게 상속받는 클래스도 가능하게 하기 위해서 와일드 카드를 사용하면 된다.

public void check(MyArray<? extends E>);

제한 종류

표시제한 종류
<?>(<? extends Object>)제한 없음
<? extends T>상한 제한 - T와 그 자손들을 구현한 객체들만 매개변수로 가능
<? super T>하한 제한 - T와 그 조상들을 구현한 객체들만 매개변수로 가능

출처
http://tcpschool.com/java/java_generic_concept
https://siyoon210.tistory.com/16
https://docs.oracle.com/javase/tutorial/java/generics/types.html

0개의 댓글