와일드카드 캡쳐
와일드카드 캡처(Capture of Wildcards)는 제네릭 타입을 사용할 때 발생하는 문제를 해결하기 위한 기법입니다. 와일드카드는 ?
를 사용하여 제네릭 타입의 유연성을 높이는 데 사용되지만, 때로는 와일드카드를 특정 타입으로 "캡처"하여 더 명확하게 사용할 필요가 있습니다. 특히 제네릭 메서드나 클래스에서 와일드카드를 사용하면서 타입 매개변수로 명확히 지정해야 하는 경우에 유용합니다.
? 놔두면 아무거나 다 될 수 있어서 혼란이 올 수 있지만 T로 하면 예를 들어 String로 하면 다 String로 고정되기 때문에 와일드카드 캡처
와일드카드 캡처 문제
예를 들어, 다음과 같은 코드가 있을 때:
public void addToList(List<?> list, Object value) {
list.add(value); // 컴파일 오류 발생
}
위 코드에서 list
는 List<?>
타입으로 정의되어 있습니다. 이 경우 ?
가 어떤 타입인지 명확하지 않기 때문에, 컴파일러는 list
에 value
를 추가하는 것이 안전한지 판단할 수 없습니다. 따라서 컴파일 오류가 발생합니다.
와일드카드 캡처 방법
이 문제를 해결하기 위해, 와일드카드 캡처 기법을 사용하여 와일드카드를 특정 타입으로 캡처하고 제네릭 메서드를 통해 이를 처리할 수 있습니다.
public <T> void addToListHelper(List<T> list, T value) {
list.add(value); // 이제 컴파일 오류가 발생하지 않음
}
public void addToList(List<?> list, Object value) {
addToListHelper(list, value);
}
위 코드에서 addToListHelper
메서드는 T
라는 제네릭 타입 매개변수를 사용하여 List<?>
를 List<T>
로 캡처합니다. 이제 T
가 어떤 타입이든 list
에 value
를 안전하게 추가할 수 있습니다.
왜 와일드카드 캡처가 필요한가?
와일드카드 캡처는 제네릭 타입의 타입 안정성을 유지하면서도, 코드의 유연성을 유지하기 위해 필요합니다. 와일드카드는 ?
로 타입의 범위를 넓게 가져갈 수 있지만, 특정 상황에서는 해당 와일드카드가 실제로 어떤 타입인지를 캡처하여 명확하게 처리해야 합니다. 이를 통해 컴파일러가 타입 안정성을 유지하면서도, 개발자는 더 유연한 제네릭 코드를 작성할 수 있게 됩니다.
요약
- 와일드카드 캡처는 제네릭 메서드나 클래스에서 와일드카드(
?
)가 나타내는 타입을 캡처하여 특정 타입으로 고정하는 기법입니다. - 캡처된 타입은 제네릭 메서드를 통해 명확하게 사용할 수 있으며, 이를 통해 컴파일러가 타입 안정성을 유지할 수 있습니다.
- 와일드카드 캡처는 제네릭 프로그래밍의 복잡성을 관리하면서도, 타입 안전성과 유연성을 동시에 제공하는 중요한 기술입니다.
transient : 직렬화과정에서 제외시키는 키워드 ex) User 테이블에서 비밀번호
자바에서 인터페이스도 필드로 사용할 수 있다.
[L = [는 배열을 나타내는 표기법, L 은 1차원 배열이란 뜻
'Everyday Study' 카테고리의 다른 글
2024.08.20(화) { 클래스 로더, .invoke, seald, qualified name } (0) | 2024.08.20 |
---|---|
2024.08.19(월) { 타겟 클래스, Stream } (0) | 2024.08.20 |
2024.08.15(목) { ( @component,@Bean,@Autowired ), 커밋, Thread Context } (0) | 2024.08.15 |
2024.08.14(수) { 스레드 동기화, Lock 과 Lock의 종류 (0) | 2024.08.15 |
2024.08.13(화) { IoC 컨테이너 동작 과정, enum데이터베이스, CGLIB 서브클래싱 = 프록시, 추상클래스->익명클래스O, 람다X } (0) | 2024.08.13 |