Programming/Swift(iOS)

Swift 상속

홍열 2021. 4. 3. 00:00
728x90

일반적인 상속은 다른 곳에서 많이 다루니, 여기서는 상속에서 좀 특이한것들 다뤄볼까 합니다.

 

static 메서드, 프로퍼티는 상속 가능할까?

class Car {
    static func foo() {
        print("Car foo")
    }
}

class Truck:Car {
    override static func foo() {
        print("Truck foo")
    }
}

위와 같이 쓰게 되면 "Cannot override static method" 를 발생 시킵니다. 

static method는 상속이 불가능하다는 메세지입니다.

 

이 문제를 해결하기 위해서는 "class" keyword를 사용하면 됩니다. 

class Car {
    class func foo() {
        print("Car foo")
    }
}

class Truck:Car {
    override class func foo() {
        print("Truck foo")
    }
}

let truck = Truck()
Car.foo()
Truck.foo()

 

self vs Self

 

위 두개의 차이점은 뭘까요?

 

self : class의 인스턴스의 self

Self : class의 Self, 자기 자신에 대한 동적 클래스 

       -> 타입에 대한 정보를 실행시간에 동적으로 접근 가능하다. 

 

각 Class의 name을 return해주는 프로퍼티가 있다고 해봅시다. 

Car에서 class 프로퍼티이며, Truck에서도 이 class 프로퍼티를 상속 구현해줘야합니다.

class Car {
    class var name:String {
        return "Car"
    }
}

class Truck:Car {
    override class var name:String {
        return "Truck"
    }
}

print(Car.name)
print(Truck.name)

번거롭습니다. 매번 클래스 생성시에 구현을 해줘야합니다. 

상속하기때문에 부모 클래스에만 name을 두고, 생성되는 객체의 타입에 따라서 출력하고 싶으면 어떻게 해야될까요?

 

이때 사용되는 것이 "Self"입니다. 

 

class Car {
    class var name:String {
        return "\(Self.self)"
    }
}

class Truck:Car {
}

print(Car.name) //Car
print(Truck.name) //Truck