[이것이 자바다] 13. 제네릭

SeonJin·2023년 8월 30일
0

Java

목록 보기
9/11
post-custom-banner

📚 이것이 자바다 [개정판]


sec01. 제네릭이란?

  • 결정되지 않은 타입을 파라미터로 처리하고 객체 생성 시점에 구체적인 타입으로 대체하는 기능
  • 제네릭 타입으로 선언 후 구체적인 타입을 지정하지 않으면 Object 타입이 암묵적으로 사용된다
    ✨ 타입 파라미터를 대체하는 타입은 클래스 및 인터페이스이다
    ✨ 기본 타입은 타입 파라미터의 대체 타입이 될 수 없다
public class Box<T> { // 결정되지 않은 content의 타입을 T라는 파라미터로 정의
	public T content;
}

Box<String> box = new Box<String>(); // 타입 파라미터를 String으로 대체
box.content = "안녕";
String content = box.content; // 강제 타입 변환 필요 없이 String값을 얻음

// 변수 선언할 때와 동일한 타입으로 호출하고 싶으면
// 생성자 호출 시 생성자에는 타입을 명시하지 않고 <>만 붙일 수 있다
Box<Integer> box = new Box<>(); // 타입 파라미터를 Integer으로 대체
Integer box = box.content;

sec03. 제네릭 메소드

// 타입 파라미터가 메소드 선언부에서 정의된다
public <타입파라미터> 리턴타입 메소드명(매개변수) {}

class Box<T> {
	private T t;

	public T getT() {
		return t;
	}
}

public class GenericEx5 {
	public static <T> Box<T> boxing(T t) { // 메소드 생성
		Box<T> box = new Box<T>();
		box.setT(t);;
		return box;
	}

	public static void main(String[] args) {
	Box<Integer> box1 = boxing(100); // 메소드 호출
	int intValue = box1.getT();
	System.out.println(intValue);
	
	Box<String> box2 = boxing("hi");
	String strValue = box2.getT();
	System.out.println(strValue);
	}
}

sec04. 제한된 타입 파라미터

  • 타입 파라미터를 대체하는 구체적인 타입을 제한할 필요가 있다
  • 예를 들어 숫자 연산을 위한 제네릭 메소드는 Number 또는 정수, 실수 클래스로 제한된다
  • 이처럼 특정 타입과 자식 또는 구현 관계에 있는 타입만 대체할 수 있는 것을 제한된 타입 파라미터라 한다
public <T extends 상위타입> 리턴타입 메소드(매개변수) { }

public <T extends Number> boolean compart(T t1, T t2) {
	double v1 = t1.doubleValue();
	double v2 = t2.doubleValue();
	return (v1 == v2);
}

sec05. 와일드카드 파라미터

// 1. 대체타입으로 Student와 자식 클래스인 HighStudent와 MiddleStudent만 가능
리턴타입 메소드명(제네릭타입<? extends Student> 변수) {}

// 2. 대체타입으로 Worker와 부모 클래스인 Person만 가능
리턴타입 메소드명(제네릭타입<? super 부모클래스> 변수) {}

// 3. 어떤 타입이든 가능
리턴타입 메소드명(제네릭타입<?> 변수) {}
profile
study notebook
post-custom-banner

0개의 댓글