Notice
Recent Posts
Recent Comments
Link
大器晩成
self vs Self - [대문자 self] 본문
[대문자 self]
- Self 타입은 특정 타입이 아니라 해당 타입의 이름을 반복하거나 알지 않아도 현재 타입을 편리하게 참조할 수 있습니다.
- 프로토콜 선언 또는 프로토콜 멤버 선언에서 Self 타입은 프로토콜을 준수하는 최종 타입을 나타냅니다.
- 구조체 클래스 또는 열거형에서 Self 타입은 선언에 의해 도입된 타입을 참조합니다. 타입의 멤버에 대한 선언 내에서 Self 타입은 해당 타입을 참조합니다.
- 1. 타입을 선언하는 위치에서 사용합니다
- 2. 타입속성/타입메서드를 지칭하는 자리에서 대신 사용이 가능합니다.
extension Int {
//타입을 선언하는 위치에서 사용가능
static let zero: Self = 0 // Self는 Int 타입
//static let zero: Int = 0
// 인스턴스 계산속성
var zero: Self { // 1) 타입을 선언하는 위치에서 사용
return 0
}
// var zero: Int {
// return 0
// }
// 2) 타입 속성/메서드에서 지칭
static func toZero() -> Self {
return Self.zero // Int.zero
}
// 인스턴스 메서드
func toZero() -> Self {
return self.zero // 10.zero
}
}
Int.zero //0
10.zero //0
Int.toZero() //0
10.toZero() //0
프로토콜에서의 Self
- 프로토콜을 채택한하는 해당 타입을 가리킵니다.
protocol Bird {
func fly() -> Self
}
extension String: Bird {
func fly() -> String { // String == Self
return "새가 날다"
}
}
"sparrow".fly()
- 타입에 대한 확장성이 커질 수 있다.
// 이진법으로 표현된 정수에서 쓰이는 프로토콜
// 프로토콜의 확장 ===> 구현의 반복을 줄이기 위한 문법
extension BinaryInteger {
// Self BinaryInteger 프로토콜을 채택한 모든 타입
func squared() -> Self {
return self * self // 인스턴스(10)를 가르킴
}
}
//BinaryInteger를 채택한 모든 타입은 squared함수가 생김
10.squared() // 100
구분 | self(소문자) | Self (대문자) |
설명 | (모든 인스턴스들이 암시적으로 생성하는 속성) | (Self가 특정한 타입을 가리키는 것은 아니고, 특정 타입 내부에서 사용하여 해당 타입을 가리킵니다) |
의미 | 인스턴스를 가리킴 | 타입을 가리킴 |
가리키는 대상 | "number", 7 .. | String, Double, Int .. |
예시 | 1. 인스턴스 내부에서 인스턴스의 속성을 명확하게 하기 위해서 사용 2. 값 타입에서의 인스턴스 자체의 값을 치환할 때 사용 3. 타입속성/메서드에서 사용하면, 타입 자체를 가리킵니다. 4. 타입 인스턴스를 가리킬 때, 타입 자체의 뒤에 붙여서 사용 |
1. 특정 타입 내부에서 타입을 선언하는 위치에 사용 2. 특정 타입 내부에서 타입속성/타입메서드를 지칭하는 위치에서 타입 대신 사용 3. 프로토콜을 채택하려는 타입을 지칭 가능 |
728x90
'iOS > Swift 문법' 카테고리의 다른 글
트레일링(Trailing)클로저 - 후행클로저 문법 (0) | 2025.02.25 |
---|---|
클로저 (Closures) (0) | 2025.02.25 |
self vs Self - [소문자 self] (0) | 2025.02.24 |
중첩된 타입 (Nested Types) (0) | 2025.02.24 |
[프로토콜] 프로토콜의 확장 (Protocol Extensions) (0) | 2025.02.18 |