xxo' TIL/WIL

IOS/Swift

[Swift] 옵셔널(Optional), 타입캐스팅(Typecasting)

xxoxec 2025. 6. 17. 01:52
Swift에서 Optional은 값이 있을 수도, 없을 수도 있는 변수나 상수를 나타내는 타입입니다. 이는 값이 반드시 존재하지 않아도 되는 상황을 처리할 때 유용하게 사용됩니다.
Optional은 변수의 값이 nil 일 수도 있다라는 것을 표현합니다. 반대로 옵셔널이 아니라면 해당 값은 절대 nil 이 될 수 없음을 의미합니다.
Swift에서는 옵셔널은 말 그대로 선택적이며, 기본 값은 non-Optional입니다.

 

https://developer.apple.com/documentation/swift/optional

 

Optional | Apple Developer Documentation

A type that represents either a wrapped value or the absence of a value.

developer.apple.com

https://docs.swift.org/swift-book/documentation/the-swift-programming-language/optionalchaining

 

Documentation

 

docs.swift.org

 

옵셔널(Optional) : value(값)가 있거나 없을 수 있음을 표현하는 타입인 optional.

? 를 이용해서 optional을 표현하며, 값없음은 nil로 표현함

// Int형 optional 변수 선언
var perhapsInt: Int?

// String형 optional 변수 선언
var perhapsStr: String?
// 위의 코드는 nil로 명시적으로 초기화한 것과 동일
var perhapsStr: String? = nil

? 를 이용해서 optional 표현
한번 찾아보고 정리
값이 있을 수도, 없을 수도 있는 경우 없으면 nil
타입을 살펴보면 타입 + ? 로 표현된 것 확인 가능
이름이 있을 수도 있고, 없을 수도 있는 타입 선언, String?

예로 자동차의 옵션을 생각해보면, 자율주행 기능은 모든 자동차에 포함되어 있지 않다. 따라서 자율주행 기능은 옵셔널로 표현될 수 있다.

옵셔널이 필요한 이유는 다양한 상황에서 값의 존재 여부를 안전하게 처리하기 위해서이다. Swift에서는 타입 안전성을 중요시하기 때문에 옵셔널을 통해 값의 존재 여부를 명시적으로 표현한다.

autonomousDrivingFeature 변수는 옵셔널 타입으로 선언되었으며, 값이 있을 수도 있고 없을 수도 있다. 값이 있으면 해당 값을 출력하고, 없으면 nil 을 출력.

0은 실제로 값을 가진 숫자이며, 값이 없는 상태를 나타내는 것은 아니다. 반면, nil은 값이 "정말로 없는" 상태를 나타낸다. 이처럼 0과 nil 사이의 미묘한 차이를 이해하는 것은 Swift에서 옵셔널을 사용할 때 중요한 개념이다.

 

Unwrapping Optionals : optional 타입에 값이 있는 경우, 그 값만 가져오고 싶을 때가 있다.

이때, optional 타입의 값만 가져오는 방법을 unwrapping 한다고 한다.

대표적으로 if let을 이용해서 unwrapping.

if let 을 이용해서 unwrapping.

 

Unwrapping with guard : 메소드 또는 함수에서 guard를 이용해서 초기에 조건을 검사할 수 있음.

guard let을 이용하면, 메서드 초기에 옵셔널 타입에서 값이 있는 경우를 검사할 수 있음.

Unwrapping with guard

 

Force Unwrapping : 옵셔널 타입에 값이 있다고 확신하는 경우, 강제 unwrapping 할 수 있음.

! 키워드를 이용해서 강제 unwrapping 구현.

! 키워드를 이용해서 강제 unwrapping 구현.

 

Nil Coalescing : optional 타입에 값이 있을 때는 해당 값을 넘겨주면 되고, optional 타입에 값이 없는 경우 default 값을 설정하고 싶을 때 nil coalescing을 이용할 수 있다. ?? 를 이용해서 default 값 설정.

?? 를 이용해서 default 값 설정.
nil 대신 ?? 를 이용해서 default 값 설정.

 

옵셔널 바인딩 (Optional Binding) : 옵셔널 바인딩은 옵셔널에 값이 있는지 확인하고, 있다면 그 값을 일반 변수나 상수에 할당하는 방법이다.

fruits 배열의 첫 번째 요소가 있는지 확인하고, 있다면 myFavorite 상수에 할당하여 출력.

 

옵셔널 체이닝(Optional chaining) : 옵셔널 체이닝은 여러 옵셔널 값을 연속적으로 접근할 때 사용하는 방법이다. 체이닝 중에 하나라도 nil 값이 있으면 전체 결과는 nil이 된다. 옵셔널 타입의 프로퍼티 접근 시 optional chaining (?) 사용됨.

Optional chaining
Person 객체의 hobby 속성을 통해 Hobby 객체의 level 속성에 접근, leeo.hobby?.level 를 통해 옵셔널 체이닝을 사용하여 level 에 접근하고, 값이 있다면 출력

이 두기법을 사용하면 옵셔널 값에 안전하게 접근할 수 있으며, 코드의 가독성도 높아진다.

 

자동 언래핑, 선택적 바인딩 : 물음표 대신 느낌표를 사용하여 선택적 변수를 선언할 수 있다. 이러한 선택적 변수는 자동으로 해제되며 할당된 값을 가져오기 위해 변수 끝에 추가 느낌표를 사용할 필요가 없다.

 

Swift에서 타입 캐스팅은 객체가 특정 클래스 타입이나 프로토콜 타입을 가지고 있는지 확인하거나, 그 타입으로 변환하는 방법입니다. 타입 캐스팅은 주로 asisas?as! 키워드를 사용합니다.

 

 

타입캐스팅(Typecasting) : swift에서는 부모 타입에서 자식 타입으로 변형가능한지 확인해 볼 때 as? 키워드를 사용함

as? 키워드를 사용

 

 

 


 

 

  • is : 객체가 특정 타입의 인스턴스인지 확인하는 데 사용 
  • as ? : 안전한 타입 캐스팅(옵셔널 반환), 변환이 실패할 경우 nil 반환
  • as ! : 강제 타입 캐스팅(실패 시 크래시, 런타임 오류 발생)
  • as : 서브 클래스와 슈퍼 클래스 간의 타입 캐스팅