본문 바로가기

프로그래밍 언어/코틀린_Kotlin_더파기

Kotlin더파기_11_Collection_Set

list(리스트)는 각 요소를 index 위치로 찾기 때문에 중복이 가능하다.

그런데 요소를 중복하지 않도록 해서 같은 값은 하나만 저장하려면 set을 사용한다.

그러므로 set의 특징은 저장된 요소가 중복되지 않으며 순서가 있지도 않다.

그 외는 list와 비슷하다.

 

Set 만들기

 

컬렉션 set를 만든다.

 

set 안에 요소가 있는지 확인한다.

 

특정 위치 요소 찾기

set은 index(인덱스)를 사용하지 않기 때문에 인덱스 연산자[ ] 를 사용할 수 없다. 그러나 요소의 반복 처리 함수인 elementAt을 사용하여 알아낼 수는 있다. 요소가 많으면 list보다 속도가 느리고 인덱스에서 사용하는 add같은 변경자 함수도 사용할 수 없으므로 인덱스로 요소를 관리할 때는 list를 사용한다.

 

그러므로 중복 요소를 처리할 때는 set을 사용하고 인덱스를 사용할 때는 list를 사용한다. 두 함수를 적절히 활용하면 최상의 효과를 얻을 수 있다. 아래 요소 추가에서 예를 들어 알아보자.

 

 

요소 추가

 

애완동물의 color(색깔)로 사용할 리스트를 만든다.

 

앞에서 만든 변수에 추가로 4번줄에 '색깔'을 저장한 리스트를 만든다.

이제 변수 myPetList와 petColor을 랜덤으로 조합하여 10개의 이름을 만들어 본다.

 

변수 animal에는 myPetList를 섞어서(shuffled) 첫번째(first) 요소를 저장한다.

변수 color에는 petColor를 섞어서(shuffled) 첫번째(first) 요소를 저장한다.

이것을 각각(forEach) 10번 반복하여  변수 animalColor에 색+동물 형태로 저장한다.

 

실행하면 위와 같이 중복된 것도 있을 것이다.

이때 중복된 것을 제거하고 싶으면 set을 이용하면 된다.

 

5번줄에 deDuplication(중복 제거) 변수에 넣을 Set는 요소가 없는 상태이므로 코틀린의 타입 자동추론 기능을 사용할 수 없다. 그러므로 Type(타입)이 'String(문자열)'이라고 Generic(제네릭)형태로 표시해 준다.

 

16번줄에서 Set를 넣을 수 있는 deDuplication변수에 animalColor에 만드는 10개의 요소를 Set 컬렉션으로 저장한다. 이때 중복된 것은 자동으로 제거된다.

 

18번줄 코드로 출력해 보면 다음과 같다.

 

그런데 출력 결과가 10개가 안된다. 

중복된 것은 제거되었기 때문에 당연한 결과다.

이 결과는 실행할 때 마다 바뀌게 될 것이다.

 

이렇게 조합한 동물을 위한 물품을 10개 구입하는 코드를 만들어 본다.

물건 개수를 셀 변수 orderCount를 만들고 0으로 초기화한다.

물건 개수가 열 개 될 때 까지만 반복 처리하기 위해 while문을 사용한다. 

while 루프(반복)는 괄호 안의 조건이 true(참)일 동안에(while)만 실행하는 반복문이다.

 

실행하면 다음의 결과가 나타난다.

 

 

 

컬렉션 변환

 

컬렉션 사이에 변환할 수 있는 함수가 있다.

 

toSet()

toList()

 

List의 중복을 제거하기 위해 toSet함수를 사용하면 편리하다.

 

중복 제거 후 인덱스 값으로 처리하려면 다음과 같이 하면 된다.

 

코틀린에서는 위의 toSet과 toList 함수를 동시에 처리할 수 있도록 distinct() 함수를 만들었다.

 

distinct는 '분명한' 이라는 뜻이다. 본래 어원은 dis(떨어지다) + sting(찌르다)이다. 칼이나 창으로 찔러서 '분리하다, 떼어놓다'는 뜻인데 둘 사이를 떼어 놓으면 분명하게 구별된다는 뜻이다. distinguish는 '구별하다'는 뜻이다.

 

그래서 distinct()함수 이름은 컬렉션의 요소가 중복되거나 하지 않고 '분명하고 뚜렷한' 상태로 한다는 뜻으로 만든것 같다.

 

결론적으로 Set는 하나 밖에 없어야 하는 고유한 값을 가지는 테이터 요소를 저장하고 이용해야 할 때  쓸 수 있는 컬렉션이다.

 

Wraven...