코드를 보다 보면, class에서 static func을 자주 볼 수 있습니다. 저도 이번에 XCTest Code를 공부하다가 static func 키워드를 자주 봤는데요, 헷갈리는 부분과 static func과 func과의 차이점, static func을 사용했을 때의 이점을 위주로 정리해봤습니다!
개념
Swift에서 static은 타입의 인스턴스가 아닌 타입 자체에서 호출되는 타입 수준 메서드를 정의하는 데 사용됩니다.
즉, static 메서드는 타입의 인스턴스가 아닌 타입과 연관됩니다. 그렇기 때문에 static 메서드는 타입의 인스턴스를 먼저 생성하지 않고도 타입 자체에서 호출할 수 있습니다.
반면, static을 쓰지 않은 일반 메서드는 해당 유형의 인스턴스와 연관됩니다. 해당 유형의 인스턴스에 대해서만 인스턴스 메서드를 호출할 수 있습니다.
class MyClass {
static func staticMethod() {
print("This is a static method")
}
func instanceMethod() {
print("This is an instance method")
}
}
MyClass.staticMethod() // class 자체에서 staticMethod 호출
let myInstance = MyClass()
myInstance.instanceMethod() // class의 인스턴스에서 instanceMethod 호출
위의 예제에서 staticMethod는 클래스의 인스턴스를 먼저 생성하지 않고 클래스 자체에서 호출됩니다.
반면에 instanceMethod는 myInstance 클래스의 인스턴스에서 호출됩니다.
활용 및 이점
static func의 개념은 알겠습니다. 그렇다면 구체적으로 어떤 상황에서 쓸 수 있고, 어떤 이점이 있는지 알아보겠습니다.
Swift에서 static 함수는 해당 유형의 인스턴스가 아닌 유형에 속하는 함수를 정의하는 데 사용됩니다.
이러한 함수는 해당 유형의 인스턴스를 생성하지 않고도 액세스할 수 있다고 했습니다!
static 함수의 일반적인 사용 사례 중 하나는 인스턴스별 데이터에 액세스할 필요가 없는 유틸리티 함수를 만들 때입니다.
예를 들어, MathUtils 구조체는 원의 넓이를 계산하는 stataic 함수를 정의할 수 있습니다.
struct MathUtils {
static func areaOfCircle(radius: Double) -> Double {
return Double.pi * radius * radius
}
}
이 경우 areaOfCircle 함수는 인스턴스별 데이터에 액세스할 필요가 없으므로 static 함수로 정의할 수 있습니다.
이렇게 하면 MathUtils의 인스턴스를 생성할 필요 없이 MathUtils 유형에서 직접 호출할 수 있습니다.
static 함수의 또 다른 사용 사례는 타입의 인스턴스를 생성하는 팩토리 메서드를 정의할 때입니다.
예를 들어, Person 클래스는 JSON 사전에서 Person 인스턴스를 생성하는 static 함수를 정의할 수 있습니다.
class Person {
let name: String
let age: Int
init(name: String, age: Int) {
self.name = name
self.age = age
}
static func fromJson(json: [String: Any]) -> Person? {
guard let name = json["name"] as? String, let age = json["age"] as? Int else {
return nil
}
return Person(name: name, age: age)
}
}
이 경우 fromJson 함수는 인스턴스별 데이터에 액세스할 필요가 없으므로 static 함수입니다.
JSON 사전을 입력으로 받아 Person 인스턴스를 반환하기만 하면 됩니다.
따라서 Person 인스턴스를 생성할 필요 없이 Person 유형에서 직접 호출할 수 있습니다.
요약
- 요약하자면, static 함수는 Swift에서 해당 유형의 인스턴스가 아닌 타입 그 자체에 속하는 함수를 정의하는 데 사용됩니다.
- 유틸리티 함수나 팩토리 메서드와 같이 함수가 인스턴스별 데이터에 액세스할 필요가 없는 상황에서 유용합니다.
- 이러한 사용 사례들은 코드의 가독성을 높이고 유지보수를 용이하게 만들어준다는 이점이 있습니다.
'iOS > Swift' 카테고리의 다른 글
[iOS - Swift] TDD를 위한 Unit Test 코드 작성하기 (Feat. XCTest) (0) | 2023.03.08 |
---|---|
[iOS - Swift] XCTest FAQ (XCTest를 공부하다 생긴 궁금증들) (0) | 2023.03.07 |
[Swift] Struct, Initializer (구조체와 이니셜라이저) (0) | 2022.05.10 |
[iOS 앱 프로그래밍] 회원가입 화면 구현 - 2. 화면의 전환 (1) 내비게이션 인터페이스 (0) | 2021.08.09 |
[iOS 앱 프로그래밍] 회원가입 화면 구현 - 1. H.I.G (0) | 2021.08.09 |