본문 바로가기

스위프트

스위프트 튜토리얼(10) - Class, 클래스(2)

youtu.be/Ulp1Kimblg0?t=5915

이 포스팅은 위 영상을 보고 작성한 포스팅이다. (01:27:16~01:38:36)

 

저번에 배운 클래스를 더 배워보도록 하자. 이번에는 inheritance, 우리말로는 상속이라는 것을 배워보자.

 

일단 Car라는 클래스를 만들어보자.

class Car{
    var topSpeed = 200
    
    func drive() {
        print("Driving at \(topSpeed)")
    }
}

참고로 문자열 안에 변수나 상수의 값을 넣으려면 \()와 같은 형태로, 괄호 안에 넣으면 된다

 

위 클래스를 통해서 객체도 생성해보자.

let myRide = Car()
myRide.topSpeed // 200
myRide.drive() // "Driving at 200" 출력

 

Futurecar라는 클래스를 만들어보자. 이 Futurecar는 위에서 만들었던 Car클래스에 나는 기능이 추가되었다고 생각하면 된다. 클래스를 통해 객체까지 만들어보자.

class Futurecar{
    var topSpeed = 250
    
    func drive(){
        print("Driving at \(topSpeed)")
    }
    
    func fly(){
        print("Flying")
    }
}

let myNewRide = Futurecar()

Car 클래스랑 비교해보았을 때 유사한 점이 보일 것이다. 코드의 중복이 보인다면 이제 상속이라는 개념을 알아야 할 때이다.

 

Futurecar는 Car의 기본 기능을 상속받아서 기존 Car의 기능을 유지하고 새로운 기능을 추가할 수 있다.

여기서 Car는 Futurecar의 SuperClass라고 불린다. Futurecar는 Subclass라고 불린다.

 

 

이제 상속이라는 것을 이용해서 Futurecar라는 클래스를 만들어보겠다.

 

일단 아래 코드를 보도록 하자.

class Futurecar : Car{    
    func fly(){
        print("Flying")
    }
}

let myNewRide = Futurecar()
myNewRide.drive() // Car의 함수
myNewRide.topSpeed // Car의 propety

 

Futurecar에 ":  Car"를 적음으로 써 Futurecar는 Car를 상속받게 된다.

Car를 상속함으로써 Futurecar는 Car의 기능을 사용할 수 있다. 그리고 fly 기능까지 사용할 수 있다.

 

그런데 여기 문제가 하나 있는데 Futurecar는 속도가 Car보다 빨라야 된다는 것이다. 즉, topSpeed가 200이 아닌 250이 되어야 한다. 

위에 상속받은 채로 Futurecar를 사용하면 topSpeed가 200밖에 될 수 없다. 여기서 overriding이라는 것을 사용해야 한다. 바로 예시를 보도록 하자.

class Futurecar : Car{    
    override func drive(){
        print("Driving at \(topSpeed + 50)") // override
    }
    func fly(){
        print("Flying")
    }
}

let myNewRide = Futurecar()
myNewRide.drive() // override한 drive함수가 동작, 250 출력

drive라는 함수를 Futurecar Class에서 다시 정의하고 있는데 func 왼쪽에 보면 override라고 적힌 것을 볼 수 있다.

즉, SuperClass에 있는 drive함수를 다시 정의하는 것을 override라고 하고 func 왼쪽에 표시해주면 된다.

 

override한 함수에서 SuperClass의 함수를 호출하는 것도 가능하다. super.함수() 형태로 작성하면 된다. 다음 예시를 보도록 하자.

class Futurecar : Car{    
    override func drive(){
        super.drive() // super class의 drive() 실행
        print("and rockets boosting at \(topSpeed + 50)")
    }
    func fly(){
        print("Flying")
    }
}

 

상속을 활용하여 중복되는 코드를 많이 줄일 수 있고, 코드 정리도 쉽게 할 수 있다.