Swift의 static 메서드와 class 메서드

Swifty
4 min readJun 25, 2016

스위프트에서는 세 가지 종류의 메서드가 있습니다.

하나는 인스턴스에 할당되는 인스턴스 메서드(instance method), 두 번째로는 static 메서드, 그리고 마지막으로는 class 메서드입니다.

인스턴스는 다른 프로그래밍 언어를 접해보신 분들께는 꽤 익숙한 개념입니다. 혹시 객체지향 프로그래밍 언어를 접해보시지 않은 분들이 계실 것을 고려하여 간단히 설명드리자면, 클래스를 통해 호출할 수 없고, 클래스를 실체화 하여 생성된 인스턴스를 통해서 호출할 수 있는 메서드를 의미합니다.

그렇다면 static메서드와 class메서드는 무엇일까요?
우선 코드를 살펴보도록 합시다.

DummyClass

위 코드를 살펴보면 세 종류의 메서드가 정의되어 있습니다.

  1. instanceMethod() //인스턴스 메서드입니다.
  2. staticMethod() //static 메서드입니다.
  3. classMethod() //class 메서드입니다.

인스턴스 메서드를 호출하기 위해서 DummyClass를 dummyInstance로 인스턴스화 했습니다. 그러나, staticMethod와 classMethod를 호출하기 위해서는 클래스를 굳이 인스턴스화 하지 않고, 클래스로부터 직접 메서드를 호출할 수 있습니다.

그렇다면 이 둘의 차이는 어디서 나타나는 것일까요?

사실 이 코드에서 static 메서드와 class 메서드의 차이를 찾을 수 없습니다.

static 메서드와 class 메서드의 차이를 명확히 구분하기 위해서는 struct 혹은 enumeration을 비교해야 합니다.

일단 struct에서 class 메서드를 선언하니, 컴파일 에러가 납니다. 이는 enumeration에서도 마찬가지입니다.

여기서 몇 가지 짚고 넘어갈 것이 있는데, 우선 struct와 enumeration은 상속이 불가능합니다.
그리고 앞에서 설명한 듯이 struct와 enumeration은 class 메서드를 선언할 수 없습니다.
그리고 class 메서드는 오버라이딩이 가능합니다.

즉 class 메서드는 static 메서드를 상속할 수 있도록 만든 메서드임을 알 수 있습니다.
자바 프로그래밍 언어를 접해보셨다면 static 메서드를 오버라이딩 할 수 없다는 사실을 이미 알고 계실 것입니다. 하지만 스위프트에서는 static 메서드를 오버라이딩 할 수 있도록 별도의 class 메서드를 추가했습니다. (클래스 내에서 static 메서드와 class 메서드는 같은 의미입니다. 즉, 클래스에 한정적으로 static 메서드를 오버라이드 가능합니다.)

SwiftClass 클래스에서는 static 메서드와 class 메서드를 모두 제공하며, DrivedSwiftClass가 SwiftClass를 상속받아 static 메서드와 class 메서드를 오버라이드 하고 있습니다.
또한 앞서 말씀드린 듯이, 클래스에서는 static 메서드와 class 메서드가 동일한 개념이기 때문에 static 메서드를 class 메서드로, class 메서드를 static 메서드로 오버라이드 할 수도 있습니다.

--

--