Swift + iOS/Swift

[Swift] if-let을 사용할 때 유의해야할 점

군옥수수수 2017. 12. 17. 22:48

if-let을 사용할 때 유의해야할 점.


안녕하세요. 오늘은 제가 if-let을 사용할 때 유의해야 할 점에 대해서 알아보도록 하겠습니다. 이 글을 작성하게 된 이유가 제가 if-let을 완벽히 알지 못해 발생한 실수로 에러를 잡는데 많은 시간을 소비했기 때문입니다. 그럼 본격적으로 시작해보도록 하겠습니다.


if-let

if-let은 옵셔널 타입의 값을 안전하게 추출하기 위해 사용합니다. 기본적인 사용법은 다음과 같습니다.


if-let을 사용할 때는 다른 변수명을 사용해도 되지만 추출하려는 변수의 이름과 동일하게 사용해도 상관없습니다.

만일 if-let 구문안에서 값을 바꾸려고 하면 어떻게 될까요?


네 맞습니다. let으로 선언된 값을 바꾸려하기 때문에 당연히 에러가 발생합니다. 그럼 String과 같은 기본 값 타입이 아닌 참조 타입의 경우에는 어떨까요?


문제점

저의 문제점은 if-let에서 참조 타입을 추출하여 사용할 때 발생했습니다.

 

먼저 다음의 상황을 예측해보세요.


역시 위에서 언급한 것과 마찬가지로 let으로 선언한 값을 바꾸려고 하기 때문에 에러가 발생합니다. 하지만 다음의 코드의 출력 결과는 어떻게 될까요?


결과는 다음과 같습니다. 그리고 제가 작성한 코드에서 의도치 않은 결과를 발생시킨 것과 동일한 이슈입니다.


  1. "obj1"
  2. "Changed obj1"

바로 참조 타입은 if-let을 통해 값을 추출해도 그 참조는 유지된다는 것입니다. 즉 옵셔널 타입인 obj1과 이것을 추출한 것을 담고 있는 changedObj1은 같은 메모리 영역을 참조하고 있다는 것입니다.

 

if-let을 통해 참조 타입 변수를 추출해도 참조는 유지됩니다.


마무리

오늘은 이렇게 제가 겪은 문제인 옵셔널 참조 타입을 추출할 때 생길 수 있는 문제점에 대해서 알아보았습니다. 반드시 이 점 잊지 마시고 유의하며 코드를 작성하시기 바랍니다. 감사합니다.