大器晩成

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

iOS/Swift 문법

self vs Self - [대문자 self]

zerobugpark 2025. 2. 24. 23:37

 

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