[Swift] Optional

정은·2023년 1월 12일
post-thumbnail

Optional이란?

  • nil을 사용할 수 있는 타입과 없는 타입을 구분하기 위함이며,
    nil을 사용할 수 있는 Type을 Optional Type이라 부른다.

쉽게 설명하자면


nil 이라는 값을 가질 수 있으면 Optional Type이고,

Optional Type을 선언할 때 타입 옆에 ? 를 붙인다.

let name: String? // String? = Optional Type
let age: Int? // Int? = Optional Type



nil이란?

  • 변수에 객체가 할당되지 않은 상태 “값이 없음”을 뜻한다.
    nilnull은 다르다!

    Nil : 오류가 났지만, 앱 중단시키는 것 대신 nil을 돌려줄 테니 오류 난 것을 알려줄 때 사용
    Null : 어떠한 값도 가지지 않고 있다는 뜻


let dictHuman = ["name": "je", "gender": "female"]

let name = dictHuman["name"] // "je"
let gender = dictHuman["je"] // nil

name이라는 key에 접근을 하면 je 이라는 value가 잘 뜨지만,

je이라는 key에 접근을 했을 때 dictHuman에는 je이라는 key가 존재하지 않기 때문에 nil이 뜸




Non-Optional Type과 Optional Type

  • nil은 오류가 발생했을 때 오류 대신 뱉는 값이라고 하였다.

    어떤 자료형이든 nil을 반환하고 저장 할 수 있을까?
    → NO !! 절대 불가능하다


nil저장할 수 있는 건 오로지 Optional선언된 자료형 뿐이다.


Non-Optional Type은 선언과 동시에 초기화 해주던가 Type Annotation을 사용해야 된다.

⇒ 이 친구는 무조건 값을 가져야 한다 !! 값이 없으면 오류 발생 !!!!


Optional Type

  1. Type Annotation 이용
  2. Type Inference 이용
    → 타입 추론, ⭐초기화 되는 값이 무조건 Optional 자료형⭐ 이여야 된다
// Type Annotation
var name: String?
name = nil // ?로 선언된 name에는 nil 저장 가능

// Type Inference
let a: Int? = nil
let b = a
print(b) // nil

아까 nil이란? 을 설명했을 때

let gender = dictHuman["je"] // nil

위 구문이 가능했던 이유는 dictHuman에서 value값을 가져오는 의 원형을 보면

@inlinable public subscript(key: Key) -> Value?

subScript 리턴 값이 옵셔널로 선언되어 있다.

따라서 dictHuman[”je”]의 리턴 값은 옵셔널 자료형인거고,

상수 gender는 타입 추론에 의해 옵셔널 자료형을 갖게 된 것이다.




Type

var today: String
var weather: String?

print(type(of: today))    // String
print(type(of: weather))  // Optional<String>

  • Non-Optional TypeOptional Type의 자료형 결과값은 다르다

    Non-Optional Type = String Type
    Optional Type = Optional Type






📖 참고


https://babbab2.tistory.com/15

0개의 댓글