제네릭 (Generic)

Mixer·2022년 5월 17일
0

Today I Learned (TIL)

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

Q. 제네릭을 왜 쓰는가?
A. 제네릭은 클래스나 메소드에서 사용할 내부 데이터 타입을 컴파일 시에 미리 지정하는 방법이다

  • 클래스나 메소드 내부에서 사용되는 객체의 타입의 안정성을 높인다
  • 반환값에 대한 타입 변환 및 타입 검사에 들어가느 노력이 줄어든다.
제네릭 선언 및 생성

class MyArray<T> {
	T element;
    void setElement (T element) {this.element = element;}
    T getElement(){return element;}
}

'T'를 타입 변수라고 말하며, 임의 참조형 타입이라 한다.
무조건 'T'만 쓰는것은 아니다, 어떤 문자를 사용해도 무관하고 여러 개의 타입 변수는 쉼표로 구분해 명시한다.
타입 변수는 클래스뿐 아니라 메소드의 매개변수나 반환값으로도 사용한다.

제네릭 클래스를 생성할땐 타입 변수 자리에 사용할 실제 타입을 명시한다
MyArray<Interger> myArr = new MyArray<Interger>();

이렇게 내부적으로 정의된 타입을 명시하면 실제 타입으로 변환되어 처리된다.

⚑ 타입 변수 자리엔 기본 타입을 바로 사용할 순 없고, Integer 처럼 래퍼(wrapper)클래스를 사용해야한다.

제네릭 메소드 (generic method)

제네릭 메소드의 선언붕에 타입 변수를 사용한 메소드를 말한다.
타입 변수의 선언이 메소드 선언부에서 반환 타입 바로 앞에 위치한다.

class CarList<T> {
	...
public static <T> void sort(List<T> list, Comparator<? super T> comp){
		...
	}
	...
}

와일드 카드

이름에 제한을 두지 않음을 표현하는 데 사용하는 기호를 말한다.
자바의 제네릭에서는 물음표 기호를 사용해 이러한 와일드카드를 쓸 수 있다.

<?>
타입 변수에 모든 타입을 사용할 수 있다.
<? extends T>
T 타입과 T 타입이 상속받는 하위 클래스 타입만 사용할 수 있다.
<? super T>
T 타입과 T 타입이 상속받은 상위 클래스 타입만 사용할 수 있다.

예제 > 수정 예정

import java.util.*;

class LandAnimal { 
	public void crying() { 
	System.out.println("육지동물"); 
    } 
}

class Cat extends LandAnimal { 
	public void crying() { 
	System.out.println("냐옹냐옹"); 
	} 
}

class Dog extends LandAnimal {
	public void crying() {
	System.out.println("멍멍"); 
	} 
}
class Sparrow {
	public void crying() {
	System.out.println("짹짹"); 
	} 
}
class AnimalList<T> {
    ArrayList<T> al = new ArrayList<T>();

    public static void cryingAnimalList(AnimalList<? extends LandAnimal> al) {
        LandAnimal la = al.get(0);
        la.crying();

    }

 

    void add(T animal) { al.add(animal); }
    T get(int index) { return al.get(index); }
    boolean remove(T animal) { return al.remove(animal); }
    int size() { return al.size(); }

}

 

public class Generic03 {
    public static void main(String[] args) {
        AnimalList<Cat> catList = new AnimalList<Cat>();
        catList.add(new Cat());
        AnimalList<Dog> dogList = new AnimalList<Dog>();
        dogList.add(new Dog());

        AnimalList.cryingAnimalList(catList);
        AnimalList.cryingAnimalList(dogList);

    }

}
 
profile
Minthug'life
post-custom-banner

0개의 댓글