2020. 10. 7. 14:15ㆍTerminology
Metatype : 타입의 타입
struct Medium {
static let author = "he"
func postArticle(name: String) {}
}
let blog: Medium = Medium()
Medium()은 instance이고, Medium은 instance를 나타내는 type
blog라는 이름으로 생성한 instance에서는 instance method인
postArticle()를 호출할 수 있지만, class property인 author에는 접근할 수 없답니다.
스위프트에는 세가지 함수 종류가 있습니다.
앞에 붙는 키워드에 따라서 instance / class / static 으로 나뉩니다.
www.youtube.com/watch?v=vrhIxBWSJ04
class Sample {
//1. Instance함수
func myInstanceFunc() {}
//2. class 함수
class func myClassFunc() {}
//3. static 함수
static func myStaticFunc() {}
}
아무 생각없이 사용해왔다면 바로 그게 instance 함수였겠죠? 그럼 이제 나머지 두개를 알아보러 가봅시다.
class func vs. static func
공통점
static과 class 메소드는 타입 메소드라고 불려요. 모두 class 객체보다는 class 자체와 연관되어 있답니다.
()생성자를 통해서 인스턴스를 생성하지 않더라도 바로 접근이 가능합니다.
Sample.myClassFunc()
Sample.myStaticFunc()
차이점
차이점은 해당 class를 상속 받은 subclass에서 나타납니다.
class함수 < override 가능
static 함수 < override 불가능
class SubSample : Sample {
// Good!
override class func myClassFunc() {}
//Compile Error ...
override static func myStaticFunc() {}
}
static 메서드와 class 메서드의 차이를 명확히 구분하기 위해서는 struct 혹은 enumeration을 비교해야 합니다.
일단 struct에서 class 메서드를 선언하니, 컴파일 에러가 납니다. 이는 enumeration에서도 마찬가지입니다.
여기서 몇가지 짚고 넘어갈 것이 있는데, 우선 struct와 enumeration은 상속이 불가능합니다.
그리고 앞에서 설명한 듯이 struct와 enumeration은 class 메서드를 선언할 수 없습니다.
그리고 class 메서드는 오버라이딩이 가능합니다.
즉 class 메서드는 static 메서드를 상속할 수 있도록 만든 메서드임을 알 수 있습니다.
자바 프로그래밍 언어를 접해보셨다면 static메서드를 오버라이딩 할 수 없다는 사실을 이미 알고 계실것입니다. 하지만 Swift에서는 static메서드를 오버라이딩 할 수 있도록 별도의 class 메서드를 추가했습니다. ( 클래스 내에서 static 메서드와 class 메서드는 같은 의미입니다. 즉, 클래스에 한정적으로 static 메서드를 오버라이드 가능합니다. )
static func vs. final class func
오호라... static func는 상속 못받는다고? 그럼 class func에 더이상의 상속을 막아주는 final 키워드를 붙여주면 같은 거 아냐?
참고용 ^^//
<변수> <메소드> <클래스> <값>
Final : 상수, 상속되서 처리할 수 없음, 확장될 수 없음, 값이 바뀔 수 없음
Static: - ,클래스의 객체와 같아 , 적용될 수 없음, 초기값 설정가능하고, 재초기화 가능
class Sample {
class func myClassFunc() {}
static func myStaticFunc() {}
}
//style 1 : final class
class SubSample1 : Sample {
override final class func myClassFunc() {}
}
//style 2 : static
class SubSample2 : Sample {
override static func myClassFunc() {}
}
class property vs. static property
func 앞에 static이나 class 키워드가 붙는 것들을 타입 메소드라고 했죠? 그러면 Property앞에 해당 키워드가 붙으면? 바로 타입 프로퍼티가 됩니다.
class PropertySample {
static var myStaticProperty = 1
class var myClassProperty: Int {
return 1
}
}
class SubPropertySample : PropertySample {
override class var myCalssProperty: Int {
return 2
}
}
타입 프로퍼티는 타입 메소드와 마찬가지로 생성자 없이 바로 접근 가능하고, static, class 중 class 프로퍼티만 상속이 가능해요.
static 프로퍼티의 가장 흔한 예시는 설정(configuration)입니다. UIKit에서 유일한 목적이 다른 object를 설정하기 위한 것인 이러한 프로퍼티를 볼 수 있죠.
주의해야할 점은 class 타입 프로퍼티 같은 경우, 연산 타입 프로퍼티(Computered type property)로 표현이 되어야 해요.
//저장타입 프로퍼티 형태 = 컴파일 에러
class var errorClassProperty: Int = 1
//연산 타입 프로퍼티 형태 = 컴파일 OK
class var correctClassProperty: Int{
return 1
}
그리고 이 경우는 var로만 선언이 가능합니다.
//let - 컴파일 에러
class let errorClassProperty: Int {
return 1
}
//var - 컴파일 OK
class var correctClassProperty: Int {
return 1
}
static과 class키워드의 차이점은 상속받을 때 override를 할 수 없다/ 있다 정도였죠?
그러면 basic이 되는 static 키워드를 중심으로 살펴봅시다.
언제 static을 사용하는가
Swift 에서 static 키워드를 사용하는 경우는 해당 메소드나 프로퍼티가 instance보다는 type자체와 연관될 때 입니다.
그래서 이름도 타입메소드, 타입프로퍼티잖아요? 그렇다면 인스턴스(instance)가 아닌 type으로서 정의된 속성이나 메소드를 언제 사용해야 할까요?
static property
- 자주 안 변하고 전역 변수 마냥 공통으로 관리하는 공용자원 느낌일 때 (ex. 색상, 폰트 등)
- 자주 재사용되고 생성비용이 많이 드는 object를 미리 만들어 놓고 계속 쓰면 효율 높일 수 있을 때(ex. dateformatter 등)
static method
- 간단한 factory(?) 구현할 때
요약
class Sample {
//1. Instance함수
func myInstanceFunc() {}
//2. class 함수
class func myClassFunc() {}
//3. static 함수
static func myStaticFunc() {}
}
static과 class 메소드는 타입 메소드라고 불린다.
class PropertySample {
static var myStaticProperty = 1
class var myClassProperty: Int {
return 1
}
}
class SubPropertySample : PropertySample {
override class var myCalssProperty: Int {
return 2
}
}
Property 앞에 static 이나 class가 붙으면 이걸 타입 메소드라고 불린다.
Property로 타입메소드를 정의할 때는 let 이 아니라 var 형태로 선언해야 한다.
'Terminology' 카테고리의 다른 글
[ Swift ] View Controller의 생명주기 ( Life - Cycle ) (0) | 2020.11.19 |
---|---|
[ Swift ] MVC ? MVVM ? (0) | 2020.10.26 |
[ Swift ] Generics 간단 개념 (0) | 2020.10.08 |
[ Swift ] .self .Type .Protocol Self (0) | 2020.10.07 |
( API , SDK ) vs. ( Framework vs. Library ) (2) | 2020.10.06 |