본문 바로가기
부트캠프/팀스터디

제네릭

by 상똥 2024. 1. 17.

1. 제네릭이란

- 다양한 타입의 객체들을 다루는 메서드나 컬렉션 클래스에 컴파일 시의 타입 체크를 해주는 기능

- Java에서 다양한 데이터 타입을 사용하는 클래스나 메서드를 작성할 때, 코드의 재사용성과 안정성을 향상시키기 위해 도입된 기능

 

2. 사용 방법 

- 선언 방법은 아래와 같음

public class ClassName <T> { ... }
public class ClassName <T, V> { ... }

- Key, Value를 사용하는 Map과 같은 경우, 두 가지 변수를 선언할 수 있음

- T, V 등의 타입은 클래스 안에서만 유효

- MyCustomList.class

package oop2.jenerics;

import java.util.ArrayList;

public class MyCustomList<T> {

    ArrayList<T> list = new ArrayList<>();

    public  void addElement(T element){
        list.add(element);
    }

    public void removeElement(T element){
        list.remove(element);
    }
}

- Generics.class

package oop2.jenerics;

public class GenericsRunner {
    public static void main(String[] args) {
        MyCustomList<String> list = new MyCustomList();
        list.addElement("Element 1");
        list.addElement("Element 2");

        MyCustomList<Integer> list2 = new MyCustomList();
        list2.addElement(Integer.valueOf(5));
        list2.addElement(Integer.valueOf(7));

    }
}

- MycutomList 클래스의 타입을 굳이 지정하지 않았기 때문에, String타입과 Integer타입 모두 사용하여 리스트를 생성할 수 있음

* 암묵적인 규칙

제네릭 타입 설명
T Type
E Element
K Key
V Value
N Number

 

3. 제네릭의 장점

- 타입 안정성 : 컴파일러가 코드에서 발생할 수 있는 타입 관련 오류를 미리 감지 / 런타임 시 발생할 수 있는 형변환 오류를 방지하고 안정적인 코드를 작성할 수 있음

- 코드의 재사용성 : 여러 타입에서 동작하는 코드를 한 번 작성하여 재사용 가능 / 동일한 로직을 가지면서 다양한 타입에 대응하는 메서드나 클래스를 구현할 수 있음

- 유연성 및 확장성 : 다양한 타입의 데이터를 처리하는 클래스나 메서드를 만들 수 있음

 

4. 제네릭의 단점

- 복잡성 증가 : 일반적인 코드에 비해 더 복잡하게 느껴질 수 있음, 가독성 감소시킬 수 있음

- 호환성 : 자바5 이전의 버전에서는 호환되지 않음

- 타입 지정 제한 : 원시타입(int, short, boolean,,,)은 제네릭 타입으로 지정할 수 없음

 

5. 와일드카드

- 제네릭 타입을 좀 더 유연하게 다룰 수 있는 도구

- '?'로 사용될 수 있음

- 사용 예시1 : 어떤 타입이든 허용하는 와일드카드

List<?> list = new ArrayList<String>();

- 사용 예시2 : 와일드카드에 상한이나 하한을 지정하여 특정 타입의 하위 타입이나 상위 타입만을 허용

// 하위타입을 지정
List<? extends Number> numbers = new ArrayList<Integer>();

//상위타입을 지정
List<? super Integer> integers = new ArrayList<Number>();

- ChatGPT "와일드카드는 유연성을 제공하지만, 그만큼 코드를 읽고 유지보수하는 데 어려움을 초래할 수 있습니다. 사용 시에는 주의하여 필요한 상황에서만 사용하는 것이 좋습니다."