타입 메서드 Type Methods
타입 메서드는 타입 프로퍼티에서 알아봤던 것처럼 static
키워드를 사용한다. 메서드는 특정 타입의 인스턴스에 호출되는 메서드이고, 타입 자체에서 호출되는 메서드를 정의할 수 있다. 이런 종류의 메서드를 타입 메서드라고 한다.
인스턴스 메서드와 동일하게 func
키워드를 사용하며, 이 앞에 static
키워드를 작성하여 타입 메서드를 나타낸다.
타입 프로퍼티와 마찬가지로 클래스는 class
키워드를 사용하여 하위 클래스가 슈퍼클래스의 해당 메서드 구현을 override
(재정의)할 수 있도록 할 수 있다.
타입 메서드는 인스턴스 메서드처럼 . 구문으로 호출되지만, 인스턴스로 메서드를 호출하는 것이 아닌 타입으로 호출한다.
class AClass {
static func firstTypeMethod() {
}
class func secondTypeMethod() {
}
}
//AClass의 인스턴스를 생성하지 않고 바로 타입을 통해 메서드 호출 가능
AClass.firstTypeMethod()
AClass.secondTypeMethod()
주의할점은 static
로 정의하면 상속 후 메서드 재정의가 불가능하고 class
로 정의하면 상속 후 메서드 재정의가 가능하다는 점이다.
class AClass {
static func staticTypeMethod() {
print("AClass staticTypeMethod")
}
class func classTypeMethod() {
print("AClass classTypeMethod")
}
}
class BClass: AClass {
override static func staticTypeMethod() {
// error 재정의가 불가함
}
override class func classTypeMethod() {
print("BClass classTypeMethod")
}
//AClass의 인스턴스를 생성하지 않고 바로 타입을 통해 메서드 호출 가능
AClass.staticTypeMethod() //AClass staticTypeMethod
AClass.classTypeMethod() //AClass classTypeMethod
BClass.classTypeMethod() //BClass classTypeMethod
class Person {
var age: Int = 10
var height: Double = 130.5
func display() {
print("나이: \(age)살, 신장: \(height)")
}
class func classTypeMethod() { //override 재정의 가능
print("classTypeMethod")
}
static func staticTypeMethod() { //override 재정의 불가능
print("staticTypeMethod")
}
}
var Seogun: Person = Person()
Seogun.display()
//Seogun.classTypeMethod는 Seogun이 인스턴스이기 때문에 아무키워드가 없는 func 메서드만 가능하다
Person.classTypeMethod()
Person.staticTypeMethod()
타입 메서드는 인스턴스 메서드와 달리 self
프로퍼티는 해당 타입의 인스턴스가 아닌, 타입 '자체'를 참조한다.
인스턴스 메서드에서의 self
➜ 인스턴스를 가리킴
타입 메서드에서의 self
➜ 타입을 가리킴
struct SystemVolume {
//타입 프로퍼티를 사용하면 언제나 유일한 값이 된다.
static var volume: Int = 3
//타입 메서드
static func mute() {
self.volume = 0 //self는 SystemVolume.Type을 의미함
//SystemVolume.volume = 0 과 같은 표현
}
}
class Navigation {
var volume: Int = 3
func guideWay() {
SystemVolume.mute()
}
func finishGuideWay() {
SystemVolume.volume = self.volume //self는 Navigation의 volume을 의미함
}
}
SystemVolume.volume = 5
let myNavigation: Navigation = Navigation()
myNavigation.guideWay()
print("시스템 음량 : \(SystemVolume.volume)") //시스템 음량 : 0
myNavigation.finishGuideWay()
print("시스템 음량 : \(SystemVolume.volume)") //시스템 음량 : 3
읽어주셔서 감사합니다 🤟
'SWIFT > Grammar' 카테고리의 다른 글
Swift : 기초문법 [인스턴스 #2 기본 이니셜라이저, 멤버와이즈 이니셜라이저] (0) | 2022.01.15 |
---|---|
Swift : 기초문법 [인스턴스 #1 이니셜라이저, 매개변수) (0) | 2022.01.15 |
Swift : 기초문법 [메서드 #2 mutating] (0) | 2022.01.14 |
Swift : 기초문법 [메서드 #1 인스턴스 메서드, self 프로퍼티] (0) | 2022.01.13 |
Swift : 기초문법 [프로퍼티#5 - 키 경로 KeyPath] (0) | 2022.01.10 |