0Pricing
Swift Academy · 강의

as!를 사용한 강제 캐스팅과 위험성

캐스팅 성공이 보장되는 경우에만 as!를 사용합니다.

as!를 사용한 강제 캐스팅과 위험성은(는) CoddyKit의 무료 Swift Academy 강의입니다. 이것은 4개 중 3번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Swift Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Swift Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

강제 캐스팅

강제 캐스팅 연산자 as!는 한 단계로 다운캐스팅과 언래핑을 수행합니다. 옵셔널이 아닌 타입을 바로 제공하지만, 캐스팅이 실패하면 충돌합니다.

class Animal {
    let name: String
    init(name: String) { self.name = name }
}
class Dog: Animal {
    func bark() -> String { return name + " says Woof" }
}
class Cat: Animal {
    func meow() -> String { return name + " says Meow" }
}
let a: Animal = Dog(name: "Rex")
let dog = a as! Dog
print(dog.bark())

옵셔널로 감싸지지 않습니다

as?와 달리 as!의 결과는 옵셔널이 아닌 일반 타입입니다. 따라서 언래핑할 필요가 없습니다.

class Animal {
    let name: String
    init(name: String) { self.name = name }
}
class Dog: Animal {
    func bark() -> String { return name + " says Woof" }
}
class Cat: Animal {
    func meow() -> String { return name + " says Meow" }
}
let a: Animal = Dog(name: "Rex")
let dog: Dog = a as! Dog
print(type(of: dog))

as!의 위험성

인스턴스가 실제로 대상 타입이 아니면 as!는 실행 중 트랩을 발생시키고 프로그램을 중지합니다. 복구할 방법이 없습니다.

class Animal {
    let name: String
    init(name: String) { self.name = name }
}
class Dog: Animal {
    func bark() -> String { return name + " says Woof" }
}
class Cat: Animal {
    func meow() -> String { return name + " says Meow" }
}
let a: Animal = Dog(name: "Rex")
// let cat = a as! Cat  // would crash at runtime
print("Only force-cast when certain")

강제 캐스팅이 안전한 경우

타입을 절대적으로 확신할 때만 as!를 사용하십시오. 예를 들어 is로 확인한 직후에 사용할 수 있습니다.

class Animal {
    let name: String
    init(name: String) { self.name = name }
}
class Dog: Animal {
    func bark() -> String { return name + " says Woof" }
}
class Cat: Animal {
    func meow() -> String { return name + " says Meow" }
}
let a: Animal = Dog(name: "Rex")
if a is Dog {
    let dog = a as! Dog
    print(dog.bark())
}

보장 후 강제 캐스팅하기

코드의 논리상 타입이 보장된다면 강제 캐스팅으로 그러한 확신을 명시할 수 있습니다. 그래도 확실하지 않을 때는 as?를 우선 사용하십시오.

class Animal {
    let name: String
    init(name: String) { self.name = name }
}
class Dog: Animal {
    func bark() -> String { return name + " says Woof" }
}
class Cat: Animal {
    func meow() -> String { return name + " says Meow" }
}
func barkIfDog(_ a: Animal) {
    guard a is Dog else { return }
    let dog = a as! Dog
    print(dog.bark())
}
barkIfDog(Dog(name: "Rex"))

as?와 as! 비교하기

as?는 안전하며 옵셔널을 반환하지만, as!는 강제적으로 캐스팅하고 실패하면 충돌합니다. 얼마나 확신할 수 있는지에 따라 선택하십시오.

class Animal {
    let name: String
    init(name: String) { self.name = name }
}
class Dog: Animal {
    func bark() -> String { return name + " says Woof" }
}
class Cat: Animal {
    func meow() -> String { return name + " says Meow" }
}
let a: Animal = Dog(name: "Rex")
let safe = a as? Dog
let forced = a as! Dog
print(safe?.bark() ?? "nil")
print(forced.bark())

컬렉션 강제 캐스팅하기

array as! [Dog]처럼 전체 컬렉션에도 강제 캐스팅을 적용할 수 있지만, 모든 요소에 대해 동일한 충돌 위험이 있습니다.

class Animal {
    let name: String
    init(name: String) { self.name = name }
}
class Dog: Animal {
    func bark() -> String { return name + " says Woof" }
}
class Cat: Animal {
    func meow() -> String { return name + " says Meow" }
}
let animals: [Animal] = [Dog(name: "Rex"), Dog(name: "Buddy")]
let dogs = animals as! [Dog]
for d in dogs { print(d.bark()) }

위험한 패턴

잘못된 요소가 포함된 배열을 강제 캐스팅하면 충돌합니다. 따라서 여러 타입이 섞인 컬렉션에서는 요소마다 as?를 사용해야 합니다.

class Animal {
    let name: String
    init(name: String) { self.name = name }
}
class Dog: Animal {
    func bark() -> String { return name + " says Woof" }
}
class Cat: Animal {
    func meow() -> String { return name + " says Meow" }
}
let animals: [Animal] = [Dog(name: "Rex"), Cat(name: "Mia")]
// let dogs = animals as! [Dog] // would crash on the Cat
for a in animals {
    if let d = a as? Dog { print(d.bark()) }
}

강제 언래핑과 강제 캐스팅

as!의 !는 개념적으로 옵셔널의 강제 언래핑과 비슷합니다. 편리하지만 가정이 틀리면 위험합니다.

class Animal {
    let name: String
    init(name: String) { self.name = name }
}
class Dog: Animal {
    func bark() -> String { return name + " says Woof" }
}
class Cat: Animal {
    func meow() -> String { return name + " says Meow" }
}
let a: Animal = Dog(name: "Rex")
let viaOptional = (a as? Dog)!
let viaForce = a as! Dog
print(viaOptional.name, viaForce.name)

권장 방법

기본적으로 as?를 사용하십시오. 실패가 개발 중 즉시 드러내고 싶은 프로그래머 오류를 의미하는 경우에만 as!를 사용하십시오.

class Animal {
    let name: String
    init(name: String) { self.name = name }
}
class Dog: Animal {
    func bark() -> String { return name + " says Woof" }
}
class Cat: Animal {
    func meow() -> String { return name + " says Meow" }
}
func process(_ a: Animal) -> String {
    if let d = a as? Dog { return d.bark() }
    return "not a dog"
}
print(process(Dog(name: "Rex")))
print(process(Cat(name: "Mia")))

강제 캐스팅 종합 예제

타입이 확인된 경우에는 as!가 깔끔하게 읽힙니다. 확실하지 않다면 안전한 조건부 캐스팅이 올바른 도구입니다.

class Animal {
    let name: String
    init(name: String) { self.name = name }
}
class Dog: Animal {
    func bark() -> String { return name + " says Woof" }
}
class Cat: Animal {
    func meow() -> String { return name + " says Meow" }
}
let known: Animal = Dog(name: "Rex")
if known is Dog {
    print((known as! Dog).bark())
}

빠른 확인

강제 캐스팅의 위험성을 생각해 보십시오.

복습: 강제 캐스팅과 그 위험성

as!는 다운캐스팅과 언래핑을 수행하여 옵셔널이 아닌 타입을 반환하지만 실패하면 충돌한다는 것을 배웠습니다. 또한 타입이 확실할 때만 사용해야 하며(대개 is 확인 후 사용), as?가 여전히 더 안전한 기본 선택이라는 것도 배웠습니다.

class Animal {
    let name: String
    init(name: String) { self.name = name }
}
class Dog: Animal {
    func bark() -> String { return name + " says Woof" }
}
class Cat: Animal {
    func meow() -> String { return name + " says Meow" }
}
let a: Animal = Dog(name: "Rex")
if a is Dog { print((a as! Dog).bark()) } else { print("safe skip") }

자주 묻는 질문

“as!를 사용한 강제 캐스팅과 위험성” 강의는 무료인가요?

네 — “as!를 사용한 강제 캐스팅과 위험성” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Swift Academy 강의 전체를 잠금 해제할 수 있습니다. Swift Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

“as!를 사용한 강제 캐스팅과 위험성”에서 뭘 배우나요?

캐스팅 성공이 보장되는 경우에만 as!를 사용합니다. 브라우저에서 직접 실행하는 실습 코드로 Swift Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

Swift Academy을(를) 시작하는 데 경험이 필요한가요?

사전 경험은 필요하지 않습니다. CoddyKit의 Swift Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 3번째 강의입니다.

“as!를 사용한 강제 캐스팅과 위험성” 강의는 얼마나 걸리나요?

대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.

이 Swift Academy 강의에서 코드를 작성하고 실행할 수 있나요?

네. 모든 Swift Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. 업캐스팅과 다운캐스팅 기초
  2. as?를 사용한 조건부 캐스팅
  3. as!를 사용한 강제 캐스팅과 위험성
  4. is로 형식 확인하기
← Swift Academy(으)로 돌아가기