본문 바로가기

 𝗔𝗣𝗣𝗟𝗘/SWIFT : GRAMMAR

Swift 기초 문법 - 옵셔널(Optional)

 

 

 

 

옵셔널(Optional)

 

 

💡 옵셔널(Optional)

 

- 값이 존재할 수도 있고 존재하지 않을 수도 있는 상황을 다루는 데 사용

- 주로 닐(nil)이나 빈 값 등을 처리하는 데 유용

- 초깃값을 지정하지 않으면 기본값은 닐(nil)

- 일종의 컨테이너 혹은 래퍼(wrapper)로 값이 존재하는 경우에는 해당 값을 감싸고,
   값이 없는 경우에는 닐(nil)을 나타내는 특별한 상태를 가짐

이를 통해 값이 없을 때 발생할 수 있는 예외를 방지하고, 코드를 안전하게 작성할 수 있음

 

 

 모든 변수에 nil을 넣을 수 있는 것은 아님 

- name이라는 변수에 nil을 넣으려 하면 에러가 발생 

var name: String = "전수열"
name = nil // 컴파일 에러!

// error: Nil cannot be assigned to type 'String'

 

 해결 

- 일반적으로 변수에 값을 할당할 때 해당 변수의 타입과 일치하는 값이어야 함

- 문자열 변수에 nil을 할당하는 것은 허용되지 않음

옵셔널(Optional)을 명시적으로 사용하여 값이 없음을 나타내야 하기 때문

 만약 문자열 변수에 값이 없을 수 있는 상황이라면, 해당 변수를 옵셔널로 선언하여 이를 나타내야 함

var name: String? = "전수열" // ?은 문자열이거나 nil일 수 있는 옵셔널 타입을 의미
name = nil // 올바른 코드!

 

 

옵셔널 바인딩

 

- 옵셔널 값이 빈값인지 존재하는지 검사 후, 존재하는 경우 그 값을 다른 변수에 바인딩하는 것을 의미

- 빈 값을 체크하고 옵셔널 값을 언래핑 해주는 것은 강제로 언래핑하는 것보다 훨씬 안전

- if let / if var, guard let / guard var을 써서 옵셔널값을 추출, 새로운 변수에 바인딩

 

 if let / guard let 차이점 

- if let : if문의 코드 구현부 내에서만 상수 사용 가능(지역 변수)

- guard let : guard문을 통과한 상수를 guard문 밖에서 사용 가능(전역변수)

 

if let <#상수 이름#> = <#옵셔널 값#> {
   // 구현 코드
}


let roommateNumbers: Int? = nil
if let roommates = roommateNumbers {
    print (roommates)
}
// 출력값 없음

let ticketCounts: Int? = 3
if let ticket = ticketCounts {
    print (ticket)
}
// 출력값: 3


// 옵셔널 바인딩 할 변수가 여러 개인 경우
let boyName : String?
let girlName : String?

boyName = "하늘"
girlName = "나연"

// , 콤마로 나열합니다
if let boy = boyName,
   let girl = girlName {
    print(boy, girl)
}
// 출력값: 하늘 나연

let x : Int? = 10
let y : Int? = nil

func opbinding() {
    guard let x = x else { return }
    print(x)

    guard let y = y else { return } // y는 nil 이므로 여기서 return 
    print(y) // 위에서 return 하였기 때문에 이 코드 라인은 실행되지 않음
}

opbinding()
// 출력값: 10

 

 

옵셔널 강제 언래핑(unwrapping)

 

- 강제 언래핑을 잘못 사용할 경우 프로그램이 비정상적으로 종료될 수도 있으므로 반드시 nil이 아닌 것이 확실한 상황에서 사용

  (최대한 안쓰는게 좋다)

- 강제 언래핑(Force unwrapping)은 !를 써서 강제로 옵셔널 추출

  (변수 앞에 !를 붙이는 것은 not의 의미 - 헷갈리지 말것)

let number = Int("42")!
// String값을 Int로 변환하는 함수는 return값으로 옵셔널 값을 반환합니다.
print(number)
// 출력값: 42

// 강제 언래핑이 실패한 경우
let address: String? = nil
print(address!)
// 에러🚨 메시지: Unexpectedly found nil while unwrapping an Optional value

 

 

 

Recent Posts
Visits
Today
Yesterday
Archives
Calendar
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31