Notice
Recent Posts
Recent Comments
Link
大器晩成
self vs Self - [소문자 self] 본문
[소문자 self]
- self 표현식은 현재 타입 또는 해당 타입의 인스턴스에 대한 명시적 참조입니다.
- 초기화 구문, 서브스크립트, 또는 인스턴스 메서드에서 self는 현재 인스턴스를 참조합니다. 타입메서드에서 self는 현재 타입을 참조합니다.
- self 표현식은 멤버에 접근할 때 범위를 지정하는 데 사용되고 함수 파라미터와 같이 범위에 같은 이름의 다른 명수가 있을 때, 명확성을 제공합니다.
1. 인스턴스를 가리키기 위해 사용
class SomeClass {
var greeting: String
init(greeting: String) {
self.greeting = greeting
}
}
- self.greeting은 현재 타입의 인스턴스인 greeting을 가리킵니다.
- self를 붙이지 않을 경우 가장 인접한 변수명을 사용합니다.
- 만약 파라미터 네임과, 인스턴스 속성의 이름이 동일할 경우 self키워드로 구분해주지 않으면, 오류가 발생합니다.
2. Apple 공식문서 예제 (값타입에서의 self)
// Apple 공식 문서 예제
struct Point {
var x = 0.0, y = 0.0
mutating func moveBy(x deltaX: Double, y deltaY: Double) {
self = Point(x: x + deltaX, y: y + deltaY)
}
}
var axis = Point()
print(axis.x, axis.y)
axis.moveBy(x: 10, y: 10)
print(axis.x, axis.y)
// 추가 예제
struct Calculator {
var number: Int = 0
mutating func plusNumber(_ num: Int) {
number = number + num
}
// 값 타입(구조체, 열거형)에서 인스턴스 값 자체를 치환 가능
mutating func reset() {
self = Calculator() // 값 타입은 새로 생성해서 치환하는 것도 가능
}
}
var cal = Calculator(number: 5)
cal.number
cal.reset() //cal의 인스턴스를 새로 찍어냄
cal.number
- 새로운 값으로 속성 초기화 가능(값타입에서만 가능, 클래스는 생성자를 통해 객체를 생성해야하기 때문에 불가능)
- mutating은 구조체나 열거형의 자기 자신의 속성을 바꾸는 경우 사용하는 키워드입니다.
(구조체나 열거형은 자기 자신의 속성을 변경하는 것이 불가능) - 즉, 값 타입의 변경 가능 메서드(mutating method)에서 해당 값 타입의 새 인스턴스를 self에 할당할 수 있습니다.
3. 타입멤버에서 사용
- 인스턴스가 아닌 타입 자체를 가르킴
class Car {
static var numberOfCars = 0 // 타입 프로퍼티
// 타입 메서드
static func createCar() {
print("A new car is created!")
//self.numberOfCars += 1 // self는 Car 타입을 참조
Car.numberOfCars += 1
}
// 또 다른 타입 메서드
static func carCount() {
print("There are \(self.numberOfCars) cars.") // self는 Car 타입을 참조
}
func createCar2() {
print("A new car is created!")
//self.numberOfCars += 1 // 오류 발생 (인스턴스 속성에 NumberOfcars가 없음)
Car.numberOfCars += 1 // 이렇게 접근 가능
}
}
// 타입 메서드 호출
Car.createCar() // A new car is created!
Car.carCount() // There are 1 cars.
Car.createCar() // A new car is created!
Car.carCount() // There are 2 cars.
4. 타입 인스턴스를 가르키는 경우에 사용 (외부에서 타입을 가르키는 경우)
class SomeClass {
static let name = "SomeClass"
}
// SomeClass.Type ===> 메타타입
let myClass: SomeClass.Type = SomeClass.self
SomeClass.name //"SomeClass"
SomeClass.self.name //"SomeClass"
Int.max
Int.self.max
- SomeClass는 타입 인스턴스입니다.
728x90
'iOS > Swift 문법' 카테고리의 다른 글
클로저 (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 |
[프로토콜] 선택적 프로토콜 요구사항(Optional Protocol Requirements) (0) | 2025.02.18 |