[Swift] class func vs static func

타입 메소드 &타입 프로퍼티 알아보기

naljin
7 min readJul 7, 2020

스위프트에는 세가지 함수 종류가 있습니다. 앞에 붙는 키워드에 따라서 instance / class / static 으로 나뉩니다.

class Sample {// 1. Instance 함수
func myInstanceFunc() {}
// 2. class 함수
class
func myClassFunc() {}
// 3. static 함수
static func myStaticFunc() {}
}

아무 생각 없이 사용해왔다면 바로 그게 instance 함수였겠죠? 그럼 이제 나머지 두개를 알아보러 가봅시다.

class func vs static func

공통점

staticclass 메소드는 타입 메소드라고 불러요. 모두 class 객체보다는 class 자체와 연관되어있답니다. () 생성자를 통해서 인스턴스를 생성하지 않더라도 바로 접근이 가능합니다.

Sample.myClassFunc()Sample.myStaticFunc()

차이점

차이점은 해당 class를 상속 받은 subclass 에서 나타납니다.

class 함수 — override 가능

static 함수 — override 불가능

class SubSample : Sample {//Good!override class func myClassFunc() {}//Compile Erroroverride static func myStaticFunc() {}}

그렇기 때문에 상속이 불가능한 struct나 enum에서 class func을 정의하면 에러가 나겠죠?

static func vs final class func

오호라… static func 은 상속 못받는다고? 그럼 class func에 더 이상의 상속 막아주는 final 키워드 붙여주면 같은거 아냐?

맞아yo. 뭘 쓰냐 하는건 취향 차이입니다.

class property vs static property

아앗 잠깐.. 여기까지 온김에 프로퍼티도 짚고 가봅시다. func 앞에 static 이나 class 키워드가 붙는 것들을 타입 메소드라고 했죠? 그러면 프로퍼티 앞에 해당 키워드가 붙으면? 바로 타입 프로퍼티가 됩니다.

타입 프로퍼티는 타입 메소드와 마찬가지로 생성자 없이 바로 접근 가능하고, static, class 중 class 프로퍼티만 상속이 가능해요.

static 프로퍼티의 가장 흔한 예시는 설정(configuration)입니다. UIKit 에서 유일한 목적이 다른 object를 설정하기 위한 것인 이러한 프로퍼티를 볼 수 있죠.

주의해야할 점은 class 타입 프로퍼티 같은 경우, 연산 타입 프로퍼티(Computed type property)로 표현이 되어야 해요.

//저장 타입 프로퍼티 형태 - 컴파일 에러class var errorClassProperty: Int = 1//연산 타입 프로퍼티 형태 - 컴파일 OKclass var correctClassProperty: Int {
return 1
}

그리고 이 경우는 var 로만 선언이 가능하답니다.

//let- 컴파일 에러class let errorClassProperty: Int {
return 1
}
//var - 컴파일 OKclass var correctClassProperty: Int {
return 1
}

그래서 Type method / property 왜 쓰는데?

저는 사실 타입 메소드나 프로퍼티를 잘 안썼어요. 왜냐하면 써야할 이유를 못느껴서! 그냥 기본 인스턴스 메소드 / 프로퍼티로도 충분했거든요(아마?). 이제 왜 쓰는지 이유를 알아보도록 합시다.

본격적인 구글링 전에 지인 찬스에서 얻은 힌트는..! “정적 함수를 찾아볼 것”

staticclass 키워드의 차이점은 상속받을 때 override를 할 수 없다/있다 정도였죠? 그러면 basic 이 되는 static 키워드를 중심으로 살펴봅시다.

언제 static 을 사용하는가

Swift 에서 static 키워드를 사용하는 경우는 해당 메소드나 프로퍼티가 instance보다는 type 자체와 연관될 때 입니다. 그래서 이름도 타입 메소드, 타입 프로퍼티잖아요? 그렇다면 인스턴스(instance)가 아닌 type으로서 정의된 속성이나 메소드를 언제 사용해야 할까요?

좋은 글이 있어서 일부만 가져다 쓰려다가, 너무 내용이 좋아서 번역을 하려고 글을 따로 빼고 있어요. 만약 원저작자의 허락을 받으면 올리고 아니라면 말겠읍니다 ㅋㅎ

+) 오 허락 받음 ㄱㅅㄱㅅ 읽고 오시면 좋을 듯

요약은 아래와 같습니다.

static property

  • 자주 안 변하고 전역 변수 마냥 공통으로 관리하는 공용 자원 느낌일 때 (ex. 색상, 폰트 등)
  • 자주 재사용되고 생성 비용이 많이드는 object를 미리 만들어 놓고 계속 쓰면 효율 높일 수 있을 때 (ex. dateformatter 등)

static method

  • 간단한 factory 패턴 구현할 때

마무리

class func이랑 static func으로 시작해서 많이도 길어졌다..! 이정도면 제목을 바꿔야하나도 싶지만 처음에 시작한 의문점은 그거였으니까 그대로 가겠습니다 크크

오늘의 글도 누군가에게 도움이 되길 바라며..! (사실 나한테 제일 ㅎ) 그럼 20000!

참고

--

--