옵셔널 타입의 " ! " 를 쓰는 이유

sonny·2024년 9월 1일
0

iOS 파헤치기

목록 보기
3/12
post-thumbnail

" ! " 넌 뭘까

Swift에서 '!'(느낌표, 또는 강제 언래핑 연산자라고 부른다) 는 옵셔널 타입의 값을 강제로 언래핑(unwrap)할 때 사용된다.

옵셔널은 값이 있을 수도 있고 없을 수도 있는 변수를 나타내며, Swift에서는 안전성을 위해 이 개념을 도입했다.

옵셔널과 언래핑

옵셔널 타입은 '?' 기호를 사용하여 선언이 된다 예를 들자면

var optionalString: String? = "Hello, Swift!"

여기서 optionalString 은 옵셔널 타입이며, 값이 있을수도 없을 수도 (nil) 있다.

' ! ' 강제 언래핑의 사용 이유와 예시

강제 언래핑은 옵셔널 타입의 값이 반드시 존재한다고 확신할 때 사용된다.

강제 언래핑을 통해 옵셔널 타입에서 실제 값을 꺼낼 수 있기 때문이다. 예를 들자면

var optionalString: String? = "Hello, Swift!"
print(optionalString!) // "Hello, Swift!" 출력

이 코드는 'optionalString''nil'이 아니고 실제 값이 있다는 확신이 들 때 '!'를 사용하여 값을 강제로 언래핑 하는 경우이다.

만약 'optionalString'이 'nil'이라면 이 코드를 실행할 때 런타임 에러가 발생하게 된다.

추가적인 '!'를 사용하는 이유와 주의사항

  1. 간결하다
    예를 들어 옵셔널 바인딩(if let)을 사용하지 않고도 값에 바로 접근할 수 있기에 코드가 간결해진다.

  2. 확신
    특정 상황에서 옵셔널이 'nil'이 아닐 것이라고 확신할 때 사용한다. 예를 들어 초기화가 이미 완료 되었거단, 시스템 API가 항상 값을 반환한다고 보장하는 경우 등이 있을 것이다.

  3. 에러 발생 가능성
    잘못 사용하면 런타임 에러가 발생할 수 있다. '!'를 사용할 때는 값이 절대적으로 있다고 확신할 때만 사용해야하며, 그렇지 않으면 프로그램이 충돌할 위험이 있을 수 있기 때문이다

그렇다면 '!' 를 사용하는 것 보다 더 안전한 대안은 무엇일까

옵서널 바인딩 ( ' if let ' 또는 ' guard let ' )

if let unwrappedString = optionalString {
    print(unwrappedString)
} else {
    print("optionalString이 nil입니다.")
}

print(optionalString?.uppercased() ?? "default") // optionalString이 nil이면 "default" 출력

옵셔널 체이닝 ( '?.' ): 옵셔널 속성에 접근할 때 사용하여 'nil'인 경우 안전하게 무시한다

결론

'!'은 옵셔널 타입의 값을 강제로 언래핑 할 때 사용되며, 값이 'nil'이 아닐 것이라는 확신이 있을 때 사용된다

'?'은 변수가 옵셔널임을 나타내고 값이 있을 수도 있고 없을 수도 있음을 의미한다

'!'를 잘못 사용하면 런타임 에러가 발생할 수 있으므로, 옵셔널 바인딩이나 옵셔널 체이닝과 같은 더 안전한 대안들을 사용하는 것이 좋다

profile
iOS 좋아. swift 좋아.

0개의 댓글