diff --git a/LEVEL 1/15-Error.md b/LEVEL 1/15-Error.md new file mode 100644 index 0000000..6eb36ad --- /dev/null +++ b/LEVEL 1/15-Error.md @@ -0,0 +1,86 @@ +## 15-Error + +### 1. Swift의 에러 처리 방법에 대해 설명해주세요. + +Swift에서 에러 처리는 프로그램 실행 중 발생할 수 있는 예외 상황에 대비하여 오류가 발생할 수 있는 부분을 명시적으로 표현하고 이를 강제적으로 처리하도록 하여 안정적으로 코드가 실행될 수 있도록 도와줍니다. Swift는 명확하고 안전한 에러 처리를 제공하며, Error 프로토콜과 do-catch 구문, throws 키워드, try 구문 등을 사용해 에러를 처리합니다. + +### 2. throws, try, catch 키워드의 사용 방법은 무엇인가요? + +#### Error 프로토콜 + +- Swift의 에러 타입은 Error 프로토콜을 준수하는 타입으로 정의됩니다. +- enum을 사용해 에러의 종류를 구체적으로 정의하고, 상황에 맞게 사용할 수 있습니다. + +#### throws 키워드 + +- throws 키워드는 함수가 에러를 발생시킬 수 있음을 명시적으로 표시하며, 에러를 전파할 수 있는 함수를 정의합니다. +- 함수 내부에서 에러가 발생할 가능성이 있는 코드를 포함하고, 호출 시 에러 처리를 요구합니다. + +#### try 키워드 + +- try 키워드는 에러가 발생할 수 있는 함수 호출 앞에 붙이며, 호출 시 에러가 발생할 경우 이를 상위 코드로 전달합니다. +- 에러 처리 방법에 따라 try, try?, try!를 사용할 수 있습니다. + + - try: 에러를 던질 가능성이 있는 코드 앞에 사용하며, do-catch 구문으로 에러를 처리해야 합니다. + - try?: 에러가 발생할 경우 nil을 반환하고, 옵셔널로 결과를 처리합니다. + - try!: 에러가 발생하지 않을 것을 확실할 때 사용하며, 에러가 발생하면 런타임 오류가 발생합니다. + +#### do-catch 구문 + +- do-catch 구문은 에러가 발생할 가능성이 있는 코드를 실행하고, 에러가 발생할 경우 해당 에러를 처리하는 구문입니다. +- catch 블록에서 특정 에러를 처리할 수 있으며, 에러의 종류에 따라 분기 처리가 가능합니다. + +#### defer 구문 + +- defer 구문은 코드 블록이 종료되기 직전에 실행할 코드를 작성할 때 사용합니다. 예를 들어, 파일 닫기, 리소스 해제와 같은 작업을 수행할 때 유용합니다. +- do-catch 구문 내부에서도 defer를 사용하여 에러 발생 여부와 관계없이 마지막에 반드시 실행될 코드를 지정할 수 있습니다. + + ```swift + func processFile(filename: String) throws { + if exists(filename) { + let file = open(filename) + defer { + close(file) + } + while let line = try file.readline() { + // Work with the file. + } + // close(file) is called here, at the end of the scope. + } + } + ``` + +### 3. 옵셔널을 사용한 에러 처리와 do-catch를 사용하는 에러 처리의 차이는 무엇인가요? + +옵셔널을 사용한 에러 처리와 do-catch를 사용한 에러 처리의 가장 큰 차이는 에러의 발생 여부를 어떻게 다루고, 에러에 대해 얼마나 상세히 처리할 수 있는지 여부입니다. 옵셔널은 에러 발생 시 nil로 결과를 표현하는 반면, do-catch는 에러를 구체적으로 처리할 수 있는 구조를 제공합니다. 이 차이는 주로 에러를 간단히 무시할지 또는 에러를 구체적으로 다뤄야 하는지에 따라 선택할 수 있습니다. + +#### 옵셔널을 사용한 에러 처리 (try?) + +try? 키워드를 사용하면, 에러가 발생할 수 있는 함수 호출 결과를 옵셔널 타입으로 반환합니다. 이 방식은 에러가 발생했을 때 해당 값을 nil로 표현하여, 에러에 대한 구체적인 처리를 생략하고 단순히 값이 없음을 표시하는데 유용합니다. + + 장점: 코드가 간견해지고, 에러 발생 여부를 무시하고 간단하게 nil로 처리할 수 있습니다. + 단점: 에러가 발생한 원인을 알 수 없고, 에러에 대한 구체적인 처리가 어렵습니다. + +#### do-catch를 사용한 에러 처리 + +do-catch 구문은 에러를 명시적으로 처리하고, 발생한 에러를 분기하여 상세히 다룰 수 있는 구조를 제공합니다. do 블럭 내에서 에러가 발생하면 catch 블럭에서 해당 에러를 잡아내며, 에러의 종류에 따라 다양한 대응 방식을 지정할 수 있습니다. + + 장점: 에러의 원인과 종류에 따라 구체적인 처리가 가능하며, 필요한 대응을 설정할 수 있습니다. + 단점: 코드가 다소 길어지지만, 에러 처리가 필요한 상황에서는 명확하고 안정적인 구조를 제공합니다. + +### 4. 에러를 전파하는 방법은 무엇인가요? + +에러 전파는 하위 함수에서 발생한 에러를 상위 함수로 전달하여, 상위 함수에서 에러를 처리하도록 하는 방법입니다. Swift에서는 throws 키워드를 통해 에러를 발생시키고 전파할 수 있으며, 호출한 함수 쪽에서 이를 전달 받아 적절히 처리하게 됩니다. + +#### Swift에서 에러를 전파하는 방법 + +에러 전파는 throws와 try 키워드를 사용해 구현됩니다. + + 1. throws 키워드로 에러가 발생할 수 있음을 표시합니다. + - 함수 선언에서 throws 키워드를 사용해 해당 함수가 에러를 던질 수 있음을 표시합니다. 이 함수는 에러가 발생할 경우 이를 상위로 전파할 수 있습니다. + 2. 호출 시 try 키워드를 통해 에러가 발생할 수 있음을 표시합니다. + - throws 함수는 호출 시 try 키워드를 통해 호출해야 합니다. try는 에러가 발생할 수 있음을 나타내며, 호출한 함수로 에러를 전파하거나 처리할 준비를 하게 합니다. + 3. 상위 함수에서 에러 처리 + - 상위 함수는 do-catch 구문을 사용해 에러를 처리하거나, 또다시 throws로 에러를 전파할 수 있습니다. 이처럼 에러를 연쇄적으로 전파하여 최종적으로 한 곳에서 처리하는 방식으로 구현할 수 있습니다. + +에러 전파는 하위 함수에서 발생한 에러를 상위 함수에서 처리하도록 전달함으로써, 코드의 흐름을 일관성 있게 관리하고 에러를 한 곳에서 효과적으로 처리할 수 있도록 만듭니다.