seong_hye, the developer

Swift) 문법 정리 - self vs Self 본문

IOS

Swift) 문법 정리 - self vs Self

seong_hye 2022. 7. 19.

 

자기자신을 가르키는 것으로 알고 있는 self

소문자인지 대문자인지에 따라 의미와 목적이 다르다고 한다.

그 내용에 대해 정리해보려 한다.


self

인스턴스를 가르킴

모든 인스턴스들이 암시적으로 생성하는 속성

 

사용 목적

1) 인스턴스 내부에서 인스턴스의 속성을 더 명확하게 가르키기 위해 사용

class Person {
    var name: String
    init(name: String) {
        self.name = name
    }
}


2) 값타입에서 인스턴스 자체의 값을 치환할 때 사용 가능 (클래스에서는 사용불가)

struct Calculator {
    var number: Int = 0
    
    mutating func plusNumber(_ num: Int) {
        number = number + num
    }
    
    // 값 타입(구조체, 열거형)에서 인스턴스 값 자체를 치환 가능
    mutating func reset() {
        self = Calculator()    // 값 타입은 새로 생성해서 치환하는 것도 가능
    }
}

 

 

3) 타입속성 / 메서드에서  사용하면, 타입자체를 가르킴

struct MyStruct {
    static let club = "iOS부서"
    
    static func doPrinting() {
        print("소속은 \(self.club)입니다.")
    }
}


4) 타입 인스턴스를 가르킬 때, 타입 자체의 뒤에 붙여서 사용 (타입 자체를 외부에서) 

class SomeClass {
    static let name = "SomeClass"
}

let myClass: SomeClass.Type = SomeClass.self

SomeClass.name
SomeClass.self.name

Int.max
Int.self.max

Self

타입을 가르킴

Self가 특정한 타입을 가르키는 것은 아니고,

특정 타입 내부에서 사용하여 해당 타입을 가르킴

 

사용 목적

1) 특정 타입 내부에서 타입을 선언하는 위치에서 사용

extension Int {
    // 타입 저장 속성
    static let zero: Self = 0     // Int 타입
}

 

2) 특정 타입 내부에서 타입 속성 / 타입 메서드를 지칭하는 위치에서 타입 대신 사용

extension Int {
    // 타입 저장 속성
    static let zero: Self = 0     // Int 타입
    
    // 2) 타입 속성/메서드에서 지칭
    static func toZero() -> Self {
        return Self.zero      // Int.zero
    }
}

 

3) 프로토콜에서 채택하려는 타입을 지칭 가능

extension BinaryInteger {
    func squared() -> Self {  // 타입자체(Int)를 가르킴
        return self * self    // 인스턴스(7)를 가르킴
    }
}

참고자료) 

https://www.inflearn.com/course/%EC%8A%A4%EC%9C%84%ED%94%84%ED%8A%B8-%EB%AC%B8%EB%B2%95-%EB%A7%88%EC%8A%A4%ED%84%B0-%EC%8A%A4%EC%BF%A8

Comments