์๋ ํ์ธ์, ๊ฐ์์ ๋๋ค. ์ค๋์ ์๋ฌ๋ฅผ ๋ค๋ฃจ๋ try-catch๊ตฌ๋ฌธ์ ๋ํด์ ๋ฐฐ์๋ณด๋๋ก ํ์ฃ ! ๊ฐ๋จํ๋ ์ด์ gogo~
๋ณธ ํฌ์คํ ์ ํจ์คํธ์บ ํ 30๊ฐ๋ก ๋ฐฐ์ฐ๋ ios๊ฐ๋ฐ ๊ฐ์์, ์ธํฐ๋ท ๋ธ๋ก๊ทธ ํฌ์คํ ๋ค์ ๋ณด๋ฉฐ ์์ฑํ ๊ธ์ ๋๋ค :)
try-catch๋?
try-catch๋ ์๋ฌ๋ฅผ ์ฒ๋ฆฌํ๊ธฐ ์ํ ๊ตฌ๋ฌธ์ด๋ค. ์๋ฌ์ฒ๋ฆฌ๋, ํ๋ก๊ทธ๋จ๋ด์์ ์๋ฌ๊ฐ ๋ฐ์ํ ์ํฉ์ ๋์ํ๊ณ ์ด๋ฅผ ๋ณต๊ตฌํ๋ ๊ณผ์ ์ด๋ค. Swift์์๋ ๋ฐํ์์ ์๋ฌ๊ฐ ๋ฐ์ํ ๊ฒฝ์ฐ, ์ด๋ฅผ ์ฒ๋ฆฌํ๊ธฐ ์ํ ๋ฐ์, ๊ฐ์ง, ์ ํ, ์กฐ์์ ์ง์ํ๋ ํด๋์ค๋ฅผ ์ ๊ณตํ๋ค. ํ๋ก๊ทธ๋จ์์ ๋ชจ๋ ๊ธฐ๋ฅ์ด ์ฐ๋ฆฌ๊ฐ ์ํ๋๋๋ก ๋์ํ๋ค๋ ๋ณด์ฅ์ ์๋ค. ๋ฐ๋ผ์ ์ค๋ฅ ์ฒ๋ฆฌ๋ฅผ ํตํด ์ค๋ฅ ์ํฉ์ ๊ตฌ๋ณํ๊ณ ํ๋ก๊ทธ๋จ ์์ฒด์ ์ผ๋ก ์ค๋ฅ๋ฅผ ํด๊ฒฐํ๊ฑฐ๋, ์ฌ์ฉ์์๊ฒ ์ด๋ค ์๋ฌ๊ฐ ๋ฐ์ํ๋์ง ์๋ ค์ฃผ๋ ๋ฑ์ ๋ํ ์กฐ์น์ ๋์์ด ํ์ํ๋ค. ๊ทธ๋์ try-catch๊ฐ ์ค์ํ๋ค!
try-catch๋ฅผ ์ฌ์ฉํ ์์๋ฅผ ์ดํด๋ณด์. Swift์์ ์๋ฌ๋ ์๋ฌ ํ๋กํ ์ฝ์ ๋ฐ๋ฅด๋ ํ์ ์ ๊ฐ์ผ๋ก ํํ๋๋ค. ์๋ฌํ๋กํ ์ฝ์ ์๊ตฌ์ฌํญ์ด ์๋ ๋น ํ๋กํ ์ฝ์ด์ง๋ง, ์ค๋ฅ๋ฅผ ํํํ๊ธฐ ์ํด์๋ ์ด ํ๋กํ ์ฝ์ ์ฑํํด์ผํ๋ค. Swift์ ์ด๊ฑฐํ์ ์ค๋ฅ ์์ธ์ ๋๋๊ณ , ํด๋น ์ค๋ฅ์ ํน์ฑ์ ๋ํ ์ถ๊ฐ ์ ๋ณด๋ฅผ ๋ง๋๋ ๋ชจ๋ธ์ ๋ง๋๋๋ฐ ์ ํฉํ๋ค!
์ด๊ฑฐํ์ ์ฌ์ฉํ ์๋ฌ ํํ์ ๋ง๋ค์ด๋ณด์. ์๋์ฒ๋ผ ์ด๊ฑฐํ์ ์ฌ์ฉํ์ฌ ์๋ฌ๋ฅผ ์ ์ํ๋ ๊ฒ์ด ๊ฐ!์ฅ! ๊ธฐ๋ณธ์ ์ธ ๋ฐฉ๋ฒ์ด๋ค.
enum PhoneError: Error {
case unknown
case batteryLow(batteryLevel: Int)
}
๊ทธ๋ผ ์ด์ ๋ง์ฝ ๋ฐฐํฐ๋ฆฌ๊ฐ ์์๋ ์๋ฌ๋ฅผ ๋ฐ์์์ผ์ผํ๋๋ฐ, ์๋ฌ๊ฐ ๋ฐ์ํ๊ฒ๋ ์ด๋ป๊ฒ ๋ง๋ค์ด์ผ ํ ๊น? throw ๊ตฌ๋ฌธ์ ํ์ฉํ์ฌ ์๋ฌ๋ฅผ ๋ฐ์์ํค์(์ค๋ฅ๋ฅผ ๋์ ธ์ฃผ์).
throw PhoneError.batteryLow(batteryLevel: 20)
๋ฐฐํฐ๋ฆฌ ๋ ๋ฒจ์ด 20์ผ ๋ batteryLow๋ผ๋ ์ค๋ฅ๊ฐ ๋๊ฒ๋ ๋์ ธ์ฃผ์๋ค.
์ด๋ ๊ฒ ์ค๋ฅ๋ฅผ ๋์ง ์๋ ์์ง๋ง, ์ค๋ฅ๊ฐ ๋์ ธ์ง๋ ๊ฒ์ ๋๋นํ์ฌ ๋์ ธ์ง ์ค๋ฅ๋ฅผ ์ฒ๋ฆฌํ๊ธฐ ์ํ ์ฝ๋๋ ์์ฑํด์ผํ๋ค. ๋์ ธ์ง ์ค๋ฅ๊ฐ ๋ญ์ง ํ์ ํ์ฌ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ผ๋ก ์ค๋ฅ๋ฅผ ํด๊ฒฐํ๋์ง, ์ฌ์ฉ์์๊ฒ ์๋ฆฌ๋์ง ๋ฑ์ ๋ํ ๋์ฒ๊ฐ ํ์ํ๋ค. Swift์์ ์๋ฌ๋ฅผ ์ฒ๋ฆฌํ๊ธฐ ์ํ ๋ฐฉ๋ฒ์ ๋ค ๊ฐ์ง๊ฐ ์กด์ฌํ๋ค.
- ํจ์์์ ๋ฐ์ํ ์ค๋ฅ๋ฅผ ํด๋นํจ์๋ฅผ ํธ์ถํ ์ฝ๋์ ์ ํํ๋ ๋ฐฉ๋ฒ
- do catch ๊ตฌ๋ฌธ์ ์ฌ์ฉํ ์ค๋ฅ ์ฒ๋ฆฌ ๋ฐฉ๋ฒ
- optional๋ก ์ค๋ฅ ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ
- ์ค๋ฅ๊ฐ ๋ฐ์ํ์ง ์์ ๊ฒ์ด๋ผ๊ณ ํ์ ํ๋ ๋ฐฉ๋ฒ
์ฐจ๋ก๋๋ก ์ด๋ป๊ฒ ์ค๋ฅ๋ฅผ ์ฒ๋ฆฌํ๋์ง ์์๋ณด์.
์ค๋ฅ ์ฒ๋ฆฌ ๋ฐฉ๋ฒ
1) ํจ์์์ ๋ฐ์ํ ์ค๋ฅ๋ฅผ ํด๋น ํจ์๋ฅผ ํธ์ถํ ์ฝ๋์ ์ ํํ๋ ๋ฐฉ๋ฒ (do catch ์ฌ์ฉ)
ํจ์ ๋งค๊ฐ๋ณ์ ์์ฑ์ ๋งค๊ฐ๋ณ์ ๋ค์ throws ํค์๋ (throwing ํจ์๋ผ๊ณ ํ๋ค) ๋ฅผ ์ฌ์ฉํ ๊ตฌ๋ฌธ์ ์ ์ด์ฃผ๋ฉด๋๋ค.
func checkPhoneBatteryStatus(batteryLevel: Int) throws -> String {
guard batteryLevel != -1 else { throw PhoneError.unknown }
guard batteryLevel >= 20 else { throw PhoneError.batteryLow(batteryLow: 20) }
return "๋ฐฐํฐ๋ฆฌ ์ํ๊ฐ ์ ์์
๋๋ค."
}
guard๋ฌธ๊ณผ throw ํค์๋๋ฅผ ์ฌ์ฉํด์ ์ค๋ฅ๋ฅผ ๋์ ธ์ฃผ์๋ค. guard๋ฌธ์์ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ฉด else๋ก ๋์ด๊ฐ์ ํฐ์๋ฌ๋ฅผ ๋ฐ์์ํค๊ณ ํจ์๋ฅผ ์ข ๋ฃ์ํจ๋ค. ์ด ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด ์ค๋ฅ๋ฅผ ํ ์๋ ์๊ธฐ ๋๋ฌธ์ do-catch๋ try-catch๋ฅผ ์ฌ์ฉํด์ ์ค๋ฅ๋ฅผ ์ฒ๋ฆฌํ ์ ์์ด์ผํ๋ค.
์ฐ์ , do-catch๋ฌธ์ ์ฌ์ฉํด์ ์ค๋ฅ๋ฅผ ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ๋ํด์ ์์๋ณด์. ๊ธฐ๋ณธ์ ์ธ ํํ๋ ๋ค์๊ณผ ๊ฐ๋ค.
do {
try ์ค๋ฅ ๋ฐ์ ๊ฐ๋ฅ ์ฝ๋
} catch ์ค๋ฅ ํจํด {
์ฒ๋ฆฌ ์ฝ๋
}
ํจ์, ๋ฉ์๋, ์์ฑ์ ์ค์์ ์ค๋ฅ๋ฅผ ๋์ ธ์ฃผ๋ฉด, ์ค๋ฅ ๋ฐ์์ ์ ๋ฌ๋ฐ์ ์ฝ๋ ๊ตฌ๋ฌธ์ do catch ๊ตฌ๋ฌธ์ ์ฌ์ฉํด์ ์ค๋ฅ๋ฅผ ์ฒ๋ฆฌํด์ฃผ๋ฉด๋๋ค. do์ ์์ ์ค๋ฅ๋ฅผ ๋์ง๊ณ , catch ์ ์์ ์ค๋ฅ๋ฅผ ์ ๋ฌ๋ฐ์ ์์ธ์ฒ๋ฆฌ๋ฅผ ํด์ฃผ๋ ๊ฒ์ด๋ค.
์ฝ๋๋ฅผ ์์ฑํด๋ณด๋ฉด์ do catch๊ตฌ๋ฌธ์ ๋ํด์ ๋ ์ดํด๋ณด์.
do {
try checkPhoneBatterytStatus(batteryLevel: -1)
} catch PhoneError.unknown {
print("์ ์ ์๋ ์๋ฌ์
๋๋ค.")
} catch PhoneError.battertyLow(let batteryLebel) {
print("๋ฐฐํฐ๋ฆฌ ์ ์ ๋ถ์กฑ ๋จ์ ๋ฐฐํฐ๋ฆฐ : \(batteryLebel)%")
} catch {
print("๊ทธ ์ธ ์ค๋ฅ ๋ฐ์ : \(error)")
}
catch ๋ค์ ์ค๋ฅ์ ์ข ๋ฅ๋ฅผ ๋ช ์ํ์ง ์์๋ ์ฝ๋๋ธ๋ก์ ์์ฑํ๋ฉด ๋ธ๋ก ๋ด๋ถ์ ์์์ ์ผ๋ก ์๋ฌ๋ผ๋ ์ด๋ฆ์ ์ง์ญ์์๊ฐ ์ค๋ฅ ๋ด์ฉ์ผ๋ก ๋ค์ด์ค๊ฒ ๋๋ค. ๋ฐ๋ผ์ ์ ์ฝ๋์์ unknown๋ ์๋๊ณ , batteryLow๋ ์๋์ด์ ๋งจ ๋ง์ง๋ง catch๊ตฌ๋ฌธ์ด ์คํ๋๋ค๋ฉด, ์ค๋ฅ์ ์ข ๋ฅ๊ฐ ๋ช ์๋์ด์์ง ์๋๋ผ๋ ๊ทธ๊ฒ๋ํ ์ค๋ฅ๋ด์ฉ์ผ๋ก ์ธ์ํ๋ค๋ ๊ฒ์ด๋ค.
์ด๋ ๊ฒ ์์ฑํ๋ฉด checkPhoneBatteryStatusํจ์๊ฐ ์ค๋ฅ๋ฅผ ๋ฐ์์ํค๊ฒ ๋๋ฉด, catch ๋ฌธ์ด ์ด ์ค๋ฅ๋ฅผ ์ก์์ ๊ฐ๋ฐ์๊ฐ ์ค๋ฅ ์ํฉ์ ๋ง๋ ์ ์ ํ ์์ธ์ฒ๋ฆฌ๋ฅผ ํ ์์๊ฒ ํด์ค๋ค.
์ ์ฝ๋์์๋ CheckPhoneBatteryStatus์ -1์ ์ ๋ฌํ์ผ๋ ํด๋น ํจ์์์ unknown ์๋ฌ๋ฅผ ์ ๋ฌํ๊ณ , ์ด๋ฅผ catch๊ฐ ์ก์์ "์ ์์๋ ์๋ฌ์ ๋๋ค."๋ผ๋ ๋ฌธ๊ตฌ๋ฅผ ์ถ๋ ฅํ๊ฒ ๋ ๊ฒ์ด๋ค.
2) try?๋ฅผ ์ฌ์ฉํ์ฌ ์ค๋ฅ๋ฅผ ์ต์ ๋ ๊ฐ์ผ๋ก ๋ณํํ์ฌ ์ฒ๋ฆฌํ์.
try?๋ฅผ ์ฌ์ฉํด์ ๋์ํ๋ ์ฝ๋๊ฐ ์ค๋ฅ๋ฅผ ๋์ง๋ฉด, ๊ทธ ์ฝ๋์ ๋ฐํ๊ฐ์ด nil์ด ๋๋ค. ์๋ ์ฝ๋์ ๊ฐ์ด ์ฝ๋๋ฅผ ํธ์ถํ ๋ try ๋ค์ ๋ฌผ์ํ(?)๋ฅผ ๋ถ์ฌ์ฃผ๊ณ , ์ถ๋ ฅํด๋ณด์.
let status = try? checkPhoneBatteryStatus(batteryLevel: -1)
print(status)
//prints nil
checkPhoneBatteryStatusํจ์๊ฐ unknown์ด๋ผ๋ ์๋ฌ๋ฅผ ๋์ ธ์ค๋ค. ๋ฐ๋ผ์ status๋ฅผ ์ถ๋ ฅํ๋ฉด nil์ด ์ถ๋ ฅ๋๋ ๊ฒ์ด๋ค. (์๋ฌ๋ฅผ nil๋ก ์ฒ๋ฆฌํ๋ค!!)
๊ทธ๋ผ ์๋ฌ๊ฐ ๋์ง ์๋ ๋ฒ ํฐ๋ฆฌlevel์ ๋ฃ์ด๋ณด์.
let status = try? checkPhoneBatteryStatus(batteryLevel: 30)
print(status)
//prints optional("๋ฐฐํฐ๋ฆฌ ์ํ๊ฐ ์ ์์
๋๋ค.")
์ด์ฒ๋ผ ์๋ฌ๊ฐ ๋ฐ์ํ๋ฉด nil, ๋ฐ์ํ์ง ์์ผ๋ฉด ์ต์ ๋(๊ฒฐ๊ด๊ฐ) ์ผ๋ก ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ์ด ์๋ค.
3) try!๋ฅผ ์ฌ์ฉํด์ ์๋ฌ๋ฅผ ์ฒ๋ฆฌํด๋ณด์. (์๋ฌ๊ฐ ๋ฐ์ํ์ง ์์ ๊ฒ์ด๋ผ๊ณ ํ์ ํ ๋๋ง ์ฌ์ฉ)
์๋ฌ๊ฐ ๋ฐ์๋ ๊ฒ ๊ฐ์ ํจ์ ๊ตฌ๋ฌธ์ try!๋ฅผ ์ฌ์ฉํ๋ค. try!๋ throwingํจ์๋ ๋ฉ์๋๊ฐ ์๋ฌ๋ฅผ ๋ฐ์์ํค์ง ์์ ๊ฒ์ด๋ผ๊ณ ํ์ ํ ๋ ์ฌ์ฉํ๋ค. ์ค๋ฅ๊ฐ ์ ๋๋ก ๋ฐ์ํ์ง ์์ ๊ฒ์ด๋ผ๊ณ ํ์ ํ๋ ์ํฉ์์๋ง ์ฌ์ฉํ๋ค.
๋ง์ฝ์ ์ค๋ฅ๋ฅผ ๋์ง๋ค๋ฉด ์๋ฌ๊ฐ ๋ฐ์ํ๋ฉด์ ํ๋ก๊ทธ๋จ์ด ์ข ๋ฃ๋๋ ์ฃผ์ํด์ผํ๋ค.
let status2 = try! checkPhoneBatteryStatus(batteryLevel: 30)
print(status2)
//prints "๋ฐฐํฐ๋ฆฌ ์ํ๊ฐ ์ ์์
๋๋ค."
์๋ฌ๊ฐ ๋ฐ์ํ์ง ์๋ ์ํฉ์ด๊ธฐ ๋๋ฌธ์ ์ต์ ๋๊ฐ์ด ๋ฒ๊ฒจ์ง ๋ฐํ๊ฐ์ด ์ถ๋ ฅ๋๋ค. ํ์ง๋ง, ์๋ฌ๊ฐ ๋ฐ์ํ๋ ์ํฉ์์ ํด๋น try!๊ตฌ๋ฌธ์ ์ฌ์ฉํ๊ฒ๋๋ฉด ์๋์ ๊ฐ์ด ๋ฐํ์์๋ฌ๊ฐ ๋ฐ์ํ๋ฉด์ ํ๋ก๊ทธ๋จ์ด ์ค๋จ๋๋ค.
let status2 = try! checkPhoneBatteryStatus(batteryLevel: -1)
print(status2)
// Error!!!!!
try-catch๊ตฌ๋ฌธ์ ์ฌ์ฉํด์ ์๋ฌ๊ฐ ๋ฐ์ํ ๊ฑฐ ๊ฐ์ ์ํฉ์์ ์์ธ์ฒ๋ฆฌ๋ฅผ ํด์ฃผ๋ฉด์ ํ๋ก๊ทธ๋จ์ ์ ๋์ํ๊ฒ ๋ง๋ค์ด๋ณด์!