Notice
Recent Posts
Recent Comments
Link
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
Tags more
Archives
Today
Total
관리 메뉴

ultra_dev

이것이 자바다 CH13 제네릭 본문

이것이 자바다

이것이 자바다 CH13 제네릭

ultra_dev 2023. 1. 27. 20:28

📌 제네릭 

 

:결정되지 않은 타입을 파라미터로 처리하고, 실제 사용할 때 파라미터를 구체적 타입으로 대체 시키는 기능

public class Box <T> {
	public T content;
}

 

<T>는 T가 타입 파라미터임을 뜻하는 기호, A부터 Z까지 어떤 알파벳을 사용해도 괜찮음. 단지 이름일 뿐

 

Box<String> box = new Box<String>();
box.content = "안녕하세요.";
String content = box.content; //강제타입변환 필요 없이 안녕하세요 얻기 가능

Box<Integer> box = new Box<Integer>();
box.content = 100;
int content = box.content; // 강제타입변환 필요 없이 100 얻기 가능

☑️ 타입 파라미터를 대체하는 타입은 클래스 및 인터페이스

-> 기본타입은 타입 파라미터의 대체타입 될 수 없음 따라서 Box<int>는 안되는 것

 

Box<Integer> box = new Box<Integer>(); 
==
Box<Integer> box = new Box<>();

: 변수 선언할 때와 동일한 타입으로 호출 원하면, 생성자에는 타입 명시 안하고 <>만 해도 됨

 

 

📌 제네릭 타입

 

:결정되지 않은 타입을 파라미터로 가지는 클래스와 인터페이스

-> 선언부에 <>부호가 붙고 그 사이에 타입 파라미터들이 위치

->만약 지정하지 않으면 object 타입이 암묵적으로 사용

 

public class Product<K, M> {...} // 타입 파라미터로 K,M 정의

☑️타입 파라미터는 기본적으로 Object타입으로 간주되므로 Object가 가지고 있는 메소드 호출 가능

 

public class Box<T>{
	public T content;
}
---------------------------

public class GenericExample{
		//이 경우는 위에서 타입 명시 안했으니 암묵적으로 Object클래스로 됐을 것이고
        //int는 기본타입이니 Integer로 오토박싱 후 들어갔을 것
        Box Box1 = new Box();
        box.content = 100;

 

 

 

📌 제네릭 메소드

 

:타입 파라미터를 가지고 있는 메소드

-> 타입 파라미터가 메소드 선언부에서 정의된다는 점에서 제네릭 타입과 차이가 있다.

->리턴 타입 앞에 <>로 타입 파라미터 정의한 뒤, 리턴 타입과 매개변수 타입에서 사용

 

public <A,B,...> 리턴타입 메소드명(매개변수,...){...}

public <T> Box<T> boxing(T t) {...}

 

타입 파라미터 T는 <>가 없어도 매개값이 어떤 타입이냐에 따라 컴파일 과정에서 구체적인 타입으로 대체된다.

Box<Integer> box1 = boxing(100);
Box<String> box2 = boxing("안녕하세요");

-> 100의 클래스타입이 Integer이므로 타입 파라미터 T는 Integer로 대체되어 Box<Integer>가 리턴

-> "안녕하세요"의 클래스 타입이 String이므로 타입 파라미터 T는 String으로 대체되어 Box<String>이 리턴

 

 

 

📌제한된 타입 파라미터

 

:타입 파라미터를 대체하는 구체적인 타입을 제한

모든 타입으로 대체할 수 없고, 특정 타입과 자식 또는 구현관계에 있는 타입만 대체 가능한 타입 파라미터

 

 

ex)숫자를 연산하는 제네릭 메소드는 대체 타입으로

Number 또는 Number의 자식 클래스로 제한할 필요가 있다.

 

public<T extends 상위타입> 리턴타입 메소드(매개변수,...) {...}

public<T extends Number> boolean compare(T t1, T t2){

	double v1 = t1.doubleValue();  //Number의 doubleValue()메소드 사용 가능해짐
    double v2 = t2.doubleValue();
    return (v1 == v2);
}

 

📌 와일드카드 타입 파라미터

 

: 제네릭 타입을 매개값이나 리턴 타입으로 사용할 때, 타입 파라미터로 ?(와일드카드) 사용 가능

 


public class Applicant<T>{
	public T kind;
    }



리턴타입 메소드명(제네릭타입<? extends Student> 변수) {...}

-> Student와 자식 클래스만 가능

public static void register1(Applicant<? extends Student> applicant){...}




리턴타입 메소드명(제네릭타입<? super Worker> 변수) {...}

-> Worker와 부모 클래스만 가능

public static void register2(Applicant<? super Worker> applicant){...}



리턴타입 메소드명(제네릭타입<?> 변수) {...}

-> 어떤 타입이든 가능
public static void register3(Applicant<?> applicant){...}

 

 

 

Comments