천발무금
1k
2018-10-25 10:52:28
3
8831

자바에서 List, List <?>, List <T>, List <E> , List <Object> 차이가 무엇인가요?


자바에서 List, List <?>, List <T>, List <E> , List <Object> 차이가 무엇인가요?

제가 이해하는 내용은 아래와 같습니다.. 다른 부분이 있다면 지적해주시면 감사드리겠습니다.


List : 기본 8개 타입, String, 각종 객체들 모두 넣을 수 있습니다.

        값을 가져와서  equals 같은 메서드를 쓰면 기본 8개 타입엔 equals 메서드가 없기 때문에 오류가 날 수 있습니다.


List <?> : 기본 8개 타입, String, 각종 객체들 모두 넣을 수 있습니다.
                그냥 List로 선언하는 것과 무슨 차이가 있는지 모르겠습니다.


List <T> : 직접 테스트는 안해봤지만 아래 링크를 읽어보니 기본 8개 타입, String, 각종 객체들 모두 넣을 수 있는 것으로 보입니다.

읽어본 링크 : https://lng1982.tistory.com/70


List <E>: 직접 테스트는 안해봤지만 위 링크를 읽어보니 기본 8개 타입, String, 각종 객체들 모두 넣을 수 있는 것으로 보입니다.


List <Object> : 기본 8개 타입, String, 각종 객체들 모두 넣을 수 있습니다.
                         위 항목들과 어떤 점이 다른지 모르겠습니다..

1
  • 답변 3

  • action
    2k
    2018-10-25 11:39:08

    List 는 변수선언 interface형태로 선언시

    또는 함수등에서 반환값등을 List 형태로해주면

    어떤형태의 List나 받을수 있어서 함수유연성이 좋아집니다.

    List <?>는 함수에서 일회성 인자로 받는 변수를 제한하기 용이합니다.

    List <T>, List <E> 클래스레벨에서 타입유연성 타입제한등 처리하기 좋습니다.

    List <Object> 위에상황에서 모두 가능하나 너무 유연성이 높고 타입체크등 버그의 위험성 직관성등에서 떨어집니다.



    list 자체는 어떤 형태의 데이터를 담고있습니다.

    list interface를 보시면 <E> 제네릭형태를 받게 되어있습니다.

    자바버전에 따라서 선언시 변수형태와 new생성시 제네릭 형태를 모두 명시하거나 제외할수있습니다.

    말씀하신 부분들은 어떻게 쓰느냐에 따라서 런타임시 동작은 모두 같을수있습니다.


    ?는 와일드카드 T E같은 문자는 제네릭이며 보통 내부에서 처리되서 쓰는것은element라는 의미로 E로 쓰이긴하나 강제적이지는 않습니다.


    와일드 카드와 제네릭은 같으면서 조금다르고 보통 와일드 카드는 함수에서 사용하고 끝나는 일회성 용도로 사용하고 제네릭은 클래스등과 같이 내부에서 공유해서 사용하거나 좀더 복잡하고 확장성 있게 사용할때 사용됩니다.


    Object는 자바 객체들의 최상위 객체로서 마찬가지로 여러형태를 받을수 있습니다.


    다들 각자의 차이점은 존재하나 사용용도에 따라서 객체지향적으로 개발이 용이합니다.


    와일드 카드의경우 함수에서 특정함수들만 사용할때 ? extends Integer등 타입 제한을걸기 좋구요.


    제네릭의 경우 List처럼 여러 타입들을 사용할수있지만 List<String> strList 이런식으로 사용할경우 strList는 새로 생성하지 않는한 string형태만 받게 컴파일에서 잡아줍니다.


    제네릭은 보통 클래스 레벨에서 사용하고

    와일드카드는 일회성같은 메소드나 메소드 내부변수등에서 사용합니다.

    Object는 다양하게 사용하실수 있으나 와일드카드나 제네릭에비해 코드나 버그등의 위험이 높습니다.

    제네릭이나 와일드카드로 쉽게해결될것을 Object를 사용해서 리플렉션이나 instanceof등으로 수십줄 코드추가및 직관성 코드복잡도 상승등이 있을수 있습니다.


    댓글로 다 설명하기엔 많은양이라서 자세한것은 자바 Object, 자바 wildcard, 자바 generic 등을 공부하셔야 이해하기 좋습니다.

  • 오페투오소
    238
    2018-10-25 11:42:00

    생활 코딩 제네릭

    에서 제네릭을 사용하는 이유는 배우셔야 겠고 


    그냥 제네릭을 사용하지 않겠다는 것은

    무엇이든 넣을수 있겠지만..

    컴파일 단계에서 단계에서 오류가 나지 않아도

    러닝시 문제가 발생할 수도 있습니다. 


    제네릭을 사용하면

    컴파일 단계에서 타입이 맞지 않을 시 오류가 검출되고 

    중복 제거와 타입 안정성을 동시에 추구할 수 있습니다.


    <> 사이에 T,E,K,V 이것은 

    다 같은 동작을 하고 

    네이밍은 관습이라 합니다. 

    ex) E는 List, ArrayList 와 같은 컬렉션을 사용할때 사용한다.


    스택오버플로우


    • T 유형을 의미합니다.
    • E엘리먼트 ( List<E>엘리먼트 목록)
    • K열쇠입니다 (에서 Map<K,V>)
    • V 값 (반환 값 또는 매핑 된 값)입니다.

    그것들은 완전히 교환 가능하다 (동일한 선언에도 불구하고).

    • <> 사이의 문자는 단지 이름입니다. 답안에서 설명하는 것은 단지 관습입니다. 그것은 대문자로 된 단일 문자 일 필요조차 없습니다. 클래스, 변수 등 원하는 이름을 지정할 수있는 것처럼 원하는 이름을 사용할 수 있습니다.



    <Object> 해당 객체로만 받는다.

    <Object> 안에서 Object로 받았기 때문에 Object가 넣을수 있는 기본 8개 타입, String, 각종 객체를 

    넣을 수 있는것이고 <UserVo> , <Board> 등 개발을 위해 생성한 객체 모두 사용가능합니다.



  • 단설
    624
    2018-10-25 11:55:21

    List:

    raw type이라고 부르죠 보통. 이렇게 쓰시면 안됩니다.

    리스트에 새로운 element 넣을 때 타입체크가 안 되서 문제생길 여지가 아주 많습니다.

    참고로 primitive타입 못넣습니다. 마찬가지로 Integer같은 wrapper 클래스 써야됩니다. 만약 그냥 들어가더라도 실질적으로는 auto-boxing 되어서 들어가는 겁니다.


    List<?>:

    wildcard 라고 부릅니다.

    위 raw type처럼 모든 element를 Object로 간주하는건 똑같습니다. 그런데 차이점이 있다면 add()가 막혀있습니다. null만 넣을 수 있죠. 그래서 이상한 타입의 element가 리스트에 추가되는걸 막아줍니다. 덕분에 안전합니다.

    그리고 List<? extends Number> 이런 식으로 범위를 한정지을 수도 있어서 더욱 유용합니다. 


    List<T>, List<E>:

    위 두가지는 type parameter 이름이 다를 뿐 본질적으로 같은겁니다.

    기능은 wildcard랑 거의 비슷합니다.

    차이점이 있다면 메소드나 클래스 내부에서 저 T, E같은 type parameter을 참조할 수 있단 것 뿐입니다.


    List<Object>:

    raw type과 동일합니다. 가급적 쓰지 않는 것을 추천드립니다.

  • 로그인을 하시면 답변을 등록할 수 있습니다.