Swift
에서 '!
'(느낌표, 또는 강제 언래핑 연산자라고 부른다) 는 옵셔널 타입의 값을 강제로 언래핑(unwrap)할 때 사용된다.
옵셔널은 값이 있을 수도 있고 없을 수도 있는 변수를 나타내며, Swift에서는 안전성을 위해 이 개념을 도입했다.
옵셔널과 언래핑
옵셔널 타입은 '?
' 기호를 사용하여 선언이 된다 예를 들자면
var optionalString: String? = "Hello, Swift!"
여기서 optionalString 은 옵셔널 타입이며, 값이 있을수도 없을 수도 (nil)
있다.
강제 언래핑은 옵셔널 타입의 값이 반드시 존재한다고 확신할 때 사용된다.
강제 언래핑을 통해 옵셔널 타입에서 실제 값을 꺼낼 수 있기 때문이다. 예를 들자면
var optionalString: String? = "Hello, Swift!"
print(optionalString!) // "Hello, Swift!" 출력
이 코드는 'optionalString'
이 'nil'
이 아니고 실제 값이 있다는 확신이 들 때 '!'
를 사용하여 값을 강제로 언래핑 하는 경우이다.
만약 'optionalString'이 'nil'이라면 이 코드를 실행할 때 런타임 에러가 발생하게 된다.
추가적인 '!'를 사용하는 이유와 주의사항
간결하다
예를 들어 옵셔널 바인딩(if let)
을 사용하지 않고도 값에 바로 접근할 수 있기에 코드가 간결해진다.
확신
특정 상황에서 옵셔널이 'nil'
이 아닐 것이라고 확신할 때 사용한다. 예를 들어 초기화가 이미 완료 되었거단, 시스템 API가 항상 값을 반환한다고 보장하는 경우 등이 있을 것이다.
에러 발생 가능성
잘못 사용하면 런타임 에러가 발생할 수 있다. '!'
를 사용할 때는 값이 절대적으로 있다고 확신할 때만 사용해야하며, 그렇지 않으면 프로그램이 충돌할 위험이 있을 수 있기 때문이다
옵서널 바인딩 ( ' if let ' 또는 ' guard let ' )
if let unwrappedString = optionalString {
print(unwrappedString)
} else {
print("optionalString이 nil입니다.")
}
print(optionalString?.uppercased() ?? "default") // optionalString이 nil이면 "default" 출력
옵셔널 체이닝 ( '?.' ):
옵셔널 속성에 접근할 때 사용하여 'nil'인 경우 안전하게 무시한다
'!
'은 옵셔널 타입의 값을 강제로 언래핑 할 때 사용되며, 값이 'nil
'이 아닐 것이라는 확신이 있을 때 사용된다
'?
'은 변수가 옵셔널임을 나타내고 값이 있을 수도 있고 없을 수도 있음을 의미한다
'!
'를 잘못 사용하면 런타임 에러가 발생할 수 있으므로, 옵셔널 바인딩이나 옵셔널 체이닝과 같은 더 안전한 대안들을 사용하는 것이 좋다