반응형
제네릭스가 무엇인지 이해하고 설명할 수 있다.
제네릭이란 데이터의 타입을 일반화 한다는 것을 의미한다.
<> 다이아몬드 연산자를 사용하며, <T>의 T는 타입 변수를 뜻한다.
클래스나 메소드에서 사용할 내부 데이터 타입을 컴파일 시에 지정하는 방법을 말한다.
제네릭스 사용의 목적 혹은 장점에 대해 이해하고 설명할 수 있다.
제네릭을 활용하면 타입 변환 및 타입 검사에 들어가는 코드 생략이 가능하다.
컴파일 시에 미리 타입 검사를 시행하기 때문에 클래스나 애부에서 사용되는 객체의 타입 안정성이 높다.
제네릭스가 적용된 클래스에 타입변수를 지정하여 인스턴스를 생성할 수 있다.
/* 타입을 Integer로 인스턴스를 생성하는 경우 */
GenericTest<Integer> gt1 = new GenericTest<Integer>();
/* JDK 7부터 타입선언 시 타입변수가 작성되면 타입 추론이 가능하기 때문에
* 생성자 쪽의 타입을 생략하고 사용할 수 있게 한다.
* 단, 타입이 명시되지 않은 빈 다이아몬드 연산자는 사용해야 한다.
* */
GenericTest<Double> gt3 = new GenericTest<>();
클래스 작성 시 다이아몬드 연산자를 이용하여 제네릭스를 설정한 클래스를 작성할 수 있다.
public class GenericTest<T> {
/* 현재 해당 필드는 타입이 결정되지 않은 상태이다. */
private T value;
/* setter/getter 작성 시에도 구체적인 타입 대신 T를 이용할 수 있다. */
public void setValue(T value) {
this.value = value;
}
public T getValue() {
return this.value;
}
}
제네릭스 클래스 작성 시 extends 키워드를 이용하여 특정 타입만 사용하도록 제한할 수 있다.
제네릭 표현 시 인터페이스도 extends로 표현한다.
public class RabbitFarm <T extends Rabbit> {
/* 타입 변수는 아직 어떤 토끼가 될지 모른다. 단, 토끼이거나 토끼의 후손만 가능하다. */
private T animal;
}
와일드카드를 이용하여 인자의 타입 범위를 제한할 수 있다.
public class WildCardFarm {
/* 매개변수로 전달 받는 토끼 농장을 구현할 때 사용한 타입 변수에 대해 제한할 수 있다. */
/* 토끼 농장에 있는 토끼가 어떤 토끼던 상관 없다. */
public void anyType(RabbitFarm<?> farm) {
farm.getAnimal().cry();
}
/* 토끼 농장의 토끼는 Bunny이거나 그 후손 타입으로 만들어진 토끼농장만 매개변수로 사용 가능 */
public void extendsType(RabbitFarm<? extends Bunny> farm) {
farm.getAnimal().cry();
}
/* 토끼 농장의 토끼는 Bunny이거나 그 부모 타입으로 만들어진 토끼농장만 매개변수로 사용 가능 */
public void superType(RabbitFarm<? super Bunny> farm) {
farm.getAnimal().cry();
}
<?> : 제한 없음
<? extends Type> 와일드 카드의 상한 제한 (Type과 Type의 후손을 이용해 생성한 인스턴스만 인자로 사용 가능)
<? super Type > 와일드 카드의 하한 제한 (Type과 Type의 부모를 이용해 생성한 인스턴스만 인자로 사용 가능)
부족했던 부분
1. 제네릭을 실제로 사용하는 연습 문제가 있다면 풀어야겠다.
2. 와일드 카드를 사용해보기. 이 부분은 개념보다는 직접 코드를 쳐봐야 할 것 같다.
반응형
'백엔드 과정 > Java' 카테고리의 다른 글
[Java] 컬렉션 개념 복습 (0) | 2022.01.24 |
---|---|
[Java] API 개념 복습 (0) | 2022.01.24 |
[Java] 다형성 개념 복습 / 추상클래스와 인터페이스 (0) | 2022.01.17 |
[Java] 상속 개념 복습 (0) | 2022.01.15 |
[Java] 객체 배열 개념 복습 (0) | 2022.01.15 |