Uknow's Lab.
article thumbnail

 

 

코틀린에서는 자주 사용하는 자료구조들을 모아 정의해놓은 컬렉션 프레임워크(Collection Framework)를 지원합니다.

자바 프로그래머들에겐 굉장히 익숙한 녀석이죠?

 

처음 들어보시나요?

사실 이 시리즈를 따라오신 분들이라면 이미 사용해본 경험이 있으실 겁니다.

List, ArrayList, LinkedList 등의 List도 컬렉션 프레임워크의 일종이거든요.

 

List는 이미 한 번 다뤄봤으니, 컬렉션 삼형제의 다른 녀석들인 Set과 Map을 한 번 볼까요?

 

 

집합 (Set)

Set은 집합입니다. 수학시간때 배운 기억을 더듬더듬 꺼내봅시다…

집합은 일반적으로 중복을 허용하지 않으며, 순서가 없습니다.

 

List의 경우, 중복을 허용하며 순서 역시 유의미한데 비해,

Set의 경우는 집합이며, 중복을 허용하지 않고, 이들간의 나열 순서는 무의미합니다.

 

fun main() {
    val set1 = setOf(1, 3, 4, 3, 4)
    val set2 = mutableSetOf(1, 2, 3, 4, 5, 6, 1, 2, 3, 4, 3, 3, 2)

    println(set1)
    println(set2)
}

// 출력
>>> [1, 3, 4]
[1, 2, 3, 4, 5, 6]

 

Set 역시 List와 마찬가지로, 불변성 set과 가변성 MutableSet으로 나눠집니다.

이들은 setOf / mutableSetOf 를 통해 생성이 가능하며,

중복으로 같은 원소를 집어넣었음에도, 중복 원소에 대해 한 개의 값만 갖고 있습니다.

 

 

val set1 = Collections.emptySet<Int>() // mutable
val set2 = emptySet<Int>() // immutable

set1.add(1) // mutable - add 가능
set2.add(1) // immutable - add 불가

 

빈 집합을 생성하고 싶을 땐, emptySet()을 통해 생성할 수 있는데,

Collections.emptySet<T>()은 mutable,

emtySet<T>()은 immutable 입니다.

 

 

추가 add / 삭제 remove

 

val set = mutableSetOf(1, 2, 3, 4, 5, 6, 1, 2, 3, 4, 3, 3, 2)

set.add(10) // set에 10 추가
println(set)
set.remove(3) // set에서 10 제거
println(set)

// 출력
>>> [1, 2, 3, 4, 5, 6, 10]
[1, 2, 4, 5, 6, 10]

 

add는 집합에 원소를 추가하는 메소드이며,

remove는 집합에서 특정 원소를 제거하는 메소드입니다.

 

리스트를 다루면서 많이 본 애들이죠?

 

이들은 당연하게도, mutableSet에만 사용할 수 있습니다.

 

 

Contains

fun main() {
    val set = setOf(1, 2, 3, 4, 5, 6, 1, 2, 3, 4, 3, 3, 2)

    println(set.contains(3)) // 집합 내 3이 있는지 확인
    println(set.contains(100)) // 집합 내 100이 있는지 확인
    println(2 in set) // 집합 내 2가 있는지 확인
}

// 출력
>>> true
false
true

 

contains는 집합 내 원소가 있는지 확인하는 함수입니다.

물론, 배열과 같이 contains 대신 in 키워드를 사용할 수도 있습니다.

 

원소의 확인이므로, 가변/불변 집합 모두 사용이 가능합니다.

 

 

차집합

val set1 = setOf(1, 2, 3, 4, 5, 6)
val set2 = setOf(3, 4, 5, 6, 7, 8, 9)

println(set1.subtract(set2)) // set1 에서 set2 차집합
println(set1 - set2)

// 출력
[1, 2]
[1, 2]

 

두 집합의 차집합은 A.subtract(b)를 통해 구할 수 있습니다.

A - B를 통해서도 차집합을 구할 수 있습니다.

자바를 주 언어로 쓸 때는 파이썬에서 차집합을 - 를 사용해 구하는게 부러웠는데,

이제 부럽지 않게 되었습니다. ㅎㅎ

 

 

합집합

val set1 = setOf(1, 2, 3, 4, 5, 6)
val set2 = setOf(3, 4, 5, 6, 7, 8, 9)

println(set1.union(set2)) // set1과 set2 합집합
println(set1 + set2)

// 출력
[1, 2, 3, 4, 5, 6, 7, 8, 9]
[1, 2, 3, 4, 5, 6, 7, 8, 9]

 

두 집합의 합집합은 A.union(B)를 사용해 구할 수 있습니다.

A + B를 사용해서도 가능합니다.

 

 

교집합

val set1 = setOf(1, 2, 3, 4, 5, 6)
val set2 = setOf(3, 4, 5, 6, 7, 8, 9)

println(set1.intersect(set2))
println(set1 intersect set2)

// 출력
>>> [3, 4, 5, 6]
[3, 4, 5, 6]

 

두 집합의 교집합은 A.intersect(B)를 통해 구할 수 있습니다.

+, - 와 같은 키워드를 사용한 간소화는 못찾았지만,

infix 함수를 사용해 A intersect B와 같이 표현할 수도 있습니다.

 

이 외에도, 배열이나 리스트와 마찬가지로 max, min, average 등을 지원합니다.

 

 

2편에서는 Map에 대해 알아보도록 하겠습니다.

profile

Uknow's Lab.

@유노 Uknow

인생은 Byte와 Double 사이 Char다. 아무말이나 해봤습니다.