우선 명칭부터 정리하자면 함수와 메서드 둘 다 Func 키워드를 쓰지만
func someFunc{
//some code
}
class someClass{
func someMethod{
//some code
}
}
함수는 전역이든 지역이든 독립적인 기능을 수행하도록 하는 것이고
메서드는 클래스나 구조체, 열거형에 포함되어 사용한다면 함수가 아니라
메서드라 부른다.
음흠 이걸 메서드라 부르구나 그럼 메서드의 특징은 뭘까?
Method는 우선 두 가지로 나눌 수 있다.
하나는 인스턴스 메서드(Instance Method)
다른 하나는 타입메서드(Type Method) 이다.
class someClass{
func someMethod{
//some code
}
}
인스턴스 메서드란 인스턴스와 관련된 메서드로
인스턴스를 생성해야만 호출이 가능하다.
위 예제 처럼 일반적으로 사용하는 메서드를 인스턴스 메서드이며
호출하기 위해선 아래 와 같이 나타낸다.
let some: someClass = someClass()
some.someMethod()
일반적으로 우리가 사용하는 수식어가 없는 Func 선언을 인스턴스 메서드라 부르며 인스턴스를 생성해야만 호출할 수 있다.
Type에 관한 메서드로 인스턴스 생성없이 Type만 알면 호출이 가능하다.
메서드 선언시 static 이나 class 키워드를 붙여 선언할 수 있다.
class SomeClass {
static func someTypeMethod() {
}
class func someOverridableTypeMethod() {
}
}
예제 코드와 같이 static 과 class를 붙여 선언하며
SomeClass.someTypeMethod()
SomeClass.someOverridableTypeMethod()
인스턴스 생성을 하지 않고 .(dot)을 이용해 바로 호출 할 수 있다.
그렇다면 타입메서드를 선언할 때 붙이는 Static과 Class의 차이점은 무엇일까
class SomeChildClass: SomeClass {
override static func someTypeMethod() {
// compile error
}
override class func someOverridableTypeMethod() {
// OK
}
}
위 예제처럼 override를 할 수 있냐 아니냐의 차이가 있다.
class someWater {
let name = "TamSaaSoo" // 저장 프로퍼티
static let alias = "SamDasoo" // 저장 타입 프로퍼티
static func sayHello() {
print(name) // error!
print(alias)
}
}
class 안에 name이라는 저장 프로퍼티와 alias라는 저장 타입 프로퍼티가 있을 때 타입 메서드안에 인스턴스 프로퍼티를 호출하려고 하면 에러가 난다.
왜 그럴까?
인스턴스가 생성되어야만 접근할 수 있는 프로퍼티이기에 접근이 불가능 한 것이고
타입 프로퍼티는 타입 메서드와 같이 애초에 인스턴스를 생성할 필요가 없기 때문에 에러가 나지 않는다.
class someWater {
let name = "TamSaaSoo"
static let alias = "SamDasoo"
func sayHello() {
print(name)
print(someWater.alias)
}
}
또한 인스턴스 메서드에서 타입 프로퍼티를 호출하려면 타입 이름을 알면 접근이 가능하여 'name' 프로퍼티와 'alias' 타입 저장 프로퍼티 모두 호출이 가능하다.
출처:
https://babbab2.tistory.com/122
https://zeddios.tistory.com/233
https://stackoverflow.com/questions/24133879/what-are-the-differences-between-functions-and-methods-in-swift