[Swift] 자료구조 Data Structure (Array, Dictionary)

Boogios·2023년 6월 7일
0
post-thumbnail

컬렉션 Collection

Array, Dictionary, Set을 합쳐놓은 것

가변형 vs 불변형 Collection

mutable 가변형 - 값이 변함
immutable 불변형 - 값이 고정적임
상수에 할당하냐, 변수에 할당하냐에 따라 달라짐

Array

배열은 하나의 "순서있는" 컬렉션에 여러 값을 담기 위한 데이터 타입임
배열의 타입은 type annotation으로 구체적으로 지정할 수 있고, type inference(타입 추론)로 컴파일러가 식별하게 할 수 있음

리터럴(literal) : 배열을 초기화할 때, 설정해 준 값을 리터럴 값이라고 함
원래 처음에 지정해준 타입의 값들만 들어갈 수 있지만 Any 타입으로 여러 타입의 값을 사용 가능
하지만, 선호하진 않음

	var arr1 = [123, "KeeN", study()] as [Any] // 아무 타입 값이 가능한 배열
    var arr2: [Any] = [123, "KeeN", study()] // 아무 타입 값이 가능한 배열

배열을 생성할 때 반드시 값을 할당할 필요 없음

	var nameArray = [String]() // 빈 배열
    var myArray = [String](repeating: "WOW", count: 10)
    // WOW 문자열이 10개 포함된 배열 생성됨
    
    var array1 = [1,3,4]
    var array2 = [3,5,7]
    var newArray = array1 + array2 // 동일한 타입의 값을 가진 배열끼리는 합칠 수 있음

Has-a 관계를 만들다보면 아래와 같은 형태로 배열을 사용함

	struct School {
    	var grades: [Grade] = []
    }
    
    struct Grade {
    	var students: [Student] = []
    }
    
    struct Student {
    	var name: String = "KeeN"
    }

배열 활용

	func ageInfo(ages: [Int]) {
    	guard ages.count > 0 else { // 이 예시는 guard !ages.isEmpty else 로 바꿀 수 있음
        	print("배열에 아무것도 없을 때")
            return // 여기서 함수가 종료됨
        }
        
        guard ages.count > 1 else {
        	print("배열에 하나만 들어가 있을 때")
            return // 여기서 함수가 종료됨
        }
       	
        print("나머지 나이는 여기로")
        
    }
    
    ageInfo(ages: [4,2,1]) // 나머지 나이는 여기로 출력
	ageInfo(ages: []) // 배열에 아무것도 없을 때 출력
	ageInfo(ages: [4]) // 배열에 하나만 들어가 있을 때 출력

if - else 문보단 swift 에서는 guard else 문으로 처음부터 걸러주는 역할을 함
기업에서 자주 활용하는 예시이니 익혀두면 좋을것임

배열 무작위로 뽑기

array.randomElement() 를 활용하면 랜덤으로 하나를 뽑아옴

배열 안에 아무것도 없을 경우 nil이 출력되는데 이를 방지하기 위해 아래와 같은 코드를 사용함

	array1.randomElement() ?? "배열이 비어 있습니다."

배열 섞기

array.shuffle() 을 사용하면 배열 순서가 무작위로 변경됨

	var shuffledNames = names.shuffled() // 이렇게 해야 원래 있던 names 배열이 그대로임

항목 삽입 및 삭제

array.insert("KeeN", at: 1) 로 특정 인덱스 위치에 삽입 가능
가장 기본적인 삽입은 append()로 가능, array += ["KeeN"] 로도 가능

array.remove(at: 3) 로 특정 인덱스 위치의 값을 삭제 가능
array.removeLast()로 마지막 항목 삭제 가능

Dictionary

키-값(Key-Value) 쌍의 형태로 데이터를 저장하고 관리 가능한 컬렉션
키 값은 유일한 값이여야 함, Key값으로는 String, Int, Double, Bool 데이터 타입만 사용 가능

Dictionary는 "순서가 없는" 단일 컬렉션에 여러 값을 담기 위한 타입임

	var bookDict: [String: String] = 
    			["100-10" : "Book name 1",
                "100-11" : "Book name 2",
                "100-12" : "Book name 3",
                "100-13" : "Book name 4"]
                

이름이 겹칠 경우 두가지의 방법으로 해결 가능함

  1. 딕셔너리들의 배열로 재구성
	var students: [[String: String]] = [
    	[
        	"names": "KeeN",
            "message": "example"
        ],
        [
        	"names": "KeeN",
            "message": "example"
        ]
    ]
  1. 객체를 만들어 배열에 담음
	struct Student {
    	var name: String
        var message: String
    }
    
    var students2: [Student] = [
    	Student(name: "KeeN", message: "example1"),
        Student(name: "KeeN", message: "example2")
    ]

Dictionary 항목 추가 및 제거

bookDict["100-1234"] = "새로운 책 제목"

bookDict["100-1234"] = nil // "100-1234"에 해당하는 키-값 삭제
bookDict.removeValue(forKey: "100-1234") // 위와 같은 결과를 얻음

Dictionary 정렬

	var artist : [String] = [] // 아티스트를 담을 새로운 Array

    for index in sumTeamDict {
        artist.append(index.artist) // 아티스트 정보만 append
    }

    var resultDict = Dictionary(uniqueKeysWithValues: zip(1..., artist))
    // 새로운 resultDict 이라는 딕셔너리 생성
    // 키 값은 1부터 순서대로 주어짐

    for (index, value) in resultDict {
        print("index: \(index), value: \(value)")
    }

    var sortedDict = resultDict.sorted { $0.0 < $1.0 } // 딕셔너리 정렬
    // $0과 $1은 각 딕셔너리 원소 하나를 의미
    // .0은 그 원소의 첫 번째 친구, 즉 키값을 의미함
    // { (first, second) in return first.key < second.key } 이 클로져의 축약본임

    for (index, value) in sortedDict {
        print("index: \(index), value: \(value)")
    }
profile
iOS Developer

0개의 댓글