[Swift][프로그래머스] 문자열을 정수로 바꾸기 (feat. 옵셔널 처리)

팔랑이·2024년 4월 3일
0

iOS/Swift

목록 보기
10/71
post-thumbnail

👉🏻 프로그래머스: 문자열을 정수로 바꾸기 - 문제 링크


👇🏻 초기 풀이

func solution(_ s:String) -> Int {
    return Int(s)
}

뭔가 당연히 안 될 것 같다고 생각했지만 안됐다.
Int(s)의 반환 타입이 옵셔널인 Int? 타입이기 때문에, Int로 리턴받기로 선언한 저 구조에서는 에러가 나는 것.

이 문제의 여러가지 풀이를 알아볼 겸 Swift의 옵셔널 처리에 대해 복습해보자.

해결방안

크게 두 가지 해결방안이 있다.

1️⃣ 반환타입을 Int?로 받는 것

func solution(_ s:String) -> Int {
    return Int(s)
}

이렇게 하면 풀리긴 한다.
하지만 여러모로 반환 타입은 안 바꾸는게 나으니 다음의 처리를 하자.

2️⃣ 옵셔널 처리

옵셔널 바인딩을 사용할 수도 있고, nil값이 없다고 확정된 경우 강제 언래핑을 사용할 수 있다.

1) 옵셔널 바인딩

옵셔널의 값이 nil이 아닌 경우와 nil인 경우를 각각 처리해주는 것이다.

👇🏻 if let문을 사용한 옵셔널 바인딩
func solution(_ s: String) -> Int {
    if let intValue = Int(s) {
        return intValue
    } else {
        return 0 // Int 변환에 실패한 경우 0을 반환
    }
}
👇🏻 guard let문을 사용한 옵셔널 바인딩
func solution(_ s:String) -> Int {
    guard let num  = Int(s) else {
        return 0 // 변환결과가 nil일 경우 0을 반환
    }
    return num
}

2) 강제 언래핑

swift의 옵셔널 처리가 안전한 자료형 처리를 위해 있는 것이기 때문에, 실제 프로그래밍을 하는 경우에서 강제 언래핑을 사용하는 것은 위험하다고 한다. 그런데 이 문제에서는 잘못된 값이 들어가지 않는다고 되어 있으니, 강제 언래핑을 사용해도 괜찮을 것 같다. (그리고 실제로 이런 문제의 많은 풀이가 강제 언래핑으로 해결되어 있음)

👇🏻 ! 을 사용한 강제 언래핑
func solution(_ s: String) -> Int {
    return Int(s)!
}

프로그램에 위와 같은 코드를 작성했는데 만약 입력에 정수가 아닌 문자열이 들어올 경우, 오류를 발생시키고 프로그램을 강제 중단할 수 있다. 따라서 실제 프로그래밍 시에는 강제 언래핑은 매우 조심스럽게 사용되어야 한다.

👇🏻 ?? 을 사용한 강제 언래핑
func solution(_ s: String) -> Int {
    return Int(s) ?? 0 // 변환 실패시 0을 반환
}

위 코드에서 사용된 ??는 옵셔널 자료형을 받고, nil이 있을 경우 ?? 뒤의 값을 반환하는 비교적 안전한 언래핑 방법이다.

profile
정체되지 않는 성장

0개의 댓글