0Pricing
Swift Academy · 강의

as?를 사용한 조건부 캐스팅

실패하면 옵셔널을 반환하는 캐스팅을 시도합니다.

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

조건부 캐스팅

조건부 캐스팅 연산자 as?는 다운캐스팅을 시도하고 옵셔널을 반환합니다. 성공하면 값이 옵셔널로 감싸져 반환되고, 실패하면 nil이 반환됩니다.

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 maybe = a as? Dog
print(maybe != nil)

결과는 옵셔널입니다

캐스팅이 실패할 수 있으므로 결과 타입은 Dog가 아니라 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 a: Animal = Dog(name: "Rex")
let maybe: Dog? = a as? Dog
print(type(of: maybe))

if let으로 언래핑하기

as?를 사용하는 관용적인 방법은 if let 바인딩 안에 넣는 것입니다. 그러면 캐스팅이 성공한 경우에만 본문이 실행됩니다.

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 let dog = a as? Dog {
    print(dog.bark())
} else {
    print("Not a dog")
}

실패한 캐스팅은 nil을 반환합니다

인스턴스가 대상 타입이 아니면 as?는 nil을 반환하고 if let 본문은 건너뜁니다.

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 = Cat(name: "Mia")
if let dog = a as? Dog {
    print(dog.bark())
} else {
    print("That is not a dog")
}

guard let과 함께 사용하기

guard let을 사용하여 먼저 캐스팅하고, 실패하면 바로 종료할 수도 있습니다. 이렇게 하면 정상 경로의 들여쓰기 수준을 유지할 수 있습니다.

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 describe(_ a: Animal) {
    guard let cat = a as? Cat else {
        print("Not a cat")
        return
    }
    print(cat.meow())
}
describe(Cat(name: "Mia"))
describe(Dog(name: "Rex"))

반복문에서 조건부 캐스팅하기

여러 타입이 섞인 배열을 순회하며 각 요소를 조건부로 캐스팅하는 것은 서로 다른 서브클래스를 안전하게 처리하는 깔끔한 방법입니다.

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 zoo: [Animal] = [Dog(name: "Rex"), Cat(name: "Mia"), Dog(name: "Buddy")]
for a in zoo {
    if let dog = a as? Dog {
        print(dog.bark())
    }
}

프로토콜로 캐스팅하기

as?는 프로토콜 준수 여부도 확인합니다. 인스턴스가 프로토콜을 준수하면 값을 반환하고, 그렇지 않으면 nil을 반환합니다.

protocol Greeter { func greet() -> String }
class Person: Greeter { func greet() -> String { return "Hi" } }
class Rock {}
let items: [Any] = [Person(), Rock()]
for item in items {
    if let g = item as? Greeter { print(g.greet()) }
}

캐스팅 후 nil 병합하기

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 = Cat(name: "Mia")
let sound = (a as? Dog)?.bark() ?? "unknown sound"
print(sound)

옵셔널 캐스팅 호출 연결하기

옵셔널 체이닝을 사용하면 캐스팅 결과에 대해 메서드를 호출할 수 있습니다. 캐스팅이 실패하면 전체 표현식은 nil이 됩니다.

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 bark = (a as? Dog)?.bark()
print(bark as Any)

조건부 캐스팅을 우선하는 이유

as?는 절대 충돌하지 않습니다. 캐스팅이 실패하면 단순히 nil을 생성합니다. 따라서 다운캐스팅에 안전한 기본 선택이 됩니다.

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 unknown: Animal = Cat(name: "Mia")
let result = unknown as? Dog
print("Crashes? No. Value is nil:", result == nil)

조건부 캐스팅 종합 예제

이를 종합하면 서브타입을 안전하게 감지하고, 해당 타입에 맞게 처리하며, 그렇지 않으면 적절히 대체 경로로 넘어갈 수 있습니다.

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 sound(of a: Animal) -> String {
    if let d = a as? Dog { return d.bark() }
    if let c = a as? Cat { return c.meow() }
    return "silence"
}
print(sound(of: Dog(name: "Rex")))
print(sound(of: Cat(name: "Mia")))

빠른 확인

조건부 캐스팅의 결과 타입을 떠올려 보십시오.

복습: as?를 사용한 조건부 캐스팅

as?는 옵셔널을 반환하는 안전한 다운캐스팅을 수행하고, if let과 guard let은 성공한 경우를 언래핑한다는 것을 배웠습니다. 또한 실패하면 단순히 nil을 반환하므로 절대 충돌하지 않으며, 다운캐스팅에 권장되는 연산자입니다.

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 pets: [Animal] = [Dog(name: "Rex"), Cat(name: "Mia")]
for p in pets {
    if let d = p as? Dog { print(d.bark()) } else if let c = p as? Cat { print(c.meow()) }
}

자주 묻는 질문

“as?를 사용한 조건부 캐스팅” 강의는 무료인가요?

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

“as?를 사용한 조건부 캐스팅”에서 뭘 배우나요?

실패하면 옵셔널을 반환하는 캐스팅을 시도합니다. 브라우저에서 직접 실행하는 실습 코드로 Swift Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

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

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

“as?를 사용한 조건부 캐스팅” 강의는 얼마나 걸리나요?

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

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

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

이 강의의 모든 강의

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