본문 바로가기
컴퓨터 언어/JAVA

[JAVA] 지네릭스(Generics)

by 테크케찰 2020. 6. 11.

이번 포스트는 남궁 성님의 "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