iOS/Common

[Swift] static func와 그냥 func (feat. Singleton)

TDCIAN 2023. 6. 16. 16:26

 

 

 

Q. iOS Application 개발 과정에서 static func와 func 사이에는 어떤 차이가 있으며, 성능 측면에서 어떤 것이 더 유리한지 Swift  예시 코드와 함께 설명해 줘

 

A. iOS 애플리케이션 개발에서 'static func'와 'func'의 차이는 주로 사용 방법과 메모리 관리 측면에서 나타납니다.

 

먼저 'func'은 인스턴스 메서드를 선언할 때 사용되며, 해당 메서드는 클래스의 인스턴스에 속합니다. 이는 해당 클래스의 각 인스턴스에 대해 개별적으로 호출할 수 있는 메서드입니다. 예를 들어, 다음은 'func'의 예시 코드입니다.

class MyClass {
	func instanceMethod() {
    	// 인스턴스 메서드 로직
    }
}

let myObject = MyClass()
myObject.instanceMethod()

 

반면에 'static func'은 클래스 자체에 속하는 정적(static) 메서드를 선언할 때 사용됩니다. 이 메서드는 클래스의 인스턴스와 상관없이 클래스 이름으로 직접 호출할 수 있습니다. 정적 메서드는 해당 클래스에 대한 특정 작업을 수행하는 데 사용됩니다. 다음은 'static func'의 예시 코드입니다.

class MyClass {
	static func staticMethod() {
    	정적 메서드 로직
    }
}

MyClass.staticMethod()

성능 측면에서 'static func'가 조금 더 유리할 수 있습니다. 인스턴스 메서드는 메서드를 호출하기 위해 인스턴스를 생성해야 하므로 약간의 오버헤드가 발생할 수 있습니다. 하지만 정적 메서드는 클래스 이름으로 직접 호출되므로 인스턴스 생성과정이 필요하지 않아 성능상의 이점을 가질 수 있습니다. 그러나 이러한 성능 차이는 대부분 미세하며, 실제로는 코드 구조와 사용 시나리오에 따라 다를 수 있습니다.

 

따라서 'static func'와 'func'의 선택은 기능적인 요구사항과 코드 구조에 따라 달라질 수 있습니다. 인스턴스에 종속되지 않고 클래스 전체에서 사용할 수 있는 메서드는 'static func'으로 선언하는 것이 적합하며, 인스턴스의 속성에 접근해야 하거나 해당 인스턴스의 특정 작업을 수행해야 할 때는 'func'를 사용하는 것이 적절합니다.

 

 

 

Q. static func와 singleton 패턴의 관계를 설명해 줘

 

A. 'static func'와 싱글턴(Singleton) 패턴은 서로 연관이 있을 수 있습니다. 싱글턴 패턴은 애플리케이션에서 특정 클래스의 인스턴스를 오직 하나만 생성하고 이에 접근하기 위한 패턴입니다. 이 패턴을 구현하는 방법 중 하나는 'static func'를 사용하는 것입니다.

 

일반적으로 싱글턴 패턴은 다음과 같은 특징을 갖습니다:

1. 클래스 내부에 비공개(private) 생성자(private init)를 가집니다.

2. 클래스 내부에 'static'으로 선언된 유일한 인스턴스(instance)를 가집니다.

3. 'static func'를 사용하여 클래스의 인스턴스에 접근할 수 있는 접근 지점(access point)을 제공합니다.

 

싱글턴 패턴을 구현하는 예시 코드를 살펴봅시다:

class MySingleton {
	static let shared = MySingleton() // 유일한 인스턴스
    
    private init() {
    	// 비공개 생성자
    }

	func someMethod() {
    	// 싱글턴 메서드 로직
    }
}

위의 코드에서 'shared'라는 정적(static) 속성은 유일한 인스턴스를 저장합니다.

'private init'은 외부에서 인스턴스를 직접 생성하지 못하도록 하기 위해 비공개 생성자를 선언합니다.

그리고 'someMethod()'는 싱글턴 클래스의 일반적인 메서드입니다.

 

이제 'static func'와 싱글턴 패턴의 관계를 살펴보겠습니다. 'static func'는 클래스 자체에 속하는 정적 메서드를 선언하는 데 사용됩니다. 이는 클래스의 인스턴스와 독립적으로 호출되며 클래스 이름을 통해 직접 접근할 수 있습니다. 이러한 특성은 싱글턴 패턴을 구현하는 데 유용할 수 있습니다. 위의 예시 코드에서 'shared'는 'static'으로 선언된 속성으로써, 'MySingleton' 클래스의 유일한 인스턴스에 접근하는 접근 지점입니다.

 

따라서 'static func'는 싱글턴 패턴의 일부로서 싱글턴 인스턴스에 접근하는 데 사용될 수 있습니다. 싱글턴 패턴은 전역 변수의 남용을 방지하고, 애플리케이션 전체에서 단일한 상태나 기능을 공유할 때 유용합니다.

 

 

 

Q. static을 사용했을 때 오류가 발생할 수 있는 상황에 대해 설명해 줘.

 

A. 'static'을 사용할 때 발생할 수 있는 일부 오류 상황을 살펴보겠습니다

 

1. 인스턴스 속성에 접근

'static' 키워드로 선언된 메서드나 속성은 클래스 자체에 속하므로, 인스턴스 메서드 내에서 인스턴스 속성에 직접 접근할 수 없습니다. 'static' 멤버는 클래스 수준에서 정의되기 때문에 인스턴스와 연결되지 않습니다. 이러한 경우 컴파일러는 오류를 발생시킵니다.

class MyClass {
	static var myProperty: Int = 10
    
    func instanceMethod() {
    	// 오류: 인스턴스 메서드에서 static 속성에 접근할 수 없음
        print(myProperty)
    }
}

 

2. 상속과 메서드 오버라이딩

'static'으로 선언된 메서드는 서브클래스에서 오버라이드할 수 없습니다. 정적 메서드는 클래스 자체에 속하며, 상속 계층 구조에서 동작하지 않습니다. 이는 서브클래스에서 동일한 이름의 정적 메서드를 재정의하려고 할 때 컴파일 오류가 발생한다는 것을 의미합니다.

class ParentClass {
	static func myMethod() {
    	print("Parent")
    }
}

class ChildClass: ParentClass {
	override static func myMethod() {
    	// 오류: 정적 메서드는 오버라이드할 수 없음
        print("Child")
    }
}

 

3. 인스턴스 메서드에서 정적 메서드 호출

인스턴스 메서드 내에서 정적 메서드를 직접 호출할 수 있지만, 이는 암시적으로 해당 클래스의 타입에 접근하는 것이며, 명시적인 클래스 이름을 사용하는 것이 좋습니다.

class MyClass {
	static func staticMethod() {
    	print("Static method")
    }
    
    func instanceMethod() {
    	// 가능하지만 추천하지 않음
        staticMethod()
        
        // 권장 방법: 클래스 이름을 사용
        MyClass.staticMethod()
    }
}

이러한 상황에서 오류를 피하려면 'static' 멤버의 사용에 주의해야 합니다. 클래스 수준의 기능이 필요한 경우에만 'static'을 사용하고, 인스턴스에 종속적인 작업에는 인스턴스 메서드를 사용하는 것이 좋습니다.

 

 

출처: ChatGPT(https://chat.openai.com/)

 

 

참고할만한 공식 문서

https://docs.swift.org/swift-book/documentation/the-swift-programming-language/methods/

 

Documentation

 

docs.swift.org