TIL - 2024/09/06
제네릭에 대해 공부했다. 제네릭 중요하다.
제네릭은 " 코드의 재사용성을 높이고, 타입 안전성을 강화" << 이것만 외우면 된다.
제네릭은 " 코드의 재사용성을 높이고, 타입 안전성을 강화"
제네릭은 " 코드의 재사용성을 높이고, 타입 안전성을 강화"
제네릭은 " 코드의 재사용성을 높이고, 타입 안전성을 강화"
제네릭은 " 코드의 재사용성을 높이고, 타입 안전성을 강화"
제네릭을 사용하면 컴파일 시 타입 검사를 할 수 있어 런타임 에러를 줄일 수 있다. : 타입 안전성
다양한 타입을 처리할 수 있는 코드를 작성할 수 있다.: 코드 재사용성
명시적인 타입 정보를 제공하여 코드의 가독성 향상.: 가독성
쉽게, 제네릭은 라벨이 붙어있는 거다. 안에 뭐가 들었는지 박스를 안 열어봐도 되고
그 박스 바깥에, 이 박스는 뭐에 대한 박스이다. 제네릭을 잘 쓴다면 매우 간편하다.
제네릭이란?
제네릭은 클래스나 메소드에서 사용할 데이터 타입을 외부에서 지정할 수 있게 하는 기법,
자바의 배열과 함께 자주 사용되는 리스트(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);
}
}
와일드카드는 세 가지 종류가 있다.
- <?>: 모든 타입 허용
- <? extends 타입>: 타입과 그 하위 타입 허용
- <? 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