꾸준히 안타치기

Swift - Collection(배열,딕셔너리, 셋) 본문

iOS/swift

Swift - Collection(배열,딕셔너리, 셋)

글자줍기 2022. 8. 30. 18:35
반응형

https://sw-swift-5.tistory.com/3

Swift Collection

  • Collection  : 데이터의 모임 (수집, 모음집)
    Swift Collection 종류
  1. Array(배열): 일련번호를 구분하는 데이터의 연속적인 모임. 
  2. Set: 데이터를 중복없이 해싱을 이용(데이터의 순서를 알수없음)해서저장하는 데이터모임
  3. Tuple: 데이터를 연속적으로 모아놓는데, 추가하거나 수정하거나 삭제할 수 없는 구조. array와 다르게 이름을 붙일 수 있음.
  4. Dictionary: 번호대신에 이름을 붙여서 데이터를 저장하는 구조 - Key:Value 구조
  5. String:  Character의 집합 

⇒ tuple을 제외하고는 모두 동일한 자료형의 데이터만 저장이 가능한데, Any와 AnyObject를 이용하면 모든 자료형의 데이터를 저장할 수 있음. 

  • Any와 AnyObject는 array나 set에는 이용하지 않음. array와 set은 저장하고 있는 데이터를 비교할 수 있어야하기때문. 데이터를 비교하려면 모든 데이터들의 자료형이 동일해야 함. 

-2차원 구조에서 행방향이 tuple, dict (이름, 성별, 나이, 직업)

-열방향이 array, set (같은 데이터(이름, 성별등). 비교할 수 있음) 

 

2. 배열(array) - 스위프트에서는 Array, Objective-C에서는 NSArray, NSMutableArray 

-> Objective-C 자료형의 데이터는 대응되는 Swift의 자료형으로 형변환해서 사용이 가능. 

 

  1. 생성방법: 

데이터를 가지고 만드는 경우

-var 또는 let 배열이름 = [값을 나열] 

-var 또는 let 배열이름 : [자료형] = [값을 나열]

비어있는 상태로 만드는 경우

-var 또는 let 배열이름 = [자료형]()

-var data = [String]()

 

배열 + 배열 가능 

2) 배열의 데이터 개수는 count속성 호출 

3) 항목 접근은 [인덱스]를 사용

4) 배열의 일부분 가져오기[시작인덱스...마지막인덱스]

5) 전체 데이터 접근 for-in 을 사용해도 되고 count를 이용해서 while을 이용해도 됨. 

6) 데이터 추가나 중간에 삽입은 append와 insert메소드 이용 

7) 배열에 배열을 추가하는 것은 append메소드와 += 연산

8) 삭제는 remove(인덱스) 또는  removeLast() 

9) sort를 이용해서 정렬가능 

 

//비어있는 배열 생성 (정수배열)

var ar = [Int]()

 

ar.append(100)

ar.insert(30, at: 0)

ar.insert(87, at: 1)

//전체 출력

print(ar)

 

//모든 데이터를 순서대로 접근할때는 for...in 사용.

for imsi in ar{

    print(imsi)

}

 

3. 배열의 함수적 프로그래밍 :  Map-Reduce기법이 함수적 프로그래밍 방식으로 작업

-> 함수를 매개변수로 받아서 처리하는 프로그래밍 방식

  1. map

=> 데이터 목록과 함수를 받아서 데이터 목록 각각에 함수를 수행한 뒤, 그 리턴값으로 새로운 데이터를 만들어 주는 함수. 

-> 여기에 대입되는 함수는 하나의 매개변수를 갖고, 하나의 리턴값을 가져야 함.  

      2) filter 

-> 데이터 목록과 함수를 받아서 데이터 목록 각각에 함수를 수행한 뒤 True를 리턴한 데이터만   

    골라서 새로운 데이터를 만들어 주는 함수 

-> 여기에 대입되는 함수는 하나의 매개변수를 갖고, Bool로 리턴해야 함. 

      3) reduce

-> 데이터 목록과 함수를 받아서 데이터 목록 각각에 함수를 수행한 뒤 하나의 결과를 리턴하는 

    메소드

-> 여기에 대입되는 함수는 2개의 매개변수를 갖고 하나의 데이터를 리턴해야 함. 

-> 2개의 매개변수는 하나는 누적이고 다른 하나는 데이터 목록 각각의 데이터 

      4) 데이터 목록에서 작업을 할 때 map이나 filter또는 reduce로 해결이 가능하다면, 이 함수들을 

         이용하는 것이 효율적임. 

var ar = [Int]()

ar = [100, 300, 279, 165, 208]

// map에 대입할 함수 : 하나의 매개변수를 받아서 하나의 데이터를 리턴하는 구조

func inc(p: Int) -> Int {

    return p+1

}

let result = ar.map(inc)

print(result)

 

//홀수만 골라내는 필터링

//filter의 매개변수는 하나의 매개변수를 받아서 Bool을 리턴하는 함수

result = ar.filter({(v:Int) -> Bool in

    return v % 2 == 1

})

print(result)

 

3. Set - NSMutableSet(수정가능), NSSet(수정 불가능)

  • 데이터를 중복없이 Hashing을 이용해서 저장 
  • 검색속도가 가장 빠름 

1)생성 

데이터 있는 경우

var 또는 let 변수명 = Set([데이터 나열]) 

데이터 없는 경우

var 또는 let S변수명 = Set<하나의자료형>() 

2) 데이터 개수는 count속성 

3) 모든 데이터 순회는 for - in 으로만 가능. 

4) first나 last속성이 있음. 

5) iOS프레임워크가 터치 이벤트와 위치 정보를 가져오는 메소드에서 데이터를 set으로 제공. 

 

var actors = Set<String>()

actors.insert("데이터1")

actors.insert("데이터2")

actors.insert("데이터3")

 

//모든 데이터 접근

for actor in actors {

    print(actor)

}

print(actors.first) //첫번째 데이터 접근, 뭐가 먼저 나오는지는 랜덤

 

//Optional을 해제

//Set이나 Dict등에서 데이터를 가져오는 경우는

//대부분 Optional임. 

print(actors.first!) //첫번째 데이터 접근

 

if let actress = actors.first {

    print(actress)

}

 

6) 집합 연산 메소드를 소유 

  • intersection: 교집합으로 공통된 데이터만 추출 
  • symmetricDifference: 한쪽에만 존재하는 데이터들을 모아서 새로운 set생성
  • union: 합집합
  • subtract: 호출하는 쪽에만 존재하는 데이터만 - 차집합
  • isSubset(of:): 부분집합 여부
  • isSuperset(of:): 부모집합 여부  

 

4. Tuple 

  • 여러가지 종류의 데이터를 묶어서 저장할 수 있는 자료형. 
  • 한 번 만들어지면 개수를 늘리거나 삭제하거나 수정은 안됨. 
  1. 생성 

var 또는 let 변수명 = (값을 나열) 

var 또는 let 변수명(자료형 나열) = (값을 나열) 

 

var 또는 let 변수명(자료형 나열) = (이름:값, 이름:값) 의 형태로 생성도 가능. 

 

2) 접근 방법

case 1: 

  • 이름없이 만든 경우는 인덱스를 이용해서 각각의 데이터를 접근 
  • 튜플.0, 튜플.1 형식으로 접근 

case 2:

  • 이름을 만든 경우에는 이름을 이용해서 접근이 가능 
  • 튜플.이름의 형식으로 접근 가능. 

3) 분할해서 대입 가능 

var(변수명 나열) = 튜플

-> 튜플의 각 요소를 변수에 나열해서 대입. 

4) 튜플의 활용

-> DTO클래스 (여러개의 데이터를 묶어서 하나의 행을 만들어주는 클래스, VO라고도 함.) 대용으로 사용할 수 있음. 

-> 파이썬 같은 언어에서는 데이터 분석 결과를 만들어 줄 때 튜플을 활용.

중요: 

  • 튜플과 배열을 이용한 데이터 테이블 구조를 생성
  • DTO 클래스의 형식과 유사한 Tuple 자료형 생성
  • 번호, 이름, 전화번호를 저장하는  Tuple 자료형 생성
  • num, name, mobile을 저장할 수 있는 튜플을 Phonebook이라는 별명으로 사용할 수 있도록 생성.

typealias PhoneBook = (num:Int, name:String, mobile:String)

// 데이터 모임 만들기. PhoneBook의 리스트가 된 것임.

var phoneBookList = [PhoneBook]()

// 데이터 추가 

phoneBookList.append((num:1, name: "조헌", mobile:"010-xxx-xxxx"))

phoneBookList.append((num:2, name: "최영", mobile:"011-xxx-xxxx"))

phoneBookList.append((num:3, name: "최혁", mobile:"019-xxx-xxxx"))

//전체데이터확인

//print(phoneBookList) 보다는 아래와 같이 for..in 구문으로 순회해서 사용.

for data in phoneBookList{

print(data.num, data.name)

}  

 

5. Dictionary - Map 이나 HashTable로 부르기도 하는데 Objective-C에서는 NSDictionary, NSMutableDictionary.  대괄호 사용.

 

  • 데이터를 key-value 쌍으로 저장하는 자료구조 
  1. 생성 

var 또는 let 변수명 = [키의 자료형: 값의 자료형]() 

직접데이터를 주어서 생성시: 

var 또는 let 변수명 = [키:값, 키:값…] 

 

2) 데이터 개수는 count속성 

 

3) 데이터 추가 및 갱신 

  • 변수명[키] = 값 
  • 존재하는 키이면 갱신이 되고, 존재하지 않는 키면 삽입이 됨. 

 

4) 데이터 가져오기 

  • 변수명[키] 
  • 존재하지 않는 키가 있을 수 있으므로 리턴타입은 옵셔널임. (옵셔널 해제 필요).

 

5) 삭제 

  • 변수명[키] = nil 
  • removeValueForKey(키)

 

6) for - in 을 이용해서 순차적으로 접근하면 key와 value를 튜플로 묶어서 반환.

 

7) keys속성을 이용하면 모든 key들을 가져올 수 있음.  

 

// dictionary 1개 생성

var dict = [String: String]()

// 데이터 추가

dict["name"] = "안중근"

dict["hometown"] = "충남홍성"

// 데이터 갱신

dict["hometown"] = "충남 홍성"

// 전체 데이터 확인

print(dict)

// Dictionary는 내부 구성요소를 전부 알지 못해도 순회 가능.

//iOS프레임워크에서 메소드의 수행 결과를 dictionary로 제공하는 경우가 많음.

// dictionary가 오면 도움말을 보지 않고도 확인이 가능.

for key in dict.keys{

    print(key, ":", dict[key]!)

}

결과값은 아래와 같이 출력

hometown : 충남 홍성

name : 안중근

 

9) 딕셔너리의 value type으로 Any를 사용하는 경우가 있음. 

  • 여러 종류의 데이터를 하나의 딕셔너리에 저장하기 위함. 
  • 스위프트 문법 교재들에서는  Any를 사용하지 않고 특정 자료형으로 고정해서 사용. 
  • 애플의 API들은 Dictionary를 만들 때 거의 대부분 Value Type으로 Any를 사용함. 
  • 애플에서는 특별한 경우가 아니면 2차원 배열을 만들지 않는 것을 권장. 2차원 배열은 행렬을 만들 때를 제외하고는 그다지 효율적이지를 못함. 

 

// 프로야구 각 팀 선수 명단을 저장

// 팀별로 배열을 생성

// 아래 방식은 선수를 추가하면 되지만, 팀을 추가 할 경우 오류가 남.

var kia = ["안치홍", "김주찬", "최형우"]

var dusan = ["권혁", "린드블럼", "김재환"]

var lg = ["오지환", "임찬규"]

// 각 팀의 배열을 가지고 배열을 생성.

var baseBall = [kia, dusan, lg]

// 위의 데이터를 팀 이름을 출력하고 선수명단을 출력.

 

for x in 0..<baseBall.count{

    if x == 0 {

        print("기아")

    } else {

        print("두산")

    }

    let imsi = baseBall[x]

    for temp in imsi{

        print("   \(temp)")

    }

}

 

딕셔너리 활용을 통한 팀이름 선수 호출 방법.

var kia = ["안치홍", "김주찬", "최형우"]

var dusan = ["권혁", "린드블럼", "김재환"]

var lg = ["오지환", "임찬규"]

 

// Dictionary를 생성해서 배열에 저장

var dict1 = [String:Any]()

dict1["team"] = "기아"

dict1["data"] = kia

var dict2 = [String:Any]()

dict2["team"] = "두산"

dict2["data"] = dusan

var dict3 = [String:Any]()

dict3["team"] = "엘지"

dict3["data"] = lg

 

// 각 팀의 배열을 가지고 배열을 생성.

var baseBall = [dict1, dict2, dict3]

 

for dict in baseBall{

    //any는 원래의 자료형으로 형변환해서 사용.

    let team = dict["team"] as! String

    print(team)

    //Any를 swift자료형으로 형 변환했는데 에러가 나면

    //앞에 NS를 붙여서 Objective-C자료형으로 변환한 후

    //swift자료형으로 변환하면 됨.

    let data = (dict["data"] as! NSArray) as Array

    for temp in data{

        print(" \(temp)")

    }

}

이 경우는 새로운 팀을 추가해도, 출력부분을 수정하지 않아도 잘 됨. 

 

var kia = ["안치홍", "김주찬", "최형우"]

var dusan = ["권혁", "린드블럼", "김재환"]

var lg = ["오지환", "임찬규"]

var samsung = ["오승환", "김재규"]

 

// Dictionary를 생성해서 배열에 저장

var dict1 = [String:Any]()

dict1["team"] = "기아"

dict1["data"] = kia

var dict2 = [String:Any]()

dict2["team"] = "두산"

dict2["data"] = dusan

var dict3 = [String:Any]()

dict3["team"] = "엘지"

dict3["data"] = lg

var dict4 = [String:Any]()

dict4["team"] = "삼성"

dict4["data"] = samsung

var baseBall = [dict1, dict2, dict3, dict4]

 

for dict in baseBall{

    //any는 원래의 자료형으로 형변환해서 사용.

    let team = dict["team"] as! String

    print(team)

    //Any를 swift자료형으로 형 변환했는데 에러가 나면

    //앞에 NS를 붙여서 Objective-C자료형으로 변환한 후

    //swift자료형으로 변환하면 됨.

    let data = (dict["data"] as! NSArray) as Array

    for temp in data{

        print(" \(temp)")

    }

}

반응형

'iOS > swift' 카테고리의 다른 글

함수와 매서드의 차이는?  (0) 2023.03.05
함수  (0) 2023.03.03
closure 기본  (0) 2022.06.23
매개변수로서 closure  (0) 2022.06.10
타입 형 변환  (0) 2022.04.05
Comments