[swift] try?과 try!의 차이점과 적절한 사용 방법

Swift에서 try?try!은 두 가지 다른 에러 처리 방법을 제공합니다. 이 두 연산자는 에러를 처리하는 방식과 프로그램의 동작에 중요한 영향을 미치므로 올바르게 이해하고 사용하여야 합니다.

try?의 사용

try? 연산자는 에러가 발생할 수 있는 코드 블록 내에서 사용됩니다. 이 연산자를 사용하면 에러가 발생하면 결과값이 nil이 됩니다. 따라서 에러를 무시하고 코드를 계속 실행하며, 함수나 메서드의 반환 값은 옵셔널 타입으로 처리됩니다.

func fetchData() -> Data? {
    guard let fileURL = URL(string: "example.json") else {
        return nil
    }
    
    do {
        let data = try Data(contentsOf: fileURL)
        return data
    } catch {
        return nil // 에러가 발생하면 nil을 반환
    }
}

위 예제에서 try?를 사용하여 Data(contentsOf:) 메서드를 호출하였기 때문에, 에러가 발생할 경우 nil을 반환합니다.

try!의 사용

반면에 try! 연산자는 같은 코드 블록 내에서 사용되지만, 에러가 발생할 경우 런타임 에러가 발생하며 프로그램이 중지됩니다. 이 연산자는 에러를 무시하거나 처리하지 않고 무조건 실행하는 것을 나타내므로 주의해서 사용하여야 합니다.

func fetchData() -> Data {
    guard let fileURL = URL(string: "example.json") else {
        fatalError("Invalid file URL")
    }
    
    do {
        let data = try Data(contentsOf: fileURL)
        return data
    } catch {
        fatalError("Error while fetching data: \(error)")
    }
}

위 예제에서 try!를 사용하여 Data(contentsOf:) 메서드를 호출하였기 때문에, 에러가 발생하면 런타임 에러가 발생하여 프로그램이 중지됩니다.

언제 어떤 것을 사용해야 하는가?

이러한 차이점을 잘 이해하고 상황에 맞게 적절하게 사용하여야 합니다.

자세한 내용은 The Swift Programming Language - Error Handling를 참고하세요.