메서드는 타입 메서드(Type Method), 인스턴스 메서드(Instance Method)로 나뉜다. 이 중에서 메서드의 구현 부 앞에 static
, class
키워드가 붙는 경우는 타입 메서드에 속한다.
타입 메서드란 클래스나 구조체의 타입에 참조해서 사용할 수 있는 메서드를 말한다.
1
2
3
4
5
6
7
8
9
10
11
12
class Dog {
static func bite() { }
class func run() { }
}
// 위와 같이 클래스나 구조체 내부에서 메서드 앞에 static, class를 붙여 타입 메서드로 선언한다.
Dog.bite()
Dog.run()
// 타입 메서드는 인스턴스를 생성할 필요 없이 타입에 바로 참조하여 사용한다.
그렇다면 static 과 class는 어떤 차이가 있을까? 결론부터 말하자면 이것은 상속
과 관련이 있다.
static 키워드의 경우 상속 시 재정의가 불가능하고, class 키워드의 경우 상속 시 재정의가 가능하다. 여기서 “구조체는 상속 관계를 가질 수 없는데?” 라는 의문이 들었는데, 역시나 구조체에서는 static 키워드로만 타입 메서드를 정의할 수 있다.
1
2
3
4
5
6
struct Cat {
static func ggookggook() { }
//class func haak() { } -> X
}
정리해보자면, 구조체에서는 static 키워드로만 타입 메서드를 구현할 수 있고, 클래스에서는 하위 클래스에서 해당 메서드를 재정의(override) 할 수 있는지 여부에 따라 static(재정의 불가), class(재정의 가능) 으로 나뉘게 된다.