지난 클래스의 상속(Inheritance)에 대한 포스팅에 이어,
상위 클래스(SuperClass) 내 포함된 기능을 '커스텀'하여 사용할 수 있는 방식인
오버라이드(Override)방식에 대해 살펴보도록 하겠습니다.
상속받은 하위 클래스에서 새로운 메서드를 만드는 방법
완전히 새로운 메서드를 만들거나, 오버라이딩(Overriding)을 활용하거나
상위 클래스에서 상속을 받은 하위클래스는
정확한 기능과 원하는 작업을 위해 자신만의 메서드를 만들 수 있습니다.
방식은 크게 2가지로 구분됩니다.
(지난 포스팅에서 다룬 Aniamls 상위 클래스를 예시로 재 활용하도록 하겠습니다)
class Animals {
var name: String?
var age: Int?
func sound(name: String) -> String {
return ("\(name)은 컹컹컹 하고 소리를 냅니다.")
}
}
첫 번째, 새로운 이름의 메서드를 생성
- 상위클래스 'Animals'는 다음과 같습니다.
- Animals(상위 클래스)는 프로퍼티 2개(name, age), 메서드 1개(sound)를 가집니다.
- 하지만, 새로 생성하고자 하는 하위클래스에서 새로운(New!) 메서드를 만들고자 합니다.
- 상위클래스에 포함된 메서드(sound)이외, signitureSound란 메서드를 만들고자 합니다.
- 그래서, 상속받은 이후에 내부에 완전히 새로운 이름의 메서드를 아래와 같이 선언합니다.
class Cow: Animals {
var nickname: String? // 새로운 프로퍼티(속성) 생성
// signitureSound라는 메서드를 새롭게 생성
func signitureSound(repeatTime: Int) -> String {
return ("\(repeatTime)시간마다 음메 하고 소리를 냅니다.")
}
}
두 번째, 오버라이딩(Overriding) 활용
- 그런데, 이미 상위클래스에 유사한 'sound'란 메서드가 존재합니다.
- 기존에 존재하는 sound란 메서드를 재 정의, 새로운 버전의 메서드를 만들 수 있습니다.
- 이러한 경우, 반드시 override 란 키워드를 해당 메서드 앞에 붙입니다.
class Cow: Animals {
var nickname: String?
// 이렇게, 상위클래스의 메서드를 그대로 상속받기 위해선
// 앞에 'override'란 키워드가 붙어야 함
override func sound(name: String) -> String {
return ("\(name)은 음메 하고 소리를 냅니다.")
}
}
- 또한, 기존 하위클래스에서 오버라이딩 된 메서드를 별도로 호출할 수도 있습니다!
- 이는, 코드의 중복을 없앨 수 있는 중요한 역할을 수행합니다.
- 기존 메서드(즉, 오버라이딩 된 고유 메서드) 앞에 super. 란 키워드를 붙입니다.
class Cow: Animals {
var nickname: String?
// 이렇게, 상위클래스의 메서드를 그대로 상속받기 위해선
// 앞에 'override'란 키워드가 붙어야 함
override func sound(name: String) -> String {
super.sound(name: name)
return ("\(name)은 음메 하고 소리를 냅니다.")
}
}
var myCow: Cow = .init()
myCow.sound(name: "워낭이")
// "워낭이는 컹컹컹 하고 소리를 냅니다."
// "워낭이는 음메 하고 소리를 냅니다"
// 조금 이상하지만, 상위 클래스에서 선언한 메서드도 함께 선언이 되었다.
상속된 하위클래스에서 기존 클래스로부터 파생된 기능(메서드)을 활용하는
오버라이딩(Overriding)에 대해 살펴보았습니다.
다음 포스팅은 클래스와 비슷하지만, 많은 차이점이 존재하는
구조체(Struct)에 대한 내용을 설명하도록 하겠습니다.
'iOS > Swift' 카테고리의 다른 글
[iOS/Swift] 약속을 위한 청사진(Blueprint), 프로토콜(Protocol) (0) | 2023.03.05 |
---|---|
[iOS/Swift] Swift에서의 구조체(Struct), 값 타입과 참조 타입의 비교 (0) | 2023.02.22 |
[iOS/Swift] 클래스의 계층구조, 상속(Inheritance)의 개념과 활용 (0) | 2023.02.13 |
[iOS/Swift] 간단하게 알아보는 프로퍼티(Property)의 유형 (0) | 2023.02.12 |
[iOS/Swift] 클래스(Class)의 선언과 구성요소 파악하기 (1) | 2023.01.31 |
댓글