[Swift 프로그래밍] 컬렉션형 (Collection)

이정훈·2022년 5월 7일
0

Swift 기본

목록 보기
2/22
post-thumbnail

본 내용은 스위프트 프로그래밍 3판 (야곰 지음) 교재를 공부한 내용을 바탕으로 작성 하였습니다.

0.튜플(tuple)


튜플(tuple)은 지정된 타입에 대한 데이터의 묶음 정도로 보면 정확할 듯하다. 따라서 다양한 타입의 데이터를 한번에 묶을 수 있으며, Python의 경우 tuple 타입은 immutable한 자료형이지만 Swift에서는 var로 선언할 경우 mutable한 타입으로 내부 요소를 수정할 수 있다.

아래는 Swift의 tuple 타입의 간단한 예시이다.

var personLee: (String, Int, Double) = ("jeunghun", 24, 173.3)   //여러개의 타입을 묶어 tuple로 선언
print("이름: \(personLee.0), 나이: \(personLee.1), 키: \(personLee.2)")
//tuple index

//내부 요소 변경
personLee.1 = 25
personLee.2 = 175   //index를 이용한 값 변경
print("이름: \(personLee.0), 나이: \(personLee.1), 키: \(personLee.2)")

Swift의 tuple은 타입에 이름을 지정해줄 수 있기 때문에 tuple의 각 요소를 index 뿐만 아니라 타입에 지정한 이름으로도 접근이 가능하다.

다음은 tuple의 각 요소에 이름을 지정해주고 지정해준 이름으로 각 요소에 접근하는 예시이다.

//tuple 각 타입에 이름 지정
var personKim: (name: String, age: Int, height: Double) = ("cheolsoo", 99, 162.3)   //여러개의 타입을 묶어 tuple로 선언
print("이름: \(personKim.name), 나이: \(personKim.age), 키: \(personKim.height)")

personKim.age = 25
personKim.height = 175   //이름을 이용한 값 변경
print("이름: \(personKim.name), 나이: \(personKim.age), 키: \(personKim.height)")

다음으로 스위프트의 컬렉션형에 대하여 알아보겠다.
컬렉션형에는 배열, 딕셔너리, 세트 등이 존재한다.

1. 배열(Array)


배열은 같은 자료형의 데이터를 나열하여 저장하는 형태의 컬렉션형이다.
배열의 선언하는 형태는 다음과 같다.

var (변수명): Array<데이터 타입> = []

배열 선언시 let 키워드를 사용하면 변경을 할 수 없는 배열이 되고, var 키워드를 사용하면 변경이 가능한 배열이 된다.

다음은 배열의 선언과 여러가지 메서드를 이용한 배열의 활용 예시이다.

var programing: Array<String> = ["jeunghun", "Python", "Java", "Swift"]
//var names: [String] = ["jeunghun", "Python", "Java", "Swift"]와 같음
programing[2] = "Kotlin"  //names 배열 2번째 요소값 변경
print(programing.isEmpty)
print(programing.count)
print(programing[2])

programing.append("C++")  //배열 마지막에 "C++" 추가
programing.append(contentsOf: ["HTML", "Objective-C"])   //배열 마지막에 두 가지 요소 추가
programing.insert("C#", at: 2)
programing.insert(contentsOf: ["CSS", "JavaScript"], at: 3)

print(programing[4])
print(programing.firstIndex(of: "Swift"))   //"Swift"가 나오는 첫번째 위치
print(programing.firstIndex(of: "R language")) //존재하지 않는 요소는 nil 반환
print(programing.first) //첫번째 요소값
print(programing.last)  //마지막 요소값

let firstElement: String = programing.removeFirst()  //배열의 0번째 요소 삭제 후 변수에 저장
let lastElement: String = programing.removeLast()   //배열의 마지막 요소 삭제 후 변수에 저장
let indexElement: String = programing.remove(at: 1) //배열의 1번째 요소 삭제 후 변수에 저장

print(firstElement)
print(lastElement)
print(indexElement)
print(programing)

배열의 각 요소는 인덱스를 통해 접근이 가능하다. 만약 인덱스의 범위가 넘어서게 되면 오류를 발생 시킨다.

아래는 위의 예시에서 사용된 메서드의 내용이다.

  • isEmpty 프로퍼티는 비어있는 배열인지를 True와 False로 반환한다.
  • count 프로퍼티는 배열의 요소 수를 반환한다.
  • firstIndex(of:) 메서드는 해당요소가 배열에 위치한 index를 반환한다. 만약 존재 하지 않는 요소라면 nil을 반환한다.
  • append(_:) 메서드는 배열의 마지막에 요소를 추가 시켜준다. 만약 원하는 위치에 요소를 추가 하고 싶다면, insert(_:at:) 메서드를 사용한다.
  • remove(_:) 메서드는 배열의 요소를 삭제하고 삭제된 요소를 반환시킨다.

2. 딕셔너리(Dictionary)


딕셔너리 컬렉션형은 순서를 가지지 않고 key와 value 쌍을 데이터로 가지는 컬렉션 형이다.
순서를 가지지 않으므로 key의 이름을 중복해서 쓸 수 없으며, 배열과 마찬가지로 let 키워드 사용시 변경 할 수 없는 딕셔너리가 되고 var 키워드 사용시 변경 가능한 딕셔너리로 생성 할 수 있다.

딕셔너리의 선언과 형태는 다음과 같다.

var (변수명): Dictionary<String, Int> = Dictionary<String, Int>()
//var (변수명): [String: Int] = [String: Int]()로 표현 가능
//Dictioinary의 key와 value를 명시하였다면 다음도 가능
//var (변수명): [String: Int] = [:]

같은 딕셔너리라도 여러가지 표현 방법이 있는 것을 알 수 있다.

다음은 딕셔너리의 선언과 메서드 활용의 예시이다.

var releaseDay: [String: Int] = ["Java": 1995, "Python": 1991, "Swift": 2014, "Kotlin": 2011]
print(releaseDay)
print(releaseDay.isEmpty)
print(releaseDay.count)

print(releaseDay["Java"])
print(releaseDay["HTML"])   //존재하지 않는 key값은 nil 반환

releaseDay["JavaScript"] = 1995     //새로운 key:value 추가
print(releaseDay["JavaScript"])

print(releaseDay.removeValue(forKey: "Python")) //key를 제거하고 value 반환
print(releaseDay["Python", default: 0])   //key값이 없으면 기본값으로 0을 반환

딕셔너리의 요소는 순서를 가지지 않으므로 요소에 접근하거나 새로운 요서를 추가하기 위하여 딕셔너리의 key값으로 호출한다. 만약 존재 하지 않는 key 값을 호출할 경우 nil을 반환한다.

위 예시에 사용된 메서드의 대한 설명이다.

  • removeValue(forKey:) 메서드는 딕셔너리에 있는 요소를 제거 후 반환한다.

3. 세트(Set)


세트(Set)는 같은 데이터형을 순서를 가지지 않고 하나의 묶음으로 저장하는 컬렉션형이다. 다른 언어의 집합과 같은 개념이다. 세트 또한 순서를 가지지 않기 때문에 중복된 값을 허용하지 않는다.
마찬가지로 세트를 let으로 선언하면 변하지 않는 세트를 var로 선언하면 변한는 세트로 선언 할 수 있다.

다음은 세트의 선언 방법과 형태이다.

var set: Set<String> = Set<String>() // 빈 Set 생성
//var set: Set<String> = [] 위와 같은 표현

세트는 배열이나 딕셔너리와 달리 키워드를 축약형으로 쓰는것이 불가능하다.

다음은 세트를 활용한 예시이다.

var language: Set<String> = ["Swift", "Java", "Python"]  //Set 생성
print(language.isEmpty)
print(language.count)

language.insert("Kotlin")
print(language)

print(language.remove("Java"))
print(language.remove("Objective-C")) //존재 하지 않는 값은 nil 반환

스위프트에는 집합 연산과 관련된 여러 메서드가 존재한다.
다음은 세트에서 사용 할 수 있는 교집합, 합집합, 교집합의 여집합, 차집합의 메서드에 관한 예시이다.

let englishClassStudent: Set<String> = ["Lee", "Kim", "Park", "Choi"]
let mathClassStudent: Set<String> = ["Lee", "Kim", "Son", "Hwang"]

//교집합
let intersectSet: Set<String> = englishClassStudent.intersection(mathClassStudent)
print(intersectSet)

//교집합의 여집합
let symmetricDiffSet: Set<String> = englishClassStudent.symmetricDifference(mathClassStudent)
print(symmetricDiffSet)

//합집합
let unionSet: Set<String> = englishClassStudent.union(mathClassStudent)
print(unionSet)

//차집합
let subtractSet: Set<String> = englishClassStudent.subtracting(mathClassStudent)
print(subtractSet)

print(symmetricDiffSet.sorted())    //세트 오름차순 정렬
profile
새롭게 알게된 것을 기록하는 공간

0개의 댓글