본문 바로가기
Data Structure

List와 Set의 차이

by 오렌지먹는 개발자 2023. 9. 2.
반응형

List와 Set은 실무에서 자주 쓰는 개념이다.

두 타입의 차이를 잘 알고 있다면 기본기도 탄탄하게 하고 상황에 따라 List를 쓰는게 더 유리한지 Set을 쓰는게 더 유리한지 판단하는데 도움이 될 것이다.

개념적인 차이

List

  • 같은 종류의 아이템을 저장
  • 순서를 보장
  • 중복을 허용

Set

  • 같은 종류의 아이템을 저장
  • 순서를 보장하지 않음
  • 중복을 허용하지 않음

개념적인 차이를 필자가 좋아하는 야구를 주제로 간단한 예시를 들어 설명해보면 올해 한국 프로야구에서 한번이라도 홈런을 친 선수(모든 선수의 이름은 다 다르다고 가정)를 저장하려면 List와 Set 중에서 어떤 타입을 쓰는게 좋을까?

예시를 잘 살펴보면 모든 선수들의 이름은 다 다르다고 가정했으니 홈런을 친 선수들을 저장할때 중복을 허용할 필요가 없어 보인다.

게다가 별도로 순서를 보장할 필요도 없으므로 이 경우에는 중복을 허용하지 않고 순서도 보장하지 않는 Set을 쓰는게 좋겠다.

다른 예시를 들어보자면, 2000년도 부터 2022년까지 한국 프로야구에서 MVP를 수상한 선수를 순서대로 저장하려면 어떤게 좋을까?

조건을 살펴보면 순서를 보장해야하고 이승엽 선수처럼 뛰어난 선수는 여러번 MVP를 수상하기 때문에 중복도 허용해야 한다. 따라서 순서를 보장하고 중복을 허용하는 List를 사용하는게 좋을 것이다.

 

ADT(Abstract Data Type)와 자료구조(Data Structure)

잘 살펴보면 위에서 "자료구조"라는 단어를 한번도 언급하지 않았고 "개념, 타입"이라는 단어만 사용했다.

위와 같은 List 와 Set에 대한 설명은 ADT의 차원에서 설명한 것이다. ADT의 정의에서는 수행할 작업만 언급하고 이러한 작업이 어떻게 구현될지, 데이터가 메모리에서 어떻게 구성되는지, 작업을 구현하는 데 어떤 알고리즘이 사용되는지는 정의하지 않는다.

쉽게 말해서 어떻게(how) 구현하는지에 대한 언급 없이, 그 특징과 개념에 대해서 정의하는 것이 ADT다.

여기에 실제로 어떻게 구현하는지가 정의되면 자료구조가 되는 것이다.

Java 언어를 예시로 설명하자면, List와 Set은 인터페이스고 각각의 인터페이스를 구현하는 ArrayList, LinkedList, HashSet 등등 여러가지 다양한 구현체를 가지고 있다.

ADT: Set, List, Queue - interface
DS: HasSet, LinkedList, ArrayList, Vector, PriorityQueue - class

결국 List와 Set의 ADT차원에서의 개념들을 잘 알고있어야 기본적으로 어떤걸 쓸지를 선택할 수 있고, 그 후 세부적으로 어떠한 구현체를 사용하면 유리할지를 또 생각할 수 있게 된다.

각각의 구현체들은 서로 다른 장단점이 있고 속도나 메모리 등을 고려하여 실무에서 어떤 구현체를 사용하는 것이 내가 지금 개발하려고 하는 서비스에 활용하기 적합한지 잘 판단하여 사용해야 한다.

반응형

'Data Structure' 카테고리의 다른 글

Set과 Hash Table  (0) 2023.09.06

댓글