본문 바로가기
Swift Deeep Dive

[Swift] 옵셔널 체이닝 & Guard

by shinhyogeun 2020. 8. 23.

 스위프트로 작성된 코드를 보면 30줄도 안되서 ?나 !를 무조건 만날 것이다. 이건 옵셔널에 관한 이야기를 해야한다. 스위프트는 

모든 형태가 2가지다. 원래의 이름과 원래의 이름+? 이렇게 두가지다. 예를 들면 String과 String? 이렇게 2가지 형태가 있는 것이다.

이 둘의 차이점은 String?은 nil값을 포함하는 형태이고 String은 nil값을 포함하지 않는 형태이다. 스위프트는 이 두가지의 형태에 매우 엄격하므로 프로그래밍을 할 때 잘 신경써야한다.(두가지 형태는 아예 다른 것으로 봐야한다!)

 

1. 옵셔널 체이닝

 

  그렇다면 옵셔널 체이닝은 무엇일까? 옵셔널 체이닝은 nil일수도 있는 값을 호출할 때 사용하는 기법이다. 다음의 코드를 먼저 보자.

중요하게 볼 부분은 밑의 두줄이다. hyogeunRoomViaOptionalChaining은 hyogeun속의 address속의 building속의room의 number를 가져와야 하는 건데 address와 building과 room뒤에 ?가 있다. 이건 이 값들이 없을 수도 있고 없을 때는 nil을 반환한다는 것이다.

이렇게 연속적으로 ?를 써서 값을 호출하는 것을 옵셔널 체이닝이라고 한다.

 

밑의 !들은 절대 nil일 확률이 없으니 그냥 추출해라라는 의미이고 그러다가 nil이 발견되면 error가 발생한다.(!는 가급적 피하는게 좋다)

 

그리고 옵셔널 체이닝은 옵셔널 바이닝의 과정에서도 사용될 수 있다.

?앞의 값중에 하나라도 없으면 else가 실행된다. 물론 number에 값을 주려고  다음과 같이 입력해도 ?앞의 값중 하나라도 없으면 값이 들어갈 수 없다(생각해보면 당연하다.. 자기를 담아주는 그릇이 없는데 자기가 어떻게 있을 수 있을까..)

400을 number에 넣고싶으면 그전에 address, building, room에 모두 값을 넣어라!! 그러면 가능하다!

옵셔널 체이닝은 어떤 값뿐만 아니라 함수의 반환형이 ?이 붙은것이라면 똑같이 사용할 수 있다.

ex) func abc() -> Int? {...}  이면 abc()?.isEmpty처럼 사용할 수 있다.

 

2. Guard 구문

 

간단하다. guard Bool타입값 else{Bool이 거짓일 때 실행될 제어문 전환 명령어}이 기본 틀이다. if else문이랑 비슷하지만 guard 구문은 자신을 포함한 함수나 반복문 안에서만 사용이 가능하고 그렇기 때문에 그 속에서는 if else보다 더 간단하다. 또한 guard 구문에서 정의된 변수는 guard 구문이 포함된 함수나 반복문 안에서 어디서나 그것을 사용할 수 있다.

보면 guard 구문에서 location이 정의됬다면 그건 greet함수 내부에서 어디서나 사용될 수 있다. 그리고 name도 마찬가지이다. 이게 또 옵셔널 바인딩이 된 값일 수도 있다. 이렇듯 guard구문은 함수나 반복문 안에서 아주 유용하다. if else보다 더 자주 사용하기를 바란다. guard 구문은 이름도 빠른종료로 빠르기때문에 좋다!!