til/Java

제네릭(generic)

값진 2022. 4. 27. 23:11

제네릭(generic)

  - 데이터의 타입(data type)을 일반화(generalize) 하는 것

  - 클래스나 메소드에서 사용할 데이터 타입을 컴파일 시에 미리 지정하는 것

  - 객체의 타입 안정성을 높일 수 있다.

  - 컴파일 할 때 타입이 미리 정해지므로, 형 변환같은 번거로운 작업을 생략할 수 있다.

 

사용

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

  - T는 타입변수로, 임의의 참조형을 의미 (다른 문자 사용 가능)

  - 메소드의 매개변수나 반환값으로도 사용할 수 있다.

 

MyArray<Integer> myArr = new MyArray<Integer>();

  - 제네릭 클래스를 생성할 때에는 타입 변수 자리에 사용할 실제 타입을 명시해야함

  - 자바에서 타입 변수 자리에 사용할 실제 타입을 명시할 때 기본 타입을 바로 사용할 수 없다.

  - Integer와 wrapper를 사용해야한다.

 

import java.util.*;

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

class Cat extends LandAnimal { public void howl() { System.out.println("야옹"); } }
class Dog extends LandAnimal { public void howl() { System.out.println("멍멍"); } }

class Sparrow { public void howl() { System.out.println("까악"); } }

 
class AnimalList<T> {
    ArrayList<T> al = new ArrayList<T>();

    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 Generic {
    public static void main(String[] args) {
        AnimalList<LandAnimal> landAnimal = new AnimalList<>();

        landAnimal.add(new LandAnimal());
        landAnimal.add(new Cat());
        landAnimal.add(new Dog());

        // landAnimal.add(new Sparrow()); //에러

        for (int i = 0; i < landAnimal.size() ; i++) {
            landAnimal.get(i).howl();
        }
    }
}

결과

육지동물

야옹

멍멍

 

Cat과 Dog 클래스는 LandAnimal 클래스를 상속받는 자식 클래스이므로 AnimalList<LandAnimal>에 추가할 수 있다.

Sparrow 클래스는 타입이 다르므로 추가할 수 없다.