본문 바로가기

iOS 앱 개발자 프로젝트/Swift 문법 정복하기

[Swift] Inheritance & Override (2)

상속(Inheritance)으로 물려받은 행동(method)을 수정할 수 있는 Override에 대하여 공부하고,

Inheritance 핵심 개념을 복습합니다.

 

Override에서 final 로 선언하면 자식 클래스가 Override하는 것을 막을 수 있다는 것도 익혀둡니다.


Override

 

        • 상속받은 상태와 행동을 수정할 수 있다. 즉, 자식 클래스는 부모 클래스로부터 상속 받은 property나 method 그대로 사용하지 않고 자신만의 기능으로 변경하여 사용할 있다. 이를 재정의Override  한다.
        • override 키워드는 swift 컴파일러가 조상 클래스(부모 포함 상위 부모 클래스)에 해당 프로퍼티나 메서드 등이 있는지 확인한 후 재정의 하는데 만약 조상클래스에 해당 특성이 없다면, 컴파일 에러가 발생한다.
        • Final로 선언하면 자식 클래스가 override하는 것을 막을 수 있다.
        • 다형성이 있어 실제 타입과 참조 타입을 다르게 할 수 있고 코드의 유연성과 재사용성을 높여준다.

다형성(Polymorphism) 

 

▷ Overriding

슈퍼 클래스를 상속받는 여러 서브 클래스들이 같은 이름이지만 다른 기능을 하는 메소드를 정의하고 사용할 수 있으며 이를 메소드 오버라이딩이라고 한다. Vehicle이라는 슈퍼 클래스가 존재하고, 서브 클래스인 Car와 Bicyle이 있다고 가정할 때, Vehicle은 ride()라는 메소드가 존재하고, 두 자식 클래스도 ride()라는 메소드를 가지고 있지만, 각각 overriding을 통하여 차는 엑셀을 밟는다, 자전거는 페달을 밟는다라고 맞게 변경할 수 있는 것과 같다.

 

Overloading

동일한 이름의 메소드가 매개변수의 이름, 타입, 개수 등의 차이로 인해서 다르게 움직이는 것을 의미한다.

 


import Foundation

class Animal {
    var name: String
    var age: Int
    
    init(name: String, age: Int) {
        self.name = name
        self.age = age
    }
    
    func speak() {
        print("...")
    }
}


class Human: Animal {
    var job: String
    
    init(name: String, age: Int, job: String) {
        self.job = job
        super.init(name: name, age: age)
    }
    
    override func speak() {
        print("Hello, world!")
    }
}

let someone: Animal = Human(name: "Park", age: 25, job: "Developer")

someone.speak()

// someone.job() 을 호출하면 compile error 가 뜨는데, job 은 Human에 저장되어 있지만 실제로 Animal 을 바라보고 있기 때문에 안된다.

someone.name()
someone.age()

// 이에 반해 위의 두 호출은 에러가 나지 않는다. 
// 타입은 부모 클래스로 저장되어 있어도 메소드를 호출하면 실제 타입의 메소드가 호출된다. 이에 반해 위 처럼 상태는 접근할 수 없다.

class Dog: Animal {
    override func speak() {
        print("")
    }
}

class Cat: Animal {
    
}

/// 말을 하게 만드는 함수
func makeSpeak(human: Human) {
    human.speak()
}

func makeSpeak(dog: Dog) {
    dog.speak()
}

func makeSpeak(cat: Cat) {
    cat.speak()
}


func makeSpeak(animal: Animal) {
    animal.speak()
}​

 

 

Inheritance (Review)

 

객체 지향 세계에서 객체들은 관계를 맺고 서로 협력하여 기능을 완성한다.


상속은, 관계의 한 종류로,

부모의 상태와 행동을 물려 받을 수 있다.

부모-자식, SuperClass - SubClass 관계가 맺어진다.

(생물학적 부모가 그러하듯) 단 한 개의 부모만 가질 수 있다. (다중 상속 불가!)