Swift문법 - (21)Self키워드

Youth·2022년 10월 10일
0

swift문법공부

목록 보기
21/27
post-thumbnail
post-custom-banner

Self vs self

self키워드의 사용 (소문자)

  1. 인스턴스를 가르키기 위해 사용
class Person {
    var name: String
    init(name: String) {
				// 인스턴스의 name에다가 parameter의 name을 대입한다는 뜻
				// 여기서 self가 없으면 가장가까운 name을 가리킨다
        self.name = name
    }
}
  1. 값타입에서 새로운 속성으로 초기화가 가능한 패턴
struct Calculator {
    var number: Int = 0
    
		// 구조체 자기자신의 속성을 바꾸는 경우엔 mutating 키워드 사용해야함
    mutating func plusNumber(_ num: Int) {
        number = number + num
    }
    
    // 값 타입(구조체, 열거형)에서 인스턴스 값 자체를 치환 가능
    mutating func reset() {
				// 값 타입은 새로 생성해서 치환하는 것도 가능
				// class는 이런패턴으로 초기화하는 방식이 불가능함
				// ✅ValueType에서만✅
        self = Calculator()
    }
}
  1. 타입속성에서 사용하면, 인스턴스가 아니라 타입자체를 가리킨다
struct MyStruct {
    static let club = "iOS부서"
    
    static func doPrinting() {
        print("소속은 \(self.club)입니다.") 
    }
}
  1. 타입 인스턴스를 가르키는 경우에 사용
  • 타입인스턴스 : 메모리에 올라와있는 붕어빵 틀 자체를 가리킴
class SomeClass {
    static let name = "SomeClass"
}
// SomeClass라는 붕어빵틀 자체를 가리킴
let myClass: SomeClass.Type = SomeClass.self

// 사실 타입속성에 접근할때는 타입인스턴스의 타입속성을 가르키는건데
// self없이 줄여서 사용해온것이다
SomeClass.name
SomeClass.self.name

Self키워드의 사용 (대문자)

  • (특정 타입 내부에서) 해당 타입을 가르키는 용도로 Self를 사용
  1. 타입을 선언하는 위치에 사용한다
  2. 타입속성/타입메서드를 지칭하는 자리에서 대신사용한다
extension Int {
    // 타입 저장 속성
    static let zero: Self = 0     // Int 타입
    //static let zero: Int = 0
    
    // 인스턴스 계산속성
    var zero: Self {  // 1) 타입을 선언하는 위치에서 사용
        return 0
    }

		// 위의 계산속성과 동일한 계산속성이다
    var zero: Int {
        return 0
    }
    
    // 2) 타입 속성/메서드에서 지칭
    static func toZero() -> Self {
				// static let zero를 지칭
        return Self.zero 
    }

    // 인스턴스 메서드
    func toZero() -> Self {
				// var zero를 지칭
        return self.zero  
    }
}

프로토콜에서의 Self사용 (프로토콜을 채택하는 해당 타입을 가르킴)

  • 특정 타입에서 extenstion을 사용하면 모든 타입에 해당하는 return 타입을 전부다 구현해줘야하지만 Self라는 해당타입자체를 지칭하는 키워드를 사용하면 Int에서는 Int를 float에서는 float을 반환해주는 함수로 유연하게 사용이 가능하다
  • 확장성이 좋아진다
extension BinaryInteger {
    func squared() -> Self {  // 타입자체(Int)를 가르킴
        return self * self    // 인스턴스(7)를 가르킴
    }
}
protocol Remote {
		func turnOn() -> Self
}

extenstion String: Remote {
		// 여기서의 Self는 String을 의미한
		// extention Int였다면 Self는 자동으로 Int를 의미하게된다
		func turnOn() -> Self {}
}
profile
AppleDeveloperAcademy@POSTECH 1기 수료, SOPT 32기 iOS파트 수료
post-custom-banner

0개의 댓글