[swift] Swift에서 클래스의 타입 확인

Swift에서는 다양한 방법으로 클래스의 타입을 확인할 수 있습니다. 이러한 클래스 타입 확인은 개발 중에 특정 객체의 타입을 알아내는 데 유용하며, 유효성 검사나 조건문 등에서 활용될 수 있습니다.

1. 타입 확인 연산자 (Type Check Operator)

Swift에서는 is 연산자를 사용하여 객체의 타입을 확인할 수 있습니다. is 연산자는 왼쪽 객체가 오른쪽 타입과 일치하는지 여부를 판단합니다.

class Person {
    var name: String
    init(name: String) {
        self.name = name
    }
}

class Student: Person {
    var school: String
    init(name: String, school: String) {
        self.school = school
        super.init(name: name)
    }
}

let john = Person(name: "John")
let jane = Student(name: "Jane", school: "ABC School")

print(john is Person)    // true
print(john is Student)   // false

print(jane is Person)    // true
print(jane is Student)   // true

위의 예제에서 john 객체의 타입은 Person이므로 john is Persontrue를 반환합니다. 반면에 john is Studentfalse를 반환합니다.

jane 객체의 경우 Person 클래스를 상속받았기 때문에 Person의 타입에도 해당되지만, Student 클래스의 타입에도 해당되므로 jane is Personjane is Student 모두 true를 반환합니다.

2. 다운캐스팅 (Downcasting)

다운캐스팅은 슈퍼클래스 타입의 객체를 서브클래스 타입으로 변환하는 작업입니다. 다운캐스팅은 as? 또는 as! 연산자를 사용하여 수행할 수 있습니다.

let persons: [Person] = [Person(name: "Alice"), Student(name: "Bob", school: "XYZ School")]

for person in persons {
    if let student = person as? Student {
        print("\(person.name) is a student of \(student.school)")
    } else {
        print("\(person.name) is not a student")
    }
}

위의 예제에서 persons 배열은 Person 타입의 객체와 Student 타입의 객체를 포함하고 있습니다. for-in 루프를 통해 배열의 요소들을 탐색하면서, 각각의 객체를 as? 연산자를 사용하여 Student로 다운캐스팅할 수 있습니다. 다운캐스팅에 성공한 경우에는 해당 학생의 이름과 학교를 출력하고, 실패한 경우에는 그냥 “is not a student”라는 메시지를 출력합니다.

3. 타입 체크 및 다운캐스팅 동시에 수행하기

as?as! 연산자를 사용하여 클래스의 타입을 체크하고 동시에 다운캐스팅을 수행할 수도 있습니다.

let persons: [Person] = [Person(name: "Alice"), Student(name: "Bob", school: "XYZ School")]

for person in persons {
    if let student = person as? Student {
        print("\(person.name) is a student of \(student.school)")
    } else if let nonStudent = person as? Person {
        print("\(person.name) is not a student")
    }
}

위의 예제는 Student 타입과 Person 타입을 체크하고 동시에 다운캐스팅하는 방법을 보여줍니다. person 객체를 as? 연산자를 통해 Student로 다운캐스팅하려고 시도합니다. 다운캐스팅에 성공한 경우에는 해당 학생의 이름과 학교를 출력하고, 실패한 경우에는 nonStudent 상수를 활용하여 그냥 “is not a student”라는 메시지를 출력합니다.

마무리

Swift에서 클래스의 타입을 확인하는 방법에 대해 알아보았습니다. is 연산자와 as?, as! 연산자는 클래스 타입 확인과 다운캐스팅을 위한 강력한 도구로, 객체의 타입을 정확하게 파악하고 처리할 수 있게 도와줍니다. 프로젝트에서 필요에 따라 적절한 방법을 선택하여 활용해보세요.

참고 자료