TIL

TIL - 2024/09/06

기석김 2024. 9. 6. 17:50

제네릭에 대해 공부했다. 제네릭 중요하다.

 

제네릭은 " 코드의 재사용성을 높이고, 타입 안전성을 강화"  << 이것만 외우면 된다.

 

제네릭은 " 코드의 재사용성을 높이고, 타입 안전성을 강화"

제네릭은 " 코드의 재사용성을 높이고, 타입 안전성을 강화"

제네릭은 " 코드의 재사용성을 높이고, 타입 안전성을 강화"

제네릭은 " 코드의 재사용성을 높이고, 타입 안전성을 강화"

 

 

제네릭을 사용하면 컴파일 시 타입 검사를 할 수 있어 런타임 에러를 줄일 수 있다. : 타입 안전성

다양한 타입을 처리할 수 있는 코드를 작성할 수 있다.: 코드 재사용성

명시적인 타입 정보를 제공하여 코드의 가독성 향상.: 가독성 

 

쉽게, 제네릭은 라벨이 붙어있는 거다. 안에 뭐가 들었는지 박스를 안 열어봐도 되고

그 박스 바깥에, 이 박스는 뭐에 대한 박스이다. 제네릭을 잘 쓴다면 매우 간편하다.

 

제네릭이란?

제네릭은 클래스나 메소드에서 사용할 데이터 타입을 외부에서 지정할 수 있게 하는 기법,

자바의 배열과 함께 자주 사용되는 리스트(List) 자료형의 선언에서 제네릭을 흔히 볼 수 있음.

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

 

리스트에서 제네릭 사용

List<String> stringList = new ArrayList<>();
stringList.add("Hello");
stringList.add("World");

for (String str : stringList) {
    System.out.println(str);
}

 

맵에서 제네릭 사용

Map<String, Integer> map = new HashMap<>();
map.put("One", 1);
map.put("Two", 2);


for (Map.Entry<String, Integer> entry : map.entrySet()) {
    System.out.println(entry.getKey() + " = " + entry.getValue());
}

제네릭의 장점 

 

타입 안전성

제네릭을 사용하면 컴파일 시 타입을 검사하여 런타임 에러를 줄일 수 있다

List<String> stringList = new ArrayList<>();
stringList.add("Hello");
// stringList.add(1); // 컴파일 에러

 

코드 재사용성

제네릭을 사용하면 다양한 타입을 처리할 수 있는 코드를 작성 가능

public class Pair<K, V> {
    private K key;
    private V value;

    public Pair(K key, V value) {
        this.key = key;
        this.value = value;
    }

    public K getKey() {
        return key;
    }

    public V getValue() {
        return value;
    }
}

 

가독성

제네릭을 사용하면 명시적인 타입 정보를 제공하여 코드의 가독성을 향상

Box<String> intBox = new Box<>();
intBox.setContent("");
System.out.println(intBox.getContent());

제네릭의 제한

제한된 타입 파라미터

제네릭 타입 파라미터는 특정 타입을 상속받거나 구현하도록 제한할 수 있다

public class NumberBox<T extends Number> {
    private T number;

    public void setNumber(T number) {
        this.number = number;
    }

    public T getNumber() {
        return number;
    }
}

 

와일드카드

와일드카드는 제네릭 타입을 보다 유연하게 사용할 수 있도록 함

public void printList(List<?> list) {
    for (Object elem : list) {
        System.out.println(elem);
    }
}

// Number와 그 하위 타입만을 받는다
public static void print(List<? extends Number> list) {
    for (Number num : list) {
        System.out.println(num);
    }
}

 

와일드카드는 세 가지 종류가 있다.

  1. <?>: 모든 타입 허용
  2. <? extends 타입>: 타입과 그 하위 타입 허용
  3. <? super 타입>: 타입과 그 상위 타입 허용

 

List<?>: 어떤 타입이든 허용

  • List<Object>, List<Number>, List<Integer> 모두 허용
  • List<? extends Number>: Number와 그 하위 타입만 허용
    • List<Number>, List<Integer>는 허용되지만 List<Object>는 허용 X
  • List<? super Integer>: Integer와 그 상위 타입만 허용
    • List<Object>, List<Number>는 허용되지만 List<Long>는 허용 X