본문 바로가기
Everyday Study

2024.08.16(금) { 와일드카드 캡쳐, transient }

by xogns93 2024. 8. 16.

와일드카드 캡쳐

와일드카드 캡처(Capture of Wildcards)는 제네릭 타입을 사용할 때 발생하는 문제를 해결하기 위한 기법입니다. 와일드카드는 ?를 사용하여 제네릭 타입의 유연성을 높이는 데 사용되지만, 때로는 와일드카드를 특정 타입으로 "캡처"하여 더 명확하게 사용할 필요가 있습니다. 특히 제네릭 메서드나 클래스에서 와일드카드를 사용하면서 타입 매개변수로 명확히 지정해야 하는 경우에 유용합니다.

 

? 놔두면 아무거나 다 될 수 있어서 혼란이 올 수 있지만 T로 하면 예를 들어 String로 하면 다 String로 고정되기 때문에 와일드카드 캡처

 

와일드카드 캡처 문제

예를 들어, 다음과 같은 코드가 있을 때:

public void addToList(List<?> list, Object value) {
    list.add(value); // 컴파일 오류 발생
}

위 코드에서 listList<?> 타입으로 정의되어 있습니다. 이 경우 ?가 어떤 타입인지 명확하지 않기 때문에, 컴파일러는 listvalue를 추가하는 것이 안전한지 판단할 수 없습니다. 따라서 컴파일 오류가 발생합니다.

와일드카드 캡처 방법

이 문제를 해결하기 위해, 와일드카드 캡처 기법을 사용하여 와일드카드를 특정 타입으로 캡처하고 제네릭 메서드를 통해 이를 처리할 수 있습니다.

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가 어떤 타입이든 listvalue를 안전하게 추가할 수 있습니다.

왜 와일드카드 캡처가 필요한가?

와일드카드 캡처는 제네릭 타입의 타입 안정성을 유지하면서도, 코드의 유연성을 유지하기 위해 필요합니다. 와일드카드는 ?로 타입의 범위를 넓게 가져갈 수 있지만, 특정 상황에서는 해당 와일드카드가 실제로 어떤 타입인지를 캡처하여 명확하게 처리해야 합니다. 이를 통해 컴파일러가 타입 안정성을 유지하면서도, 개발자는 더 유연한 제네릭 코드를 작성할 수 있게 됩니다.

요약

  • 와일드카드 캡처는 제네릭 메서드나 클래스에서 와일드카드(?)가 나타내는 타입을 캡처하여 특정 타입으로 고정하는 기법입니다.
  • 캡처된 타입은 제네릭 메서드를 통해 명확하게 사용할 수 있으며, 이를 통해 컴파일러가 타입 안정성을 유지할 수 있습니다.
  • 와일드카드 캡처는 제네릭 프로그래밍의 복잡성을 관리하면서도, 타입 안전성과 유연성을 동시에 제공하는 중요한 기술입니다.

transient : 직렬화과정에서 제외시키는 키워드 ex)  User 테이블에서 비밀번호

 

자바에서 인터페이스도 필드로 사용할 수 있다.

 

[L = [는 배열을 나타내는 표기법, L 은 1차원 배열이란 뜻