👨🏻‍💻

[JAVA] 제네릭

과목
JAVA
태그
GENERIC
StudyDate
2020/12/26

제네릭이란??

데이터의 타입을 일반화한다는 의미

제네릭을 왜 사용하는가?

1.
제네릭은 클래스나 메소드에서 사용할 내부 데이터 타입을 컴파일 시에 지정하는 방법을 말한다.
2.
컴파일시에 미리 타입검사를 시행하게 되면 클래스나 메소드 내부에서 사용하는 객체의 타입 안정성을 높일 수 있음
3.
반환값에 대한 타입 변환 및 타입 검사에 들어가는 코드 생략이 가능해진다.
4.
잘못된 타입이 사용되는 경우 컴파일 에러를 발생시키며, 반환받은 값을 instanceof로 타입 비교하여 다운캐스팅을 할 필요가 없어진다.

제네릭 설정하는방법은?

제네릭 설정은 클래스 선언부 마지막부분에 다아몬드 연산자를 이용하여 작성하게된다. 다이아몬드 연산자 내부에 작성하는 영문자는 관례상 대문자로 한다.
public class GenericTest<T> { * 다이아몬드 연산자 내부에 작성한 T는 타입 변수라고 부른다. * 타입 변수를 자료형 대신 사용할 것이다. 가상으로 존재하는 타입이며 * T가 아닌 다른 영문자를 사용해도 무방하다. * 또한 여러 개의 타입 변수를 작성할때는 ,를 이용해서 여러개 기술할수 도 있다. * 사용하는 쪽에서 제네릭 클래스 이용할시 * 실제 사용할 타입을 타입변수 자리에 맞춰서 넣어주게 되면 컴파일 시점에 타입이 결정하게된다. * *현재 해당 필드는 타입이 결정되지 않은 상태이다.* private T value; *메소드를 사용할 때에도 구체적인 타입대신 T를 이용할 수 있다.* public void setValue(T value) { this.value = value; } -------------------------------------------------------------------------------------- package com.greedy.section01.generic; public class Application { public static void main(String[] args) { GenericTest<String> gt2 = new GenericTest<String>(); gt2.setValue("홍길동"); System.out.println(gt2.getValue()); System.out.println(gt2.getValue() instanceof String); * jdk 1.7부터 타입 선언 시 타입 변수가 작성되면 타입 추론이 가능하기 때문에 * 생성자쪽의 타입을 생략하고 사용할 수 있게 한다. *, 타입이 명시되지않은 빈 다이아몬드 연산자는 사용해한다. GenericTest<String> gt3 = new GenericTest(); gt3.setValue("홍길동"); System.out.println(gt3.getValue()); System.out.println(gt3.getValue().charAt(0)); } }
Java
복사

와일드카드(WildCard)

제네릭 클래스 타입의 객체를 메소드의 매개변수로 받을 때 그 객체의 타입을 제한 가능
<?> :제한 없음
<? extends Type>
: 와일드카드의 상한 제한 (Type과 Type의 후손을 이용해 생성한 객체만 매개변수로사용 가능)
<? super Type>
: 와일드카드 하한 제한 (Type과 Type의 부모를 이용해 생성한 객체만 매개변수로 사용 가능)

타입변수에서 인터페이스 상속할 시 주의할점

타입변수에서 인터페이스를 상속할 시 implements 키워드 대신 extends 키워드를 사용한다. public class RabbitFarm<T extends Animal> 정상
public class RabbitFarm<T extends Rabbit>/*extends Animal*/ { /*1. 해당클래스는 타입 변수를 작성하여 제네릭 클래스를 만들었다.*/ private T animal; public RabbitFarm() { } public RabbitFarm(T animal) { this.animal = animal; } public void setAnimal(T animal) { this.animal = animal; } public T getAnimal() { return this.animal; } }
Java
복사