본문 바로가기

swift 기본 문법

swift 기본문법) if let, guard let의 목적과 의미 알아보기

반응형

최근 수업을 들으면서 문법을 다시 공부하고 있다. 

무심히 쓴 코드들에 대한 의미를 다시 한번 듣고 이해하면서 좋은 공부가 되어가고 있다. 

 

if le과 guard let은 Optional Binding과 연결되어 있는 개념이지만 추가적인 개념이 있어서 정리해보았다. 

 

 

Optional이란?

이 변수에는 값이 있을 수도 있고 없을 수도 있다.라는 의미이다.

 

개인적인 경험으로 optional이 왜 필요해볼까를 생각해 봤을 때, 

앱이 네트워크 통신으로 값을 받을 때, 항상 값이 있다고 확신할 수 없다.

optional을 사용하지 않고 변수를 선언하였는데 빈 값이 온다면?

해당 코드가 이니셜되었을 때 앱은 죽게 될 것이다. 이러한 이유 때문에 Optional 이 유용하게 사용되었다.

하지만 Optional로 처리를 하게 되면 그 옵셔널을 벗기는 과정이 필요하다.

 

Optional Binding이란?

옵셔널 바인딩(Optional Binding)이란 간단히 말해서 옵셔널을 안전하게 추출하는 방법이다.

옵셔널 값은 랩(Optional)로 둘러져 있기 때문에 이를 꺼내 사용하기 위해서는 unwrapping 과정이 필요하다. 

 

여러가지 방법이 있지만 이번 글에서는 if let과 guard let에 대해서 공부해 보겠다. 

 

if let 

if let은 값이 있는 경우와 값이 없는 경우(nil)인 경우를 체크한다. 

여기서 let 상수에 옵셔널로 할당된 값을 할당함으로써 옵셔널을 벗기는 작업을 하는 것이다. 

 

var optionalValue : Int?
optionalValue = 2

print(optionalValue)
//Optional(2)

if let value = optionalValue {
    print(value)
} else {
    print("값이 없음")
}
//2

간단한 예제를 보며 쉽게 이해해보자

optionalValue라는 변수를 Int 옵셔널로 선언했다. 

 

옵셔널은 값이 있을 수도 있고 없을 수도 있다는 의미이기 때문에 값이 있어도 없을 수 있는 경우를 대비하여

다음과 같이 Optional(2)로 나온다. 

 

하지만 if let을 사용하면 값이 있는 경우,  상수에 할당된 값을 출력하게 되면서 옵셔널이 벗겨진다.

else는 필수는 아니지만 값이 없는 경우를 대비해서 사용한다.

 

추가로 if let 에서 선언한 let은 지역변수 즉 { } 해당 스코프를 벗어나지 못한다. 

 

var optionalValue : Int?
optionalValue = 2

print(optionalValue)

if var value = optionalValue {
    print(value)
} else {
    print("값이 없음")

여기서 질문) 왜 if var는 되지 않는가??

사실 동작은 한다. 하지만 var는 변경되는 값에 사용하는 것이기 때문에 변경하지 않는 let을 사용할 것을 추천해준다. 

 

 

guard let 

 

guard는 bool 표현식을 포함하며, true일 경우 guard 다음에 위치한 코드가 실행된다.

guard let 역시도 if let과 마찬가지로 optional binding기능을 가지고 있다. 

guard 조건문 else {
	조건문이 false일 떄 실행
}
	조건문이 true일 떄 실행

 

 

하지만 추가적으로 다른 목적으로 사용된다. 옵셔널 바인딩의 주제만이 아니다.

 

guard 문은 코드의 명확성을 더한다. 

표현을 보면 조건문을 작성하고 조건문이 true일 떄를 더 강조한다. 

 

표현을 보면 if let은 "조건이 맞으면 이것을 아니면 이것을 실행"이라면

 

guard let은 "실행시키기 위해 조건을 검사"의 의미를 가진다.

실패할 경우 일찍 종료와 성공의 기대치가 훨씬 높다는 것이다.

따라서 표현이 명확하다.

 

보통 guard let을 사용하는 곳을 보면 이해가 쉽다. 다음은 화면전환을 위한 코드이다. 

guard let viewController = self.storyboard?.instantiateViewController(withIdentifier: "ViewControllerID") as? ViewController else { return }
        viewController.modalTransitionStyle = .coverVertical
        viewController.modalPresentationStyle = .fullScreen
        self.present(viewController, animated: true, completion: nil)

여기서 코드는 "화면전환"이라는 목적을 가진다. 때문에 화면전환을 하기 위해서 실패할 경우를 정의하고 아닐경우(성공) 목적을 실행한다. 

 

 

이렇게 if let과 guard let을 알아보면서 결과를 내는 것 이외로 코드의 목적에 대해서 공부할 수 있었다. 

 

https://stackoverflow.com/questions/32256834/swift-guard-let-vs-if-let

 

Swift: guard let vs if let

I have been reading about Optionals in Swift, and I have seen examples where if let is used to check if an Optional holds a value, and in case it does – do something with the unwrapped value. Howe...

stackoverflow.com

https://www.hackingwithswift.com/quick-start/understanding-swift/when-to-use-guard-let-rather-than-if-let

 

When to use guard let rather than if let - a free Understanding Swift tutorial

Was this page useful? Let us know! 1 2 3 4 5

www.hackingwithswift.com

 

반응형