[Swift] nil과 옵셔널

김영민·2022년 5월 20일
0

오늘은 스위프트에서 특별하게 사용하는 nil과 옵셔널에 대해 정리 해보겠습니다!

nil

  • 다른 언어의 null에 해당
  • 값이 할당되지 않은 상태
  • 기본 타입(Int,Bool)에도 nil 가능
  • 0과 nil은 다른 것입니다!

옵셔널 타입

  • 일반 변/상수는 nil 대입 불가합니다.
  • 따라서 옵셔널 타입으로 설정해줘야 nil 대입이 가능합니다!

nil 대입

var i = 0
i = nil //error 
  • Int형 타입에 nil을 대입할 수 없습니다.

옵셔널

옵셔널 타입

var i : Int?
var j : Optional<Int>
  • 2가지 방법으로 옵셔널 선언 가능합니다.
  • nil 값이 될 수 있는 변수/상수
  • 타입 뒤에 물음표로 선언
  • 타입 선언 필수

옵셔널 타입의 특징

  • nil 대입 가능
  • 자동으로 초기화 됩니다.

nil 결과

  • 결과가 nil이 되는 행위
  • 결과 타입이 옵셔널 타입
  • 타입 변환
let IntFromStr = Int("a")
IntFromStr //nil
  • 다음과 같이 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() //error
  • 위 코드의 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 //Optional("abc")
  • nil인 경우
var Str :String? = nil

let str = Str?.lowercased()
str // nil

강제 언래핑

  • ! 기호 사용
  • nil 여부와 관계 없이 언래핑 시도

강제 언래핑 사용 사례

  • 객체 생성
  • 메소드 호출, 프로퍼티 접근
  • 옵셔널 체인

암시적 언래핑 옵셔널

  • IUO
  • 타입 선언 뒤에 !
  • nil로 자동 초기화
  • 자동으로 언래핑
  • 런타임 에러 주의해야 합니다. (nil인 경우)

0개의 댓글