본문 바로가기

Swift

[Swift] class func VS static func

728x90

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