기어가더라도 제대로

[3일차] 100일의 SwiftUI - 배열, 셋, 딕셔너리, Enum 본문

Swift - 기초

[3일차] 100일의 SwiftUI - 배열, 셋, 딕셔너리, Enum

Damagucci-juice 2022. 9. 28. 00:17

배열

  • 배열은 스트링, 정수, 더블 처럼 고유한 자료 타입이다. 
  • 인덱스로 해당 자리에 있는 값을 호출한다. 
  • 실제하는 인덱스 바깥의 인덱스로 호출을 하면 크래시가 난다. 
  • .append() 로 추가하는데, 기존에 있는 데이터와 같은 타입의 데이터여야한다. 
    • swift는 자료형이 섞이는 것을 좋아하지 않는다. 
  • Array가 자신이 가지고 있는 범위 밖을 요청할 떄 에러를 내는 이유는 무엇인가?
    • 없는 범위를 요구하면 에러를 내는것이 데이터가 없음에도 잘못된 데이터를 내는 것보다 낫다. 

Dictionary

  • 배열이 순서를 지키는 데이터를 저장하는데 최적의 선택이 될 수 있지만, 그 자리에 값이 있음을 항상 보장하지는 않는다. 
  • 만약 array[2] 를 요구했는데 그 배열이 조작되서 아이템의 개수가 2개밖에 없다고 하면 어떻게 할 것인가?
    • 크래시가 난다. 
  • 딕셔너리는 배열이 값을 저장하는 것처럼 포지션 기반으로 값을 저장하지 않는다. 
    • 대신 우리가 값이 어디에 저장될지를 선택하게끔한다. 
  • 이는 값을 인출할 때 장점 아닌 장점이 되는데, 
  • 딕셔너리에서 값을 찾을 때 옵셔널 타입이 반환되는 것을 확인 할 수 있다. 
  • 우리가 찾으려는 Key 값이 Value를 가지고 있지 않을 때를 대비한 액션이다. 
  • 만약 키가 값을 가지고 있지 않다면 Optional(nil) 을 뱉으면 되기 때문이다. 
  • 배열에서 인덱스 바깥의 인덱스를 호출하면 크래시를 내는것과 대조적이다. 
  • 그래서 값이 없을 떄 이런식으로 대비할 수도 있다. 
print(employee2["name", default: "Unknown"])
print(employee2["job", default: "Unknown"])
print(employee2["location", default: "Unknown"])

값이 없으면 "Unknown"을 뱉는 것이다. 

Set

아이템을 특정 정렬 순서로 넣거나, 중복되는 값을 넣을 수 없다는 점만 빼면 배열과 비슷하다. 
값이 어떤 순서로 들어갈지 모르기 때문에 .append() 대신 .insert() 를 쓴다 .

Set 이 순서가 없고, 복제본을 허용하지 않는 것의 장점

  1. 언젠가 중복이 없는 데이터의 집합을 원할 수 있다. 꼭 그 순간이 온다. 
  2. 어떤 Value를 찾을 때 Array 는 그 값이 있는지 다 찾아봐야한다. O(N) 이 걸리는데 반해, Set 는 O(1) 이면 된다. 있는지 없는지 유일한 값일 것이기때문에 바로 찾을 수 있다. 

Enum

열거형이 왜 필요한지는, 변수에 요일을 담는 코드를 생각해보자.

let monday = "Monday" 

하다가 수요일을 개발자가 나중에 오타를 낼 수도 있지 않은가? 

이런 가능성을 원천에 차단시켜준다. 

그치만 enum을 사용하면 오타날 일도 없고, 값의 종류를 타입으로써 손쉽게 제한할 수 있다. 

그리고 Swift 에서 저장할 때도 이득이 있다. 예를들어

enum Weekday {
    case 월요일, 화요일, 수요일, 목요일, 금요일
}

이라고 저장해놓으면 Swift 에서 Weekday.월요일 을 저장할 때 그냥 숫자 0 으로 저장한다. 이는 "월요일" 글자가 맞는지 틀린지 확인하는 것보다 훨씬 저장 공간에서 이득이다.

Comments