Swifter {Swift Developer}

메뉴

8. 구간 및 배열, 사전

[vc_row][vc_column][vc_column_text]Swift 언어는 컬렉션으로 배열, 사전형이 있습니다. 배열에 대입할 수 있는 값은 선언시 지정한 형만 되고 Any등의 특수한 형을 사용하면 다양한 값을 하나의 배열에 넣을 수 있습니다. 또한 “3보다크고 10보다 작은 숫자”와 같은 구간 표현이 가능한 구간형도 제공되고 있습니다.[/vc_column_text][vc_separator][vc_custom_heading text=”(1) 구간 (Range, ClosedInterval, HalfOpenOnterval)
” use_theme_fonts=”yes”][vc_column_text]구간을 생성하는 연산자는 닫힌 구간 (A1…A2)와 반개구간 (A1..<A2) 가 있습니다. A1과 A2가 정수라면 각각 “A1 ≦ i ≦ A2가 되는 정수 i구간”과 “A1 ≦ i < A2가 되는 정수 i구간”이라고 표현합니다. 이들 구간은 for-in에서 자주 이용되며 “구간~=수””에서 수치가 그 구간에 포함되어 있는지를 확인할 수 있습니다.[/vc_column_text][vc_column_text]

[code lang=”swift”]
1…7 // 1..<8
1..<7 // 1..<7

for i in 1..<7 {
print(i) // 1~6까지 출력
}

1…7 ~= 7 // true, 1 ≦ 7 ≦ 7 성립
1..<7 ~= 7 // false, 1 ≦ 7 < 7 성립안됨
[/code]

[예제 2-75] 정수 구간 예제[/vc_column_text][vc_column_text]정수 이외에 부동소수점으로 만든 Range형은 for-in문은 사용할 수 없지만 “구간~=수치” 판별에 사용할 수 있습니다.양쪽의 부동소수점 구간은 ClosedInterval<Double> 또는 HalfOpenInterval<Double>클래스 인스턴스입니다.[/vc_column_text][vc_column_text]

[code lang=”swift”]
1.0…7.0 ~= 7.0 // true. ClosedInterval
1.0..<7.0 ~= 7.0 // false, HalfOpenInterval
1.0..<7.0 ~= 6.99 // true
[/code]

[예제 2-76] 부동소수점 구간 예제
[/vc_column_text][vc_column_text]다만, “구간~=수치” 판별은 구간 리터럴이 자동으로 ClosedInterval과 HalfOpenInterval로 처리된다는 점을 주의해야 합니다.  그리고 정수 구간을 변수에 대입하면 Range<Int>형으로 구정되기 때문에 “구간~=수치”를 사용할 수 없다는 것도 기억하기 바랍니다.[/vc_column_text][vc_custom_heading text=”(2) 배열 (Array)

” use_theme_fonts=”yes”][vc_column_text]배열을 생성하는 리터럴은 “값1, 값2, …”형태입니다. 배열값에 배열 내용의 형까지 추론하게 됩니다. 배열형을 지정하는 경우 Int나 String 에 [ ]형을 감싸면 됩니다. 또한 [String] 제네릭에 의한 표현 Array<String>과 같은 의미로 사용됩니다. 제네릭에 대해서는 나중에 설명하기 때문에 넘어갑시다.

var number = [3, 6, 9, 12]

number[2] // 결과: 9

var sido: [String] = [“서울시”, “경기도”, “충청도”, “강원도”]

서로 다른 형을 가진 요소를 포함한 배열도 자동으로 형추론을 합니다. 하지만 자동으로 형추론을 하지 못하는 경우도 있기 때문에 되도록 이면 [Any]형을 지정하여 작업하는 습관을 들이는 것을 추천합니다.Any형은 protocol<>별칭이며 모든 형의 상속의 형입니다. 프로토콜에 대해서는 나중에 자세히 설명합니다.

var ex1: [Any] = [1, Int32(1), UInt(1)]

배열 요소를 참조하려면 인덱스 값으로 [ ] 괄호로 인덱스 값을 지정합니다. 배열 요소를 변경할 경우, 참조하는 것과 동일하게 인덱스를 사용하여 값을 할당합니다.  배열 끝에 요소를 추가할 경우에는 append() 또는 “+=” 연산자를 사용하여 값을 할당합니다.[/vc_column_text][vc_column_text]

[code lang=”swift”]
var sido: [String] = ["서울시", "경기도", "충청도", "강원도"]

let city = sido[1] // 결과: 경기도

sido.append("경상도") // 경상도가 추가됨
[/code]

[예제 2-77] 배열에 요소 추가[/vc_column_text][vc_column_text]

배열에서 구간 사용

배열의 인덱스 구간(Range)를 지정하여 여러개의 요소를 한번에 배열로 가져오는 방법이 있습니다. 예제 2-77에서 다음과 같은 코드를 추가해 봅시다.

sido[1…2] // 결과: “경기도”, “충청도”

또한 배열의 인덱스 구간을 지정하여 배열 요소를 수정하거나 삽입할 수 있습니다.

sido[3..<3] = [“제주도”]

sido // 결과: “서울시”, “경기도”, “충청도”, “제주도”, “강원도”, “경상도”

배열의 인덱스를 구간으로 지정하여 배열 요소를 제거하는 방법도 있습니다. 인덱스를 사용하여 배열을 제거하는 함수는 removeAtIndex가 있고 배열을 삭제하는 removeAll(), 배열의 마지막 요소를 제거하는 removeLast()가 있습니다.

sido.removeAtIndex(5) // 경상도 요소제거

sido[0…0] = []  // 서울시 요소 제거

sido.removeAll(keepCapacity: false) // sido 빈배열

요소를 변경하면 배열 크기도 변경되고, 변수가 가리키는 배열 인덱스는 변경됩니다. 정수 배열이 변수(var)에 대입하면 변수에 값이 복사되는 것이기 때문에 내용을 쉽게 변경할 수 있습니다.[/vc_column_text][vc_custom_heading text=”(3) 집합 (Set)

” use_theme_fonts=”yes”][vc_column_text]집합은 Swift 2 표준 라이브러리에 추가된 형입니다. 집합은 배열과 유사하지만 배열과 달리 중복 요소는 저장할 수 없으며 요소간의 순서가 없습니다.

집합에 포함될 수 있는 요소는 제네릭에 지정할 수 있지만, 해시 형으로 제한됩니다.

해시 형은 hashValue()에서 값을 리턴해주는 형태로 Int와 String, Double, Bool등이 있습니다.[/vc_column_text][vc_column_text]

[code lang=”swift”]
var s1: Set = ["한국", "중국", "미국"] // 배열 리터럴 문자열 집합 – 형추론
var s2 = Set<String>() // 문자열 집합을 생성자에서 만듬
var s3 = [1, 2, 3] as Set // 배열 리터럴 정수 집합
var arr = [7, 8, 9]
var s4 = Set(arr) // 배열에서 생성자에서 집합 만듬 – 형추론
[/code]

[예제 2-78] 집합 예제[/vc_column_text][vc_column_text]위 예제를 살펴보면 배열에서 Set 생성자를 사용하여 집합을 만듭니다. 반대로 집합에서 배열을 생성하려면 Set의 sort() 메소드를 사용합니다.  집합에 값을 추가하려면 insert() 메소드를 사용하고 값을 삭제할 경우 remove()메소드를 사용하고, 모든 요소를 제거하려면 removeAll() 메소드를 사용합니다.[/vc_column_text][vc_column_text]

[code lang=”swift”]
var data: Set = [10, 20, 30]
data.insert(-10)
data.insert(11)
data.remove(20)
data.remove(20)
[/code]

[예제 2-79] 집합 요소 추가/삭제[/vc_column_text][vc_column_text]또한 집합끼리 연산도 가능합니다. 두 집합의 합집합(A ∪ B)은 union(), 교집합(A ∩ B)은 intersection(), 배타적 합집합 exclusiveOr()가 있고 차집합(A ー B)은 subtract()를 사용할 수 있습니다.[/vc_column_text][vc_column_text]

[code lang=”swift”]
var data1: Set = [3, 6, 9]
var data2: Set = [9, 12, 15]

data1.union(data2) // 합집합: {6, 12, 15, 3, 9}
data1.intersect(data2) // 교집합: {9}
data1.exclusiveOr(data2) // 배타적 합집합: {6, 12, 15, 3}
data1.subtract(data2) // 차집합: {6, 3}
[/code]

[예제 2-80] 집합 연산[/vc_column_text][vc_column_text]집합끼리 비교도 가능하며 동일한 집합을 판단할 경우 “==”를 사용하고, 부분집합(A ⊆ B)은 isSubsetOf(),집합포함(A ⊇ B) 은 isSupersetOf(), 진 부분집합 (A ⊂ B)은 isStrictSubsetOf(), 진 집합포함(A ⊃ B) 은 isStrictSupersetOf(), 공통부분이 없는 집합 판단 isDisjointWith()이 있습니다.[/vc_column_text][vc_column_text]

[code lang=”swift”]
var data1: Set = [3, 6, 9]
var data2: Set = [9, 12, 15]

var data3 = data1.intersect(data2) // 결과: {9}
data3.isSubsetOf(data1) // true
data3.isStrictSubsetOf(data1) // true

var data4 = data1.subtract(data2) // 결과: {6, 3}
data4.isDisjointWith(data2) // true
[/code]

[예제 2-81] 집합 비교[/vc_column_text][vc_column_text]참고로 예제 대부분이 var를 사용한 변수에 집합을 사용했지만  let으로 상수를 사용한 집합도 선언해서 사용할 수 있고 실행하는 방법도 거의 동일합니다.[/vc_column_text][vc_custom_heading text=”(4) 사전 (Dictionary)

” use_theme_fonts=”yes”][vc_column_text]사전을 생성하는 리터럴은 “키1:값, 키2:값, 키3:값…”형태로 키와 값도 형추론으로 처리가 가능합니다. 형을 지정할 경우 Dictionary<Int, Sting>형태로 <>에 키형과 값형을 감싸거나 [Int : String]을 사용합니다.

let stateCode:Dictionary<String, String> = [“KR”:”대한민국”, “US”:”미국”, “CN”:”중국”]

let data = [1:”사과”, 2:”배”, 3:”포도”, 4:”딸기”, 5:”귤”]

변수로 키로 사용해서 값을 참조할 경우, [ ] 괄호를 사용해서 키를 지정합니다. 지정된 키가 없는 경우에는 nil을 리턴합니다.

값을 추가 및 변경할 경우 참조처럼 키를 지정하고 값을 할당할 수 있습니다. 만약 지정한 키가 없으면 키와 같이 값이 추가되어 해당 키값을 변경합니다.[/vc_column_text][vc_column_text]

[code lang=”swift”]
var stateCode:Dictionary<String, String> = ["KR":"대한민국", "US":"미국", "CN":"중국"]

let stateCodeValue = stateCode["KR"] // 결과: 대한민국
let stateCodeNil = stateCode["JP"] // nil
stateCode["US"] = "미합중국" // 국가명이 미국에서 미합중국으로 변경
stateCode["JP"] = "일본" // 일본 추가
[/code]

[예제 2-82] 사전 값 조회 및 변경 예제[/vc_column_text][vc_column_text]그렇다면, 사전에서 요소를 제거하는 방법을 알아봅시다. removeValueForKey() 또는 키값=nil 형태로 선언해서 삭제할 수 있습니다. 또한 모든 요소를 삭제할 경우, removeAll()을 사용하고 인덱스를 지정해서 삭제할 경우 removeAtIndex()를 사용합니다.

stateCode.removeAtIndex(stateCode.indexForKey(“JP”)!)

stateCode.removeAll(keepCapacity: true)

주의해야할 부분은 상수기반 사전은 크기 및 키값을 절대 변경할 수 없습니다.[/vc_column_text][/vc_column][/vc_row][vc_row][vc_column][vc_separator][vc_btn title=”목차로 가기” color=”orange” align=”center” link=”url:%2Fswift-2-korean-book%2F|title:%EB%AA%A9%EC%B0%A8|”][/vc_column][/vc_row]

Facebook Comments

카테고리:   Swift Books

댓글

죄송하지만 댓글은 닫혀 있습니다.