Swift의 메서드는 세 가지 종류로 나뉘어 집니다.
그리고 이 셋을 코드로 표현해보면 다음과 같습니다.
class SwiftMethod {
// Instance
func instanceMethod() {
}
// static
static func staticMethod() {
}
// class
class func classMethod() {
}
}
Instance 메서드와 나머지 두 메서드는 무엇이 다를까요?
바로 해당 메서드가 타입과 생성자 중 어느 것과 연관이 있는지 입니다.
결론부터 말하자면
Instance 메서드는 생성자와,
Static과 Class 메서드는 타입과 연관이 있습니다.
예를 들어, 위의 instanceMethod()에 접근하고자 한다면
let testInstance = SwiftMethod()
testInstance.instanceMethod()
그러나 staticMethod() 와 classMethod()에 접근하고자 한다면
SwiftMethod.staticMethod()
SwiftMethod.classMethod()
그렇다면, Static 과 Class는 어떠한 차이점을 가질까요?
그 전에 먼저 Static 이란 무엇일까요?
Static 이란?
: class, struct의 property나 method에 사용되며, static 키워드가 붙으면 override 할 수 없다.
Swift는 인스턴스의 프로퍼티, 메소드가 아니라 타입에 속하는 프로퍼티와 메소드를 만들 수 있게 하였습니다.
이는 공유되는 데이터를 사용할 수 있게하여 데이터를 의미있게 구성하는데 도움이 됩니다.
Swift는 이러한 공유 프로퍼티를 "static properties"라고 부르며
"static" 이라는 키워드 하나만으로 간단히 공유 프로퍼티로 만들 수 있습니다.
예를 들어,
다음과 같이 TaylorFan 타입은
favoriteSong이라는 static 프로퍼티와
name, age 라는 non-static 프로퍼티를 가집니다.
다음과 같이 TaylorFan 타입인 fan 인스터스를 만들 수 있습니다.
TaylorFan 타입의 인스터스들은
non- static 프로퍼티인 name과 age는 모두 다르지만
static 프로퍼티인 favoriteSong 은 모두 같습니다.
따라서 TaylorFan 타입의 static 프로퍼티인 favoriteSong은
TyalorFan의 인스턴스인 fan에 속하지 않고 TaylorFan이라는 타입 그 자체에 속하는 것입니다.
그러나 이 static은 override가 불가합니다.
따라서 Swift에서는
override가 가능한 class 메소드를 추가하였습니다.
예를 들어
class Person {
static var count: Int {
return 250
}
class var averageAge: Double {
return 30
}
}
여기 static 프로퍼티인 count와 class 프로퍼티인 averageAge 를 가지는 Person 타입이 있습니다.
class Student: Person {
override class var averageAge: Double {
return 19.5
}
}
그리고 이 Person 타입을 상속하는 student 클래스가 있습니다.
이 때 class 프로퍼티인 averageAge만 override가 가능하기 때문에 Student 타입에서만 averageAge는 19.5입니다.
struct와 class가 가지는 다양한 차이점 중 override가 있습니다.
struct는 override가 불가하고, class는 가능합니다.
따라서 struct에서는 class메소드를 사용할 수 없습니다.
class 메소드가 override를 가능하게하기 위해 만들어진 것이기 때문에 굳이 사용할 필요가 없기도 하지요.
그래서 정리를 하자면
static메소드는 struct, class 두 가지 모두에서 사용이 가능하지만
class메소드는 class에서만 사용이 가능하다는 차이점이 있습니다.
참고 - Swift의 static 메서드와 class 메서드
참고 - static-properties-and-methods