Self와 Super는 형식(자료형)에 기본적으로 추가되는 특별한 속성임.
self // 인스턴스 자체 접근시 사용. 인스턴스 자신.
self.propertyName // 인스턴스 속성에 접근(생략도 가능)
self.method() // 인스턴스 메소드에 접근(생략도 가능)
self[index] // 서브스크립트 접근시
self.init(parameters) // 동일한 형식에 있는 다른 생성자 호출시 사용. 셀프생략불가.
self는 인스턴스에서 자동으로 추가됨. (형식에 기본적으로 추가되는 self.)
인스턴스멤버에서 접근하면 인스턴스에 접근.
타입멤버에서 접근하면 형식에 접근.
-
self는 현재 인스턴스에 접근하기 위한 특별한 속성이다.
-
단, 타입멤버에서 사용하면 인스턴스가 아닌 형식 자체에 접근함.
class Size {
var width = 0.0
var height = 0.0
func calcArea() -> Double {
return self.width * self.height // self생략 가능.
}
var area: Double {
return self.calcArea() // 속성과 마찬가지로 self생략 가능.
}
func update(width: Double, height: Double) {
self.width = width //파라미터 이름과 속성 이름이 동일. 이 경우 컴파일러는 모두 파라미터로 인식하여 컴파일 에러 발생. 셀프표현으로 속성과 파라미터 구분해야 함.
self.height = height
}
func doSomething() {
let c = { self.width * self.height } // 클로저에서 인스턴스 멤버에 접근하려면 셀프를 캡쳐해야 함. 클로저 내부에서 인스턴스 속성에 접근하려면 반드시 self를 사용해야 함. 셀프를 캡쳐해야 함.
static let unit = “”
static func doSomething() {
self.width //error발생. width라는 형식속성은 존재하지 않음.
self.unit // 가능. 둘다 타입멤버라 가능. self도 생략 가능.
}
}
중요: Self를 반드시 써야 하는 경우:
-
생성자에서 파라미터와 속성이름이 같을 경우
-
클로저 내부에서 인스턴스 내부 접근 : 인스턴스 멤버 접근시 self. 반드시 사용.
Self의 특성 2가지:
-
Self는 현재 인스턴스에 접근하기 위해 사용하는 특별한 속성이다.
-
타입멤버에서 사용하면 인스턴스가 아닌 형식 자체를 나타낸다.
구조체에서의 self
아래 self = Size(width: value, height: value) 를 통해 새로운 인스턴스를 생성할 수 있다. (클래스에서는 사용 불가.)
struct Size {
var width = 0.0
var height = 0.0
mutating func reset(value: Double) {
// width = value
// height = value
self = Size(width: value, height: value) // self에 새로운 인스턴스를 저장됨. 인스턴스가 새로운 인스턴스로 교체됨. 클래스에서는 사용 불가함.
}
}
var p2 = Size()
p2.reset(value: 10)
print(p2.width)
print(p2.height)
super는 상속과 연관이 있기 때문에 class에서만 사용 가능.
super.propertyName // 인스턴스 속성에 접근(생략도 가능)
super.method() // 인스턴스 메소드에 접근(생략도 가능)
super[index] // 서브스크립트 접근시
super.init(parameters) // 동일한 형식에 있는 다른 생성자 호출시 사용. 셀프생략불가.
'Swift' 카테고리의 다른 글
Swift - In Out Parameters (입출력 파라미터) (0) | 2020.03.22 |
---|---|
Swift - Generics(제네릭) (0) | 2020.03.22 |
Swift - 고차 함수 (0) | 2020.03.21 |
Swift - Optional(옵셔널) (0) | 2020.03.20 |
Swift - First Class Citizen (0) | 2020.03.19 |