xxo' TIL/WIL

IOS/Swift

[Swift] 컬렉션 타입(Collection Types) - Array, Dictionary, Set, tuple

xxoxec 2025. 6. 11. 15:39
Swift는 값 컬렉션을 저장하기 위해 배열, 집합, 딕셔너리라는 세 가지 주요 컬렉션 유형을 제공합니다.
배열은 순서가 있는 값의 컬렉션입니다. 집합은 순서가 없는 고유한 값의 컬렉션입니다. 딕셔너리는 순서가 없는 키-값 연결의 컬렉션입니다.
Swift의 배열, 집합, 딕셔너리는 저장할 수 있는 값과 키의 타입을 항상 명확하게 정의합니다. 즉, 실수로 잘못된 타입의 값을 컬렉션에 삽입할 수 없습니다. 또한 컬렉션에서 가져올 값의 타입을 확실하게 알 수 있습니다.

 

array, set, dictionary 차이

https://docs.swift.org/swift-book/documentation/the-swift-programming-language/collectiontypes/

 

Documentation

 

docs.swift.org

 

배열(array) : 여러 데이터, 항목을 순서대로 담아 놓은 변수이자 저장할 수 있는 컬렉션타이다. 다양한 타입의 데이터를 순서대로 저장할 수 있다. 여러 변수를 한번에 저장할 수 있는 방법으로 [ ] 로 감싸서 생성한다.

데이터 묶음을 표현할 때, 배열 및 딕셔너리를 이용해 표현

두 타입 모두 [ ] 를 이용하여 선언한다.

개별 아이템 접근 시 index를 이용하며, index는 0부터 시작한다.

순서에서 벗어난 index를 요청하면 크래시 발생.

생성된 배열을 변수(var)에 할당하면 항상 변경이 가능하다. 즉, 항목을 추가하거나 제거 또는 수정하여 변경할 수 있으며,

상수(let)에 할당 시 해당 배열은 변경할 수 없으며 크기와 내용 또한 변경이 불가능하다.

// Array
var arr = [Int] = []
var arr = [String]()
var arr = Array<Int> = []

let numArr = [2,4,5,8,10] // int

let colorArr = ["green", "red", "yellow"] // string
let color = colorArr[0] // "green"

var doubleArr: [Double] = [0.1, 0.3, 0.5] // double
var floatArr = [float]() // 비어있음
var boolArr: [Bool]= []

numArr.count // count를 이용해 배열의 개수 확인
numArr.isEmpty // inEmpty를 사용해 비어있는지, 값이 담겨있는지 확인
numArr.append(1) // append를 사용하여 인덱스 추가(맨 뒤)
numArr += [2, 3, 4] // += 연산자 사용하여 인덱스 추가
numArr.insert(98, at:0) // 첫번째 인덱스에 넣는 방법, 특정 인덱스에 추가 방법
numArr.contains(1) // 포함되어 있는 인덱스 확인
numArr.remove(at : 1) // remove를 사용하여 특정 인덱스 값 삭제
numArr.removeLast() // removeLast를 사용해 마지막 인덱스 삭제
numArr.removeAll() // removeAll를 사용해 전체 삭제
numArr.shuffle() // shuffle를 사용해 배열의 인덱스를 무작위로 섞음

// 비어있는 배열 초기화
var emptyArr: [Int] = []
var emptyArr: [Int]()

// 임의의 기본 값으로 초기화
var digitCounts = Array(repeating:0, count:10)

다양한 타입의 데이터를 순서대로 저장. index = 0부터 시작
세가지 문자열을 저장하는 배열을 생성, 배열의 항목에 접근하기 위해서는 인덱스를 사용하며, 인덱스는 0부터 시작.

 

딕셔너리(dictionary) : 여러 데이터를 키와 값의 형태로 담아 놓은 변수로 쌍으로 이루어진 데이터 구조이다. 정렬되지 않은 동일한 타입의 값과 목록을 저장하는 데 사용. 이를 통해 특정 키를 사용하여 관련 값을 쉽게 찾아낼 수 있다.

Key : Value로 데이터를 저장. 키(key)라는 고유 식별자를 사용하며, 키를 통해 값을 참조하고 조회할 수 있고, 값에 접근할 때는 키를 통해서 접근 가능하다.

정수나 문자열이 될 수 있으며 딕셔너리 내에서 고유한 값이어야 한다.

접근한 키의 값이 없으면 nil, 접근한 키의 값이 있으면 해당 값을 전달한다. 따라서 딕셔너리를 사용할 때는 키의 존재 여부를 확인하거나 옵셔널 바인딩을 사용하여 안전하게 값을 처리하는 것이 좋다.

딕셔너리를 변수(var)에 할당하면 항상 변경이 가능하며, 상수(let)에 할당하면 변경할 수 없다.

// Dictionary (Key : Value)
var nameDic = [String : String] = [:]
var nameDic = [int : String]()

var languageCode = [
	"한국" : "ko",
    "미국" : "en",
    "일본" : "ja",
]

let code = languageCode["한국"] // "ko"

languageCode.count // count를 사용하여 개수 확인(키:값)쌍의 개수를 출력
languageCode.removeValue(forKey: "일본") // 키에 해당되는 값을 삭제
languageCode["미국"] = nil // 키에 해당되는 값을 삭제

// 비어있는 딕셔너리 초기화
var emptyDic: [String:any] = [:]
var emptyDic: [String:any]()

key : value 로 저장, 정렬되지 않은 동일한 타입의 값과 목록을 저장하는 데 사용.
특정 키를 사용하여 딕셔너리에서 값을 얻어올 수 있다. 만약 존재하지 않는 키로 접근하려고 하면 nil 반환.

 

셋(set): 모유한 값들의 모음으로 ,동일한 타입의 여러 데이터를 순서 상관없이, 그리고 중복 없이 담아 놓은 변수.

항목의 순서가 중요하지 않거나 중복 값이 없는지 확인하려는 경우에 배열 대신 셋을 이용할 수 있다. (고유한 값만 허용)

set 형태로 저장되기 위해서는 반드시 타입이 hashable 이여야 하며, swift에서는 String, Int, Double, Bool 같은 기본 타입은 기본적으로 hashable이다.

배열(array)과 차이점: 순서가 없고(랜덤 순서), 중복 데이터를 들고 있지 않다.

 

// set
var numSet = Set<int> =[]
var numSet = Set<int>()

var primes: Set<Int> = [2, 3, 5, 7]
// 중복 데이터 넣으려고 시도하면, 중복된것 알아서 무시됨
var evens = Set<Int>([2, 4, 6, 8, 2, 4])

// set 접근 및 수정
someSet.count // count는 항목의 갯수를 표현하는데 사용
someSet.insert(9) // insert를 사용하여 새로운 값을 추가, 삽입
someSet.isEmpty // isEmpty를 사용하여 비어있는지 확인
someSet.remove(9) // remove 함수를 이용해 값을 제거
someSet.contains(9) // contains 함수를 사용해 값이 포함되어 있는지 확인
// set 집합 연산
let setA: Set<Int> = [1, 2, 3, 4, 5] // [5, 2, 3, 1, 4] 
let setB: Set<Int> = [3, 4, 5, 6, 7] // [5, 6, 7, 3, 4]

let union: Set<Int> = setA.union(setB) // [2, 4, 5, 6, 7, 3, 1]union 키워드로 합집합
let sortedUnion: [Int] = union.sorted() // [1, 2, 3, 4, 5, 6, 7] sorted 키워드로 같은 타입의 배열로 정렬
let intersection: Set<Int> = setA.intersection(setB) // intersection 키워드로 교집합
let subtracting: Set<Int> = setA.subtracting(setB) // subtracting 차집합

// 비어있는 set 초기화 
var emptySet: Set<Int>
var emptySet: Set<Int>()

순서가 없고(랜덤), 중복 데이터 X
대괄호 [ ] 를 사용하여 여러 요소를 저장할 수 있다.

Set 특징 

  • 부분집합, 교집합, 합집합 등의 집합 연산 : Set은 수학적인 집합의 연산을 지원한다. 예를 들어, 두 집합 간의 교집합이나 합집합을 구하거나, 한 집합이 다른 집합의 부분집합인지 확인하는 등의 연산을 수행할 수 있다.
  • 중복 제거 : Set의 가장 큰 특징 중 하나는 동일한 요소를 중복해서 저장할 수 없다는 것이다. 만약 중복된 요소를 추가하려고 하면, Set은 그 요소를 자동으로 제거한다.
  • 순서가 없음 : Set은 요소들 간에 특정한 순서를 갖지 않다. 따라서 특정 인덱스로 요소에 접근할 수 없다.

Set은 중복 없이 요소를 관리하거나, 두 집합 간의 관계를 파악할 때 유용하게 사용된다.

 


 

 

tuple :  여러 데이터를 하나의 값으로 표현. 세부 데이터 접근 시, 포지션 또는 이름으로 접근 가능.

여러 데이터를 하나의 값으로 표현
값이 없을 시 바로 시스템 오류 에러 확인 가능
이름없이 설정 가능, 다만 순서로만 접근
오타 위험이 적으므로 에러 발생 감소
이름표가 없기 때문에 순서로만 접근 가능

 

 

 


 

 

Swift에서 데이터를 저장하는 방식은 크게 배열(array)과 딕셔너리(dictionary)로 구분할 수 있다.

인덱스 만으로 데이터를 특정하는 경우 배열을 사용하며, 순서가 보장되고 안전하게 값을 저장할 수 있다.

Key : Value 키값을 통해 데이터를 저장하는 경우면 딕셔너리를 사용할 수 있고, 키를 가지고 값을 연결하므로 효율적인 데이터를 저장할 수 있지만, 배열처럼 순서를 보장할 수 없다.

셋(set) 컬렉션은 배열처럼 한 가지 타입을 저장하지만 배열과 다르게 순서를 보장하지 않고, 중복값을 허용하지 않는 특징이 있다.