오늘은 스위프트에서 특별하게 사용하는 nil과 옵셔널에 대해 정리 해보겠습니다!
nil
- 다른 언어의 null에 해당
- 값이 할당되지 않은 상태
- 기본 타입(Int,Bool)에도 nil 가능
- 0과 nil은 다른 것입니다!
옵셔널 타입
- 일반 변/상수는 nil 대입 불가합니다.
- 따라서 옵셔널 타입으로 설정해줘야 nil 대입이 가능합니다!
nil 대입
var i = 0
i = nil
- Int형 타입에 nil을 대입할 수 없습니다.
옵셔널
옵셔널 타입
var i : Int?
var j : Optional<Int>
- 2가지 방법으로 옵셔널 선언 가능합니다.
- nil 값이 될 수 있는 변수/상수
- 타입 뒤에 물음표로 선언
- 타입 선언 필수
옵셔널 타입의 특징
nil 결과
- 결과가 nil이 되는 행위
- 결과 타입이 옵셔널 타입
- 타입 변환
let IntFromStr = Int("a")
IntFromStr
- 다음과 같이 Int형으로 바꿀 수 없을 때 nil이 반환됩니다.
let numbers = ["one":1,"two":2]
let three = numbers["three"]
- 다음과 같이 딕셔너리에서도 없는 값을 저장하면 nil이 저장됩니다.
콜렉션과 옵셔널
배열
var array1 : [String]?
var array2 : [String?]
- 딕셔너리도 배열과 같은 방식으로 물음표의 위치에 따라 옵셔널이 달라지므로 주의해야 합니다!
옵셔널 사용
객체나 데이터 다루기
- 객체나 데이터를 이용한 함수, 프로퍼티, 첨자 접근 등
- 유효한 객체나 유효한 값에서만 정상 작동 합니다.
- nil에서는 비정상 작동을 합니다.
옵셔널 타입 사용
- 옵셔널 타입의 객체는 nil일 수도 있다.
- 그래서 옵셔널 타입 객체는 다른 사용 방법
- nil인 경우와 nil이 아닌 경우 고려
잘못된 옵셔널 사용의 예
var optionalStr: String? = "ABC"
optionalStr.lowercased()
- 위 코드의 optionalStr은 nil이 될 수도 있기 때문에, 바로 사용할 수 없습니다.
옵셔널 사용 방법
- 언래핑 : 유효한 값 얻어오기
- nil 여부 비교 (if, guard 문)
- 옵셔널 체인
- 강제 언래핑
if문으로 nil 검사하기
if optionalStr != nil {
}
- nil 비교할 때는 조건문에서 !=, ==를 생략할 수 없습니다!
옵셔널 바인딩
if를 이용한 옵셔널 바인딩
if let realStr = optionalStr {
print("문자열의 값 \(realStr)")
}
else {
print("문자열이 nil이다.");
}
guard를 이용한 옵셔널 바인딩
func bindingWithWhere() {
guard let val = nilAvailable, val > 0 else {
return;
}
print("val은 유효하고 0보다 큰 값이다, \(val)")
}
- 다중 바인딩, 함수 호출등의 옵셔널 바인딩도 있습니다.
- 옵셔널 바인딩 체인
- 옵셔널 바인딩과 조건 비교를 동시에 할 수도 있습니다.
nil 연산자
- nil 연산자 : ??
- nil인 경우 기본 값을 설정할 때 사용해줍니다.
옵셔널 체인
- 옵셔널 객체에 ?기호를 이용해서 직접 사용
- 평가 결과가 nil이면 nil 반환
- 평가 결과가 nil이 아니면 계속 진행(언래핑)
- 최종 결과는 옵셔널
- 메소드 호출, 프로퍼티 접근, 배열 원소 접근 등
코드 예제
var Str :String? = "ABC"
let str = Str?.lowercased()
str
var Str :String? = nil
let str = Str?.lowercased()
str
강제 언래핑
- ! 기호 사용
- nil 여부와 관계 없이 언래핑 시도
강제 언래핑 사용 사례
- 객체 생성
- 메소드 호출, 프로퍼티 접근
- 옵셔널 체인
암시적 언래핑 옵셔널
- IUO
- 타입 선언 뒤에 !
- nil로 자동 초기화
- 자동으로 언래핑
- 런타임 에러 주의해야 합니다. (nil인 경우)