Swift로 개발을 할 때 함수를 많이 사용하는데, 이 함수의 종류는 크게 세가지이다.
함수 앞에 붙는 키워드에 따라서 인스턴스(instance) / 클래스(class) / 스태틱(static) 세 종류로 나뉜다.
class Sokyte {
func sokyteInstanceFunc() { }
class func sokyteClassFunc() { }
static func sokyteStaticFunc() { }
}
첫번째 형태를 많이 보았을텐데 평소에 많이 사용하는 함수가 바로 instance 함수이다.
class func vs static func
공통점
두가지 함수의 공통점은 타입 메소드라는 점이다.
두가지 모두 클래스의 객체가 아닌 클래스 그 자체와 연관이 되어 있다. 그러므로 () 생성자로 인스턴스를 생성하지 않아도 클래스 이름으로 바로 접근할 수 있다.
Sokyte.sokyteClassFunc()
Sokyte.sokyteStaticFunc()
차이점
차이점은 클래스와 클래스가 아닌 것에서 비롯된다.
✔️ class 함수의 경우는 오버라이드가 가능하지만,
✔️ static 함수의 경우는 (클래스가 아니기 때문에) 오버라이드가 불가하다.
그래서 위와 같이 오버라이드가 불가한 것을 확인할 수 있고,
같은 맥락으로 상속이 불가능한 구조체/열거형에서 class func 을 정의하면 에러가 발생한다.
결론은 ~~ static func은 상속을 받지 못한다 !!! 는 것이다.
그런데 class에서도 상속을 하지 못하도록 막을 수 있는 final 키워드가 있다. 즉, final class func 과 static func은 같은 역할을 한다.
class Sokyte {
func sokyteInstanceFunc() { }
class func sokyteClassFunc() { }
static func sokyteStaticFunc() { }
}
class Huree: Sokyte {
override final class func sokyteClassFunc() {
print("후리바봉")
}
}
class Taekki: Sokyte {
override static func sokyteClassFunc() {
print("태끼바봉")
}
}
Sokyte를 상속 받은 Huree 와 Taekki 클래스에 해서 클래스 함수를 오버라이드 할 때, 두 함수 각각 final 키워드와 static 키워드를 통해서 상속할 수 없도록 만들수 있다.
그렇다면 ... swift에서 언제 static 메서드를 사용할까? .. 라는 질문은 곧 static 키워드를 언제 사용하는가?로 이어질 수 있다.
간단하게 위에서 살펴본 것으로는 static와 class 키워드의 차이점은 상속 받을 때 오버라이드를 할 수 있다/없다로 말할 수 있다.
언제 static을 사용하는가?
swift에서 static 키워드를 사용하는 경우는
🍋 (타입 메서드/타입 프로퍼티라는 이름에서 알 수 있는 것처럼) 해당 메서드나 프로퍼티가 instance 보다는 type 자체와 연관되리 때 사용한다.
인스턴스가 아닌 타입으로서 정의된 속성과 메서드를 언제 사용할까?
static property
우리가 보통 .. static 키워드를 언제 사용하는가?를 보게 되면 .. 색상/폰트와 같이 프로젝트 전역적으로 사용하는 상수를 지정할 때 많이 사용한다. 즉, 자주 변하지 않고 전역 변수처럼 공통으로 관리하는 공용 자원의 경우에 static property를 사용한다.
또는 자주 재사용되고 생성 비용이 많이 드는 object를 미리 만들어놓고 계속 쓰면서 효율성을 높일 때 사용한다.
(ex, dateformatter 등과 같이)
static method
static 함수의 경우는 팩토리 패턴 등을 구현할 때 자주 사용한다.
'Swift' 카테고리의 다른 글
[Swift] Anti Pattern이 뭐고? (0) | 2022.10.13 |
---|---|
[Swift] static을 언제 쓰는데? (1) | 2022.10.12 |
URLSession (개념) (0) | 2022.09.01 |
Codable (0) | 2022.08.31 |
Type Casting Up? Down? (2) | 2022.08.19 |