이번 포스트는 남궁 성님의 "Java의 정석"이라는 책을 참고하여 작성하였습니다.
정리한 내용 중 오류가 있으면 댓글로 알려주시면 감사드리겠습니다.
1. Generics란?
지네릭스는 다양한 타입의 객체들을 다루는 메서드나 컬렉션 클래스에 컴파일 시의 타입 체크를 해주는 기능 -> 다룰 객체의 타입을 미리 명시
2. 선언
class 클래스명<T>{
T 변수명;
void 메서드명(T 변수명){ };
}
여기서 T는 타입 변수(Type Variable)라고 불리며 String. Integer와 같은 데이터 타입이 들어갈 수 있습니다.
지네릭스 선언과 객체 생성의 예시를 들어보면 아래와 같습니다.
//선언
class Box<String>{
String item;
void setItem(String item){this.item=item}
}
//객체 생성
class Fruit{ public String toString(){ return "Fruit"; }
class Apple extends Fruit{ pulbic String toString(){ return "Apple"; }
class Main{
Box<Fruit> fruitBox=new Box<Fruit>(); //매개변수 타입이 Fruit이므로 뒤에 new Box<>부분에도 매개변수 타입이 Fruit이 들어와야 합니다.
//Box<Fruit> b=new Box<>(); JDK1.7부터 이렇게도 표현 가능
fruitBox.add("ABC"); //Fruit 이외의 타입은 올 수 없음 -> 에러
fruitBox.add(new Fruit()); //OK
fruitBox.add(new Apple()); //OK -> Apple은 Fruit의 자손이므로 이 경우에서는 메서드의 매개변수로 들어갈 수 있습니다.
3. 제한된 지네릭 클래스
아래와 같이 제한된 지네릭 클래스를 선언할 수도 있습니다.
class FruitBox<T extends Fruit>{ }
이렇게 타입 매개변수 자리에 extends를 사용하면 Fruit의 자손들만 타입 매개변수의 자리에 올 수 있도록 합니다.
4. 와일드카드
와일드카드는 타입 매개변수 자리에 어떠한 타입도 들어올 수 있게 하는 기능입니다.
기호 "?"를 이용해 아래와 같이 표현할 수 있습니다.
//<? extends T> T와 그 자손들만 가능
//<? super T> T와 그 조상들만 가능
//<?> 모든 타입이 가능
//예시
static Juice makeJuice(FruitBox<? extends Fruit> box){
String temp=" ";
for(Fruit f:box.getList()) temp+=f+" ";
return new Juice(temp);
}
따라서 위의 예시에서는 makeJuice 메서드의 매개변수로 FruitBox<Fruit>뿐만이 아니라 Fruit의 자손인 FruitBox<Apple> 등이 올 수 있음을 확인할 수 있습니다.
5. 지네릭 메서드
지네릭 메서드란 메서드의 선언부에 지네릭 타입이 선언된 메서드로 아래와 같은 꼴을 가지고 있습니다.
//예시
static <T extends Fruit> Juice makeJuice(FruitBox<T> box) { }
'컴퓨터 언어 > JAVA' 카테고리의 다른 글
[JAVA] 쓰레드(Thread) (1) (0) | 2020.06.17 |
---|---|
[JAVA] 애너테이션(Annotation) (0) | 2020.06.14 |
[JAVA] 열거형(enums) (0) | 2020.06.14 |
[JAVA] 현재 날짜, 시간 구하기 (0) | 2020.06.08 |
[JAVA] interface(인터페이스) (0) | 2020.06.08 |