코틀린에서는 메서드를 따로 구분짓지 않았던 것 같은데 Swift에서는 메서드가 두 가지로 나뉜다고 한다.
- 인스턴스 메서드(Instance Method)
- 타입 메서드(Type Method)
이 두 가지 메서드에 대해 알아두려고 한다.
1. 인스턴스 메서드(Instance Method)
class Swift {
func printHello() {
print("Hello")
}
}
위 코드를 보면 그냥 일반적인 형태의 클래스와 그 아래 메서드를 확인할 수 있다.
이처럼 아무런 수식언이 없이 func를 통해 선언한 메서드를 인스턴스 메서드라고 한다.
인스턴스 메서드를 호출하기 위해서는 우선 인스턴스가 필요하다.
인스턴스 생성 후 .(dot) 문법을 통해 메서드를 호출할 수 있다.
let swift = Swift()
swift.printHello()
// Hello
즉, 인스턴스 메서드는 인스턴스를 생성해야만 이를 통해 메서드에 접근이 가능하다.
2. 타입 메서드(Type Method)
이름에서부터 알 수 있듯이 타입에 관련되어 있다.
func 키워드 앞에 static 혹은 class를 붙여 생성한 메서드를 타입 메서드라고 한다.
class Swift {
static func printHello() {
print("Hello")
}
class func printWorld() {
print("World")
}
}
인스턴스 메서드를 호출할 때와는 다르게 인스턴스를 생성할 필요가 없다.
또한 인스턴스를 통해 메서드를 호출하려고 하면 에러가 발생한다.

타입 메서드를 호출하기 위한 방법은 호출하고자 하는 메서드의 타입에 바로 메서드를 호출해버리는 것이다.
Swift.printHello() // Hello
Swift.printWorld() // World
타입 메서드에는 static 혹은 class를 붙인다 하였는데, 이 두 방식에는 메서드 오버라이딩 여부라는 차이가 있다.
static을 붙여 타입 메서드를 생성 시 다른 SubClass에서 오버라이딩이 금지된다.
class를 붙여 생성한 타입 메서드는 다른 SubClass에서 오버라이딩이 허용된다.

최상위에서 공통적으로 사용되는 기능에 대해서는 static을 통해 생성하면 될 것 같고, 각 객체마다의 동작이 달라 수정이 필요하다면 class를 통해 생성하면 될 것으로 보인다.
3. 인스턴스 메서드와 타입 메서드의 멤버 접근 범위
class Swift {
let text = "Hello"
static let text2 = "World"
}
이처럼 저장 프로퍼티와 저장 타입 프로퍼티가 있을 때, 인스턴스 메서드와 타입 메서드는 이 두 프로퍼티들에 접근이 가능한가를 보려 한다.

위 결과를 보면 알 수 있듯이, 인스턴스 메서드에서는 저장 프로퍼티를 사용하는 것은 가능하지만, 저장 타입 프로퍼티는 사용하지 못한다는 것을 볼 수 있다. 하지만 저장 타입 프로퍼티가 속한 객체를 통해 접근이 가능하다.
타입 메서드의 경우 저장 프로퍼티에는 접근이 불가능하지만, 저장 타입 프로퍼티에는 접근이 가능하다.
어렵게 생각할 필요없이 단순하게 접근해보면 된다.
저장 프로퍼티는 인스턴스 멤버이다. 즉, 인스턴스와 관련된 멤버이므로 인스턴스 메서드에서는 사용할 수 있지만, 타입 메서드에서는 사용이 불가능한 것이다.
저장 타입 프로퍼티의 경우 같은 타입 멤버는 타입 이름 없이도 접근이 가능하다.
즉 print(text2)와 print(Swift.text2)가 동일한 것이다.
댓글