[iOS/Swift] 옵셔널이란?

chaentopia·2023년 2월 10일
0
post-thumbnail

옵셔널은 무엇인가요?

옵셔널이란 타입에 값이 있을 수도, 없을 수도 있음을 표현한 것

?, !를 데이터 타입 옆에 붙여서 사용함

var Name: String?

이는 Name 변수에 String형 값이 들어갈 수도 있고 아닐 수도 있다는 뜻을 갖게 된다. 예외 상황을 최소화하는 안전한 코딩을 위해서 사용한다.

값이 없음은 nil을 통해서 나타내는데, 옵셔널은 이 nil이 할당될 수 있는지 없는지를 표현한 것이다.즉, ?을 변수 옆에 붙이면 nil 값을 가질 수 있다는 의미가 된다. 옵셔널 타입이 아닌 경우에 nil 값을 갖게 되면 오류가 발생한다.

var Name: String = nil //error
var Name: String? = nil //가능

옵셔널 타입의 값은 옵셔널 안에 갇혀 있는 형태로 저장되어 있기 때문에 추출해서 사용해야 한다. 그 방법으로는 크게

  • forced unwrapping (!)
  • optional binding (if let~)
  • optional binding (guard let~)
    세 가지 방법이 있다.

Forced Unwrapping (!) - 강제 언래핑

이름에서도 알 수 있듯이 옵셔널에 값이 들어있는지 아닌지 확인하지 않고 강제로 값을 꺼내는 방법이다. 값이 있다면 바로 출력되지만, 값이 없는 nil이라면 에러가 발생한다. !을 뒤에 붙여서 사용한다.

var Name: String? = "챈토피아"
print(Name!)
//출력 : 챈토피아

이렇게 값이 있는 상태라면 바로 출력이 가능하지만

Name = nil 
print(Name!)
//error

이렇게 값이 없는 nil 상태라면 에러가 발생한다.

Optional Binding (if let~)

옵셔널 바인딩이란 옵셔널 안에 값이 있는지 확인하고, 값이 있으면 꺼내오는 것을 말한다. 옵셔널 바인딩에는 방법이 두 가지인데, 첫번째는 If let을 사용하는 것이다.
값이 있다면 if let문의 내용이 실행되고, 없다면 else문의 내용이 실행된다.

func printName(_name:String) {
	print(_name)
}
var nyName: String? = nil
if let name = myName {
	printName(_name:name)
}
//아무것도 출력되지 않는다.

if let 구문은 myName이 nil이 아니라 값이 있으면 name에 넣어주고 조건문을 실행하는 구문인데, myName이 nil로 초기화되어 있기 때문에 조건문이 실행되지 않는다. if let에서 선언된 것을 if문 밖에서 쓸 수는 없다.

Optional Binding (guard let~)

앞서 본 if let과 같이 옵셔널 안에 값이 있는지 확인하고, 값이 있으면 꺼내오는데, 값이 있다면 뒤의 코드로 이어지고 값이 없다면 else에서 처리된다.
또한, else에서 return, break 처럼 코드를 종료시키는 명령어가 필요하다.

func printName(_name:String) {
	var myname : String? = nil
    guard let name = myName else {
    	print("noName") //nil일 때 출력
        return
   }
   printName(_name:name) //값이 있을 때 출력
}

guard let은 보통 함수 안에서 사용된다. if let과 달리 guard let에서는 선언된 것이 guard문 밖에서도 사용 가능하다. 그러나 else에 대한 처리를 해주지 못한다.

옵셔널 바인딩은 데이터를 안전하게 전달하는 방법이다.

profile
the pale blue dot

0개의 댓글