👉🏻 프로그래머스: 문자열을 정수로 바꾸기 - 문제 링크
func solution(_ s:String) -> Int {
return Int(s)
}
뭔가 당연히 안 될 것 같다고 생각했지만 안됐다.
Int(s)의 반환 타입이 옵셔널인 Int? 타입이기 때문에, Int로 리턴받기로 선언한 저 구조에서는 에러가 나는 것.
이 문제의 여러가지 풀이를 알아볼 겸 Swift의 옵셔널 처리에 대해 복습해보자.
크게 두 가지 해결방안이 있다.
func solution(_ s:String) -> Int {
return Int(s)
}
이렇게 하면 풀리긴 한다.
하지만 여러모로 반환 타입은 안 바꾸는게 나으니 다음의 처리를 하자.
옵셔널 바인딩을 사용할 수도 있고, nil값이 없다고 확정된 경우 강제 언래핑을 사용할 수 있다.
옵셔널의 값이 nil이 아닌 경우와 nil인 경우를 각각 처리해주는 것이다.
func solution(_ s: String) -> Int {
if let intValue = Int(s) {
return intValue
} else {
return 0 // Int 변환에 실패한 경우 0을 반환
}
}
func solution(_ s:String) -> Int {
guard let num = Int(s) else {
return 0 // 변환결과가 nil일 경우 0을 반환
}
return num
}
swift의 옵셔널 처리가 안전한 자료형 처리를 위해 있는 것이기 때문에, 실제 프로그래밍을 하는 경우에서 강제 언래핑을 사용하는 것은 위험하다고 한다. 그런데 이 문제에서는 잘못된 값이 들어가지 않는다고 되어 있으니, 강제 언래핑을 사용해도 괜찮을 것 같다. (그리고 실제로 이런 문제의 많은 풀이가 강제 언래핑으로 해결되어 있음)
func solution(_ s: String) -> Int {
return Int(s)!
}
프로그램에 위와 같은 코드를 작성했는데 만약 입력에 정수가 아닌 문자열이 들어올 경우, 오류를 발생시키고 프로그램을 강제 중단할 수 있다. 따라서 실제 프로그래밍 시에는 강제 언래핑은 매우 조심스럽게 사용되어야 한다.
func solution(_ s: String) -> Int {
return Int(s) ?? 0 // 변환 실패시 0을 반환
}
위 코드에서 사용된 ??는 옵셔널 자료형을 받고, nil이 있을 경우 ?? 뒤의 값을 반환하는 비교적 안전한 언래핑 방법이다.