본문 바로가기
TIL(Today I Learned)

2024.04.08 Today I Learned

by 승환파크 2024. 4. 8.

옵셔널 해제 연산자

프로그래머스 코딩 테스트 중 자릿수 더하기 라는 문제를 풀던 도중 오류가 발생하였다.

import Foundation

func solution(_ n:Int) -> Int{
    var answer:Int = 0
    var str_n = String(n)
    for i in str_n{
        answer += Int(String(i))! // <-- 이 부분이다.
    }
    
    return answer
}

 

 

이 코드를 살펴보니 오류가 발생하는 이유는 문자열에서 정수로 변환하는 부분인 'Int(String(i))' 에서 반환되는 값이 옵셔널(Int?) 형식이기 때문이었다. 이 뜻은 만약 변환할 수 없는 문자가 포함 되어 있다면 nil을 반환할 수 있다는 소리이다.

 

따라서 코드에서 옵셔널 해제 연산자인 '!' 가 빠지면 컴파일러가 이 부분을 강제로 옵셔널에서 정수로 변환하라고 요구하지 않기 때문에 컴파일러가 오류를 발생시킨다. 따라서 옵셔널 해제 연산자를 사용해 컴파일러가 코드를 통과시킬 수 있도록 한것이다.

 

하지만 이렇게 되면 문자열에서 정수로 변환될 때 nil이 반환되는 경우에 대한 처리가 이루어지지 않아 안전하지 않은 상태가 된다. 그렇기 떄문에 옵셔널 바인딩 등을 사용하여 안전한 해제 방법을 선택하는 것이 더 좋다고 말할 수 있다.

 

아래 코드는 옵셔널 바인딩을 사용해 수정한 코드이다.

import Foundation

func solution(_ n:Int) -> Int{
    var answer:Int = 0
    var str_n = String(n)
    for i in str_n{
        if let num = Int(String(i)) {
            answer += num
	}
    }
    
    return answer
}

 

코드를 살펴보면 위의 코드와는 다르게 옵셔널 바인딩을 통해 각 문자를 정수로 변환하는데 변환이 성공한 경우에만 해당 숫자를 더하는 코드로 수정하였다.

'TIL(Today I Learned)' 카테고리의 다른 글

2024.04.17 Today I Learned  (1) 2024.04.17
2024.04.16 Today I Learned  (1) 2024.04.16
2024.04.15 Today I Learned  (0) 2024.04.15
2024.04.12 Today I Learned  (1) 2024.04.12
2024.04.09 Today I Learned  (1) 2024.04.09