[코틀린, kotlin] 배열(Array)와 리스트(List), 집합(Set)의 차이점과 사용방법

배열(Array)과 리스트(List), 집합(Set)는 서로 다른 데이터 구조입니다. 이번 시간에는 배열과 리스트의 차이점에 대해 알아보겠습니다.

목차
 1. 배열(Array), 리스트(List), 집합(Set) 비교
 2. 배열(Array) 사용방법
 3. 리스트(List) 사용방법
 4. 집합(Set) 사용방법

1. 배열(Array), 리스트(List), 집합(Set) 비교

(1) 배열(Array)
- 배열은 동일한 데이터 타입의 요소들이 연속적으로 저장되는 자료구조이다.
- 크기가 고정되어 있으며, 요소의 인덱스를 사용하여 각 요소에 접근할 수 있다.
- 인덱스는 0부터 시작하며, 요소의 순서가 중요한 경우에 주로 사용된다.
- Kotlin에서 배열은 Array 클래스로 표현되며, arrayOf() 함수를 사용하여 생성한다.

(2) 리스트(List)
- 리스트는 동적 크기의 순서가 있는 자료구조이다.
- 서로 다른 데이터 타입의 요소들도 함께 저장할 수 있다.
- 리스트는 배열과 달리 크기가 가변적이며, 요소를 추가, 삭제, 수정할 수 있다.
- Kotlin에서 리스트는 List 인터페이스를 구현한 ArrayList, mutableListOf, listOf 등의 클래스로 표현될 수 있다.

(3) 집합(Set)
- 집합은 순서가 없고, 중복된 값을 허용하지 않는 자료구조이다.
- 서로 다른 데이터 타입의 요소들도 함께 저장할 수 있다.
- Kotlin에서 집합은 Set 인터페이스를 구현한 HashSet, mutableSetOf, setOf 등의 클래스로 표현될 수 있다.
- 집합은 중복을 제거하고 고유한 요소들만 저장하고자 할 때 주로 사용된다.


이러한 자료구조들은 다양한 상황에서 사용되며, 각각의 특징과 용도에 따라 선택하여 사용하면 됩니다. 배열은 크기가 고정적이고 요소에 빠르게 접근해야 하는 경우에 적합하고, 리스트는 동적인 데이터를 관리하고 수정해야 할 때 사용하며, 집합은 고유한 값을 관리하거나 중복을 제거해야 할 때 사용합니다.

2. 배열(Array) 사용방법

(1) ArrayOf()

val numbers = arrayOf(1, 2, 3, 4, 5)

3. 리스트(List) 사용방법

(1) ArrayList()

크기를 동적으로 변경할 수 있으며, 요소의 추가, 삭제, 수정 등이 용이하다.
val numbers: ArrayList<Int> = ArrayList()
numbers.add(1)
numbers.add(2)
numbers.add(3)

(2) mutableListOf()

ArrayList와 같이 크기를 동적으로 변경할 수 있고, 요소의 추가, 삭제, 수정 등이 가능하다.
val numbers: MutableList<Int> = mutableListOf(1, 2, 3)
numbers.add(4)
numbers.removeAt(0)

※ arraylist와 mutableListof의 차이점

클래스와 함수
- ArrayList는 코틀린이 아닌 Java의 java.util.ArrayList 클래스를 사용하는 것으로, Java와의 호환성을 위해 제공된다.
- mutableListOf는 코틀린의 표준 라이브러리 함수로, Kotlin에서 리스트를 생성하는 함수이다.
타입 표기
- ArrayList는 일반적으로 타입 표기가 필요하며, ArrayList 형태로 사용됩니다. 여기서 T는 리스트에 저장할 요소의 타입을 나타낸다.
- mutableListOf는 타입 표기가 필요하지 않습니다. Kotlin의 타입 추론 기능을 활용하여 리스트를 생성할 때 타입을 자동으로 추론한다.
import 문
- ArrayList를 사용할 때는 Java의 java.util 패키지에 있는 클래스이므로, import 문을 추가해야 한다.
- mutableListOf는 코틀린의 표준 라이브러리에 포함되어 있으므로, 별도의 import 문 없이 사용할 수 있다.

(3) listOf()

- listOf 함수는 변경 불가능한(불변적인) 리스트를 생성하는 함수이다.
- 한 번 생성된 리스트는 크기와 내용을 변경할 수 없다.
val numbers: List<Int> = listOf(1, 2, 3)
// 아래 코드는 컴파일 에러를 발생시킨다.
// numbers.add(4)
// numbers.removeAt(0)

4. 집합(Set) 사용방법

(1) HashSet()

중복된 요소를 허용하지 않으며, 순서를 보장하지 않는다.
val numberSet: HashSet<Int> = HashSet()
numberSet.add(1)
numberSet.add(2)
numberSet.add(3)

(2) mutableSetOf()

HashSet와 같이 중복된 요소를 허용하지 않으며, 순서를 보장하지 않는다.
val mutableNumberSet: MutableSet<Int> = mutableSetOf(1, 2, 3)
mutableNumberSet.add(4)
mutableNumberSet.remove(1)

※ HashSet과 mutableSetof의 차이점

라이브러리
- HashSet는 Java의 java.util.HashSet를 사용하는 클래스로, Java와의 상호 운용성을 위해 제공된다.
- mutableSetOf는 코틀린의 표준 라이브러리에 포함된 함수로, Kotlin에서 직접 사용할 수 있다.
가변성
- HashSet는 변경 가능한(가변적인) Set입니다. 따라서 요소의 추가, 삭제, 수정 등의 변경 작업이 가능하다.
- mutableSetOf 역시 변경 가능한 Set을 생성하는 함수입니다. 따라서 생성된 Set에 요소를 추가, 삭제, 수정하는 등의 변경 작업이 가능하다.
타입 표기
- HashSet는 일반적으로 타입 표기가 필요하며, HashSet 형태로 사용됩니다. 여기서 T는 Set에 저장할 요소의 타입을 나타낸다.
- mutableSetOf는 타입 표기가 필요하지 않습니다. Kotlin의 타입 추론 기능을 활용하여 Set을 생성할 때 타입을 자동으로 추론한다.

(3) setOf()

- setOf 함수는 변경 불가능한(불변적인) Set을 생성하는 함수이다.
- 중복된 요소를 허용하지 않으며, 순서를 보장하지 않는다.
val numberSet: Set<Int> = setOf(1, 2, 3)
// 아래 코드는 컴파일 에러를 발생시킵니다.
// numberSet.add(4)
// numberSet.remove(1)