List <? extends List <LatLng >> 사용법

조회수 709회

List <? extends List <LatLng >> 의 자료형을 사용하려고 합니다. 하지만 어떻게 사용할지 잘 모르겠습니다. 예제를 알려주세요!

1 답변

  • ? extends List<LatLng>List<LangLng>를 상속한 어떤 타입 이란 의미를 갖습니다.

    예를 들어보면 아래와 같은 코드가 있습니다.

    class LatLng {}
    class LatLng2 extends LatLng {}
    class LatLng3 extends LatLng {}
    
    void print(List<LatLng> l) {}
    
    List<LatLng> l1;
    List<LatLng2> l2;
    List<LatLng3> l3;
    
    print(l1);
    print(l2);
    print(l3);
    

    이 코드를 컴파일 하게 되면 print(l2);print(l3);에서 오류가 발생할 것입니다. LatLng2LatLng3LatLng를 상속하고이어 캐스팅이 가능합니다. 하지만 List<LatLng>List<LatLng2>List<LatLng3>에 대해서 어떠한 상속 관계도 갖지 않는 타입니다. List는 원소의 상속관계를 상관하지않기에 List<LatLng>, List<LatLng2>, List<LatLng3>는 서로 다른 타입이고 void print(List<LatLng> l)List<LatLng>에 대한 호출만 가능합니다.

    그렇다면 세가지 타입에 대한 print()를 작성해야 하는데, 이는 중복된 작업이 있을 수 있고 print()는 단지 LatLng를 상속하던 안하던 LatLng에 대한 내용만 출력하고 싶을 수 있습니다.

    이를 위해서 print()를 아래와 같이 제네릭을 적용할 수 있습니다.

    void print(List<? extends LatLng> l) {}
    

    이렇게 변환하면 print(l1);, print(l2);, print(l3);를 할 수 있는 함수를 작성할 수 있습니다.

    다시 본론으로 넘어와 List <? extends List <LatLng >> 는 어떤식으로 사용하는 것일 까요?

    void func(List <? extends List <LatLng >> l) {
        // ..
    }
    
    List<ArrayList<LatLng>> l1;
    List<LinkedList<LatLng>> l2;
    List<LinkedList<LatLng>> l3;
    
    func(l1);
    func(l2);
    func(l3);
    

    위 코드를 보면 l1, l2, l3ArrayListLinkedList든 결국 하고하자는 일은 LatLng을 차례대로 저장하는 것입니다. 다만 구현에 따라 두 형태의 리스트로 나뉘는 것일 뿐이지요. 위 코드에서 List <? extends List <LatLng >>로 해두었기에 ArrayListLinkedListfunc()을 호출 할 수 있습니다. 만약 List <List <LatLng >>으로 했다면 l1, l2, l3에 대한 호출 모드 오류가 발생합니다. 앞서 설명 드렸듯이 List에는 원소의 상속관계가 적용되지 않기 때문입니다.

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)