大器晩成

self vs Self - [소문자 self] 본문

iOS/Swift 문법

self vs Self - [소문자 self]

zerobugpark 2025. 2. 24. 23:36

 

[소문자 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