class Mac {
static var model = "Mac"
var name: String
var weight: Double
init(name: String, weight: Double) {
self.name = name
self.weight = weight
}
func changeName(newName name: String) {
self.name = name
}
// 타입 메서드에서, 타입속성에 접근시에는 타입으로 접근하지 않아도 된다.
// 둘 다 타입 자체에 속해있기 때문이다.
static func letMeKnow() {
// Mac.model 과 같이 접근해도 된다.
print("\(model)입니다.")
}
}
Mac.letMeKnow()
// Mac입니다.
// Int.random(...), Double.random(...) 와 같은 메서드들도 타입 메서드이다.
// Int, Double 기본형 타입에서 인스턴스 생성없이 바로 점문법으로 메서드 사용가능.
class UpperClass {
class func someTypeMethod() {
print("타입과 관련된 공통된 기능을 구현")
}
}
UpperClass.someTypeMethod()
// 타입과 관련된 공통된 기능을 구현
class SomeThingClass: UpperClass {
override class func someTypeMethod() {
print("타입과 관련된 공통된 기능을 구현(업그레이드)")
}
}
SomeThingClass.someTypeMethod()
// 타입과 관련된 공통된 기능을 구현(업그레이드)
타입 메서드는
1. 메서드이기 때문에 타입에 메모리 공간이 할당되어 있지 않다.
2. 인스턴스에 속한 속성이 아니고, 타입자체에 속한 속성이기에 내/외부에서 Type.method()로 접근해야 한다.
=> 메서드 실행시, 스택프레임을 만들고 타입 데이터를 사용 -> 메서드 종료시 스택프레임 사라짐
3. 타입에 해당하는 보편적인 동작(예: Int.random(...))의 경우
4. static(상속시 재정의 불가) 또는 class(상속시 재정의 가능) 키워드 사용
"[ ]" 대괄호를 이용해 배열의 요소(Element)나 딕셔너리의 키에 접근하기 위해 사용하는 문법
대괄호는 특별한 형태의 메서드(기능)이다. 메서드를 직접 구현도 가능하다.(배열, 딕셔너리 제외)
class SubScript {
var num = [10, 20, 30, 40, 50]
subscript(index: Int) -> Int {
get {
return num[index]
}
set {
return self.num[index] = newValue
}
}
}
let someClass: SubScript = SubScript()
print(someClass[2]) // 30
someClass[2] = 10
print(someClass[2]) // 10
enum SomeEnum: Int {
case pc = 1, Mac, notebook, cellphone
// 타입을 넘겨주는 것도 가능
subscript(n: Int) -> someEnum {
return someEnum(rawValue: n)!
}
}
let someEnum = SomeEnum[2]
print(someEnum)
// Mac
서브스크립트는
메서드이기 때문에 인스턴스에 메모리 공간이 할당되어 있지 않다.
파라미터를 2개 이상 사용할 수도 있다.(아규먼트 레이블을 따로 사용하지 않는다)