[Swift] Instance vs Static vs Class

sun02·2022년 5월 28일
0

iOS

목록 보기
21/21

Instance vs Static vs Class

Swift의 메서드는 세 가지 종류로 나뉘어 집니다.

  • Instance
  • Static
  • Class

그리고 이 셋을 코드로 표현해보면 다음과 같습니다.

class SwiftMethod {
	// Instance
	func instanceMethod() {
    }
    
    // static
    static func staticMethod() {
    }
    
    // class
    class func classMethod() {
    }
    
}
  • 기본적으로 여태까지 그냥 사용해 온 메서드가 instance 메서드이고, 그 외는 앞의 keyword 에 따라 static 또는 class로 나뉘어 지는 것을 알 수 있습니다.

1) Instance vs (static & class)

Instance 메서드와 나머지 두 메서드는 무엇이 다를까요?

바로 해당 메서드가 타입과 생성자 중 어느 것과 연관이 있는지 입니다.

결론부터 말하자면
Instance 메서드는 생성자와,
Static과 Class 메서드는 타입과 연관이 있습니다.

예를 들어, 위의 instanceMethod()에 접근하고자 한다면

let testInstance = SwiftMethod()
testInstance.instanceMethod()
  • 다음과 같이 SwiftMethod 타입의 생성자 testInstance를 생성한 후
    • 생성자인 testInstance에서 instanceMethod를 호출할 수 있습니다.

그러나 staticMethod() 와 classMethod()에 접근하고자 한다면

SwiftMethod.staticMethod()
SwiftMethod.classMethod()
  • 다음과 같이 타입인 SwiftMethod에서 바로 호출이 가능합니다.

2) Static vs Class

그렇다면, Static 과 Class는 어떠한 차이점을 가질까요?
그 전에 먼저 Static 이란 무엇일까요?

- Static

Static 이란?
: class, struct의 property나 method에 사용되며, static 키워드가 붙으면 override 할 수 없다.

Swift는 인스턴스의 프로퍼티, 메소드가 아니라 타입에 속하는 프로퍼티와 메소드를 만들 수 있게 하였습니다.
이는 공유되는 데이터를 사용할 수 있게하여 데이터를 의미있게 구성하는데 도움이 됩니다.

Swift는 이러한 공유 프로퍼티를 "static properties"라고 부르며
"static" 이라는 키워드 하나만으로 간단히 공유 프로퍼티로 만들 수 있습니다.

예를 들어,

다음과 같이 TaylorFan 타입은
favoriteSong이라는 static 프로퍼티와
name, age 라는 non-static 프로퍼티를 가집니다.

다음과 같이 TaylorFan 타입인 fan 인스터스를 만들 수 있습니다.

  • 해당 타입의 풀 네임을 사용하여 공유 프로퍼티에 접근할 수 있습니다. (TaylorFan.favoriteSong)

TaylorFan 타입의 인스터스들은
non- static 프로퍼티인 name과 age는 모두 다르지만
static 프로퍼티인 favoriteSong 은 모두 같습니다.

따라서 TaylorFan 타입의 static 프로퍼티인 favoriteSong은
TyalorFan의 인스턴스인 fan에 속하지 않고 TaylorFan이라는 타입 그 자체에 속하는 것입니다.

그러나 이 static은 override가 불가합니다.

따라서 Swift에서는

override가 가능한 class 메소드를 추가하였습니다.

- Class

예를 들어

class Person {
	static var count: Int {
    	return 250
    }
    
    class var averageAge: Double {
    	return 30
    }
}

여기 static 프로퍼티인 count와 class 프로퍼티인 averageAge 를 가지는 Person 타입이 있습니다.

class Student: Person {

	override class var averageAge: Double {
    	return 19.5
    }
}

그리고 이 Person 타입을 상속하는 student 클래스가 있습니다.
이 때 class 프로퍼티인 averageAge만 override가 가능하기 때문에 Student 타입에서만 averageAge는 19.5입니다.

- Struct vs Class

struct와 class가 가지는 다양한 차이점 중 override가 있습니다.

struct는 override가 불가하고, class는 가능합니다.
따라서 struct에서는 class메소드를 사용할 수 없습니다.

class 메소드가 override를 가능하게하기 위해 만들어진 것이기 때문에 굳이 사용할 필요가 없기도 하지요.

그래서 정리를 하자면
static메소드struct, class 두 가지 모두에서 사용이 가능하지만
class메소드class에서만 사용이 가능하다는 차이점이 있습니다.

참고 - Swift의 static 메서드와 class 메서드
참고 - static-properties-and-methods

0개의 댓글