🔥 컬렉션의 가변성

380자
5분

Swift에서는 배열(Array), 집합(Set), 사전(Dictionary)과 같은 컬렉션을 다룰 때, 해당 컬렉션이 가변(mutable)인지 불변(immutable)인지를 고려해야 합니다. 이는 컬렉션을 변수에 할당하느냐 상수에 할당하느냐에 따라 결정됩니다.

가변 컬렉션

변수에 컬렉션을 할당하면 가변 컬렉션이 생성됩니다. 가변 컬렉션은 생성 후에도 아이템을 추가, 제거, 변경하는 등의 작업을 통해 컬렉션을 변경할 수 있습니다. 아래 코드를 통해 가변 배열의 예시를 살펴볼게요.

swift
var numbers = [1, 2, 3, 4, 5] // 가변 배열 생성
numbers.append(6) // 배열에 6을 추가
numbers[0] = 10 // 첫 번째 요소를 10으로 변경
numbers.remove(at: 2) // 인덱스 2의 요소를 제거
 
print(numbers) // [10, 2, 4, 5, 6] 출력
swift
var numbers = [1, 2, 3, 4, 5] // 가변 배열 생성
numbers.append(6) // 배열에 6을 추가
numbers[0] = 10 // 첫 번째 요소를 10으로 변경
numbers.remove(at: 2) // 인덱스 2의 요소를 제거
 
print(numbers) // [10, 2, 4, 5, 6] 출력

위 코드에서는 numbers라는 가변 배열을 생성하고, 다양한 연산을 통해 배열을 변경하고 있어요. append(_:)를 사용하여 요소를 추가하고, 인덱스를 통해 특정 위치의 요소를 변경하며, remove(at:)을 사용하여 요소를 제거하는 모습을 볼 수 있습니다.

마찬가지로 집합과 사전도 변수에 할당하면 가변 컬렉션이 되죠.

swift
var set = Set([1, 2, 3]) // 가변 집합 생성
set.insert(4) // 집합에 4를 추가
set.remove(2) // 집합에서 2를 제거
 
var dict = ["A": 1, "B": 2] // 가변 사전 생성
dict["C"] = 3 // 사전에 "C": 3 추가
dict["A"] = 10 // "A" 키의 값을 10으로 변경
dict.removeValue(forKey: "B") // "B" 키와 값을 제거
swift
var set = Set([1, 2, 3]) // 가변 집합 생성
set.insert(4) // 집합에 4를 추가
set.remove(2) // 집합에서 2를 제거
 
var dict = ["A": 1, "B": 2] // 가변 사전 생성
dict["C"] = 3 // 사전에 "C": 3 추가
dict["A"] = 10 // "A" 키의 값을 10으로 변경
dict.removeValue(forKey: "B") // "B" 키와 값을 제거

불변 컬렉션

반면에 상수에 컬렉션을 할당하면 불변 컬렉션이 생성됩니다. 불변 컬렉션은 한 번 생성되면 크기와 내용을 변경할 수 없습니다. 불변 컬렉션의 예시를 보겠습니다.

swift
let immutableNumbers = [1, 2, 3, 4, 5] // 불변 배열 생성
// immutableNumbers.append(6) // 컴파일 에러 발생!
// immutableNumbers[0] = 10 // 컴파일 에러 발생!
 
let immutableSet: Set<Int> = [1, 2, 3] // 불변 집합 생성
// immutableSet.insert(4) // 컴파일 에러 발생!
 
let immutableDict: [String: Int] = ["A": 1, "B": 2] // 불변 사전 생성
// immutableDict["C"] = 3 // 컴파일 에러 발생!
swift
let immutableNumbers = [1, 2, 3, 4, 5] // 불변 배열 생성
// immutableNumbers.append(6) // 컴파일 에러 발생!
// immutableNumbers[0] = 10 // 컴파일 에러 발생!
 
let immutableSet: Set<Int> = [1, 2, 3] // 불변 집합 생성
// immutableSet.insert(4) // 컴파일 에러 발생!
 
let immutableDict: [String: Int] = ["A": 1, "B": 2] // 불변 사전 생성
// immutableDict["C"] = 3 // 컴파일 에러 발생!

위 코드에서 immutableNumbers, immutableSet, immutableDict는 모두 상수에 할당된 불변 컬렉션입니다. 이들을 변경하려고 하면 컴파일 에러가 발생한답니다.

언제 가변 컬렉션을 사용할까요?

가변 컬렉션은 컬렉션의 내용을 동적으로 변경해야 하는 경우에 사용합니다. 예를 들어, 사용자의 입력에 따라 배열에 요소를 추가하거나 제거해야 할 때, 가변 배열을 사용하는 것이 적절할 것입니다. 또한 알고리즘 구현 시 중간 결과를 저장하기 위해 가변 컬렉션을 활용할 수도 있겠죠.

반면에 컬렉션의 내용이 변경되지 않고 고정된 경우라면 불변 컬렉션을 사용하는 것이 좋습니다. 불변 컬렉션을 사용하면 실수로 컬렉션의 내용을 변경하는 일을 방지할 수 있고, 코드의 안정성과 예측 가능성이 높아집니다.

따라서 상황에 맞게 적절한 컬렉션의 가변성을 선택하는 것이 중요하답니다!

YouTube 영상

채널 보기
AI를 위한 선형대수, 데이터는 점구름이다
11편, 왜 DB마다 성능이 다를까? 엔진별 B-Tree 저장 방식 비교
5편, B-Tree 내부 노드에서 키를 삭제할 때 정렬 규칙을 지키는 방법
AI는 데이터를 어떻게 분류할까? 벡터의 거리와 KNN 알고리즘 | 선형대수학
2편, B-Tree 자료구조의 구조와 속성
AI를 위한 선형대수 - 전단, 행렬식, 변환의 핵심
트라이(Trie) 자료구조: 파이썬으로 삽입(Insert) 연산 구현하기 | Trie 자료구조 이야기
밑바닥부터 배우는 컴퓨터 구조 - 트랜지스터에서 CPU까지