Programming Language/Kotlin

[Kotlin] Collections Set 사용법 (List 중복제거)

개발왕 금골드 2020. 8. 29. 00:37
반응형

안녕하세요 골드입니다.

Kotlin의 Collections pacakage에서 Set 자료구조 사용에 대해서 글을 쓰도록 하겠습니다.

 

 Set은 자료구조 중에 한 종류입니다. Set을 사용하기 전에, Set의 가장 큰 특징은 요소의 중복이 허용되지 않는다는 점입니다. List는 같은 형식의 요소가 넘버링되어 저장되었습니다. 1을 add하고 또 1을 넣으면 0번째 데이터가 1이고 1번째 데이터가 1일 뿐이었지만, Set은 단 하나의 값만 저장됩니다. 

 

1. Set 생성

 Set을 생성하겠습니다. 다른 Collections와 마찬가지로 setOf()와 mutableSetOf()가 있습니다. 읽기 전용이냐 아니냐의 차이입니다. 먼저 setOf()를 사용해서 Set을 생성하겠습니다.

 setOf()로 생성한 모습입니다. 여기까지 봐선 List나 Array같은 형식과 차이점을 느끼지 못하겠습니다. Set만의 특징을 보기 위해 중복된 데이터를 넣은 후에 println()으로 출력해보겠습니다.

 

 목요일 금요일이 사라진 끔찍한 상황입니다. 하지만 Set데이터는 중복을 허락하지 않기 때문에 "수"가 한 번만 저장됩니다. 

 

 Set은 index를 사용하지 않기 때문에 get()과 set()이 없습니다. 하지만 요소들이 저장된 순서에 따라서 index로 값을 불러오는 elementAt() 함수가 존재하긴 합니다. 다만 Set을 이렇게 사용한다면 List를 사용하는게 훨씬 좋습니다. 제공하는 함수이지만 추천하는 함수는 아닙니다. 

 

2. Set에 요소 추가, 삭제

 setOf()를 사용해서 생성해봤습니다. 이번에는 mutableSetOf()를 사용해서 요소를 추가하고, 삭제하겠습니다.

 mutableSetOf<String>()으로 mutableSet을 생성했습니다. mutable은 변경 가능함을 나타냅니다. 선언과 동시에 값을 초기화하지 않을 경우에는 <String>같이 <> 사이에 자료형을 작성해서 어떤 데이터를 담는 Set인지 컴파일러에게 전달해줘야 합니다. 그렇게 하지않으면 에러가 발생합니다. 이건 Kotlin에서의 약속입니다. List와 함수가 비슷하지만 다른 점은 특정 index에 추가하는 add(index, element) 함수가 없습니다. Set은 add(element)만 존재합니다. remove()역시 remove(element)만 존재합니다. +=, -= 연산자로 추가, 삭제하는 것은 다른 자료구조(예: List)와 동일합니다. 

 

3. Set에 다양한 함수들

 앞서 살펴본 몇 가지 함수 외에 다른 함수들을 보겠습니다.

 먼저 size()가 있습니다. 생성한 Set 데이터에 size를 return합니다. 특정 데이터가 존재하는지 알아볼 수 있는 contains() 함수도 있습니다. 존재하면 true, 없으면 false를 리턴합니다. 최솟값을 나타내는 min()과 최댓값을 나타내는 max()함수가 있습니다. 문자열 데이터는 사전 순서에 맞게 최솟값과 최댓값을 return 합니다. 모든 데이터를 지우는 clear()가 있습니다.

 

 intersect는 뒤에 오는 매개변수의 Collections 데이터에 요소들과 겹치는 값이 있으면 그 값들을 Set형식으로 return합니다. 여기서 Set(day)에서 intersect를 사용했기 때문에 Set으로 return되는 것입니다. subtract는 뒤에 오는 Collections 요소와 같은 값이 존재하면 해당 값을 빼고 return합니다. "수"가 존재하기 때문에 "수"를 제외한 "월", "화"가 return되었습니다. union은 두 Collections 매개변수를 합쳐서 return합니다.

 

4. List와 Set의 형변환

 Set은 중복을 허용하지 않는다는 점이 가장 큰 특징이자 장점입니다. 이 부분을 List와 함께 활용하면 더욱 도움이 됩니다. 보통 List 형식을 많이 사용하기 마련인데 코딩을 하다보면 중복된 값을 제거해야 하는 경우가 생길 수 있습니다. 이런 경우에 List를 Set으로 형변환한 후에 다시 List로 형변환해서 손쉽게 중복된 값을 제거할 수 있습니다. Kotlin의 Collections들은 서로 형변환이 가능하기 때문에 이런 일이 가능합니다. 

List 형식의 day를 println()으로 찍어보면 중복된 값이 나오지만 Set으로 한 번 형변환한 후에 다시 List로 돌아오면 중복이 제거된 채로 새로운 List를 가져올 수 있습니다. distinct() 역시 내부적으로 toSet().toList()를 호출하는 함수입니다.

 

여기까지 골드였습니다.

감사합니다.

 

참고자료 : https://kotlinlang.org/docs/reference/set-operations.html

 

Set Specific Operations - Kotlin Programming Language

 

kotlinlang.org

 

반응형