TIL 0113 - self vs Self

ian·2022년 1월 13일
0

TIL

목록 보기
10/11
post-thumbnail

selfSelf 의 차이점은 뭘까? 🤔

아니 .. 소문자면 소문자고 대문자면 대문자인거지 구별을 해야하나 ㅠ
라고 궁시렁 거렸지만! 공부해봤다 ㅎㅎ


먼저 self 를 확인해보자!
약간 복습 겸..?

우린 self 엄청 많아 썼었는데.. 언제 썼냐면

  • 인스턴스를 가르키기 위해 사용
  • 새로운 값으로 속성 초기화를 할 때
  • 타입멤버에서 사용하면, 인스턴스가 아닌 타입 자체를 가르킴!
  • 타입 인스턴스를 가르키는 경우에 사용

이럴 때 self 를 썼었네요?

하나하나 예시를 살펴봐요!

인스턴스를 가르키기 위해 사용

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

클래스 Person 의 내부에 있는 변수 name 을 지칭해야하니! self 를 사용해줬었죠?

새로운 값으로 속성 초기화를 할 때

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

위 같은 경우는! class 에선 절대 사용이 안됩니다! 무조건 값 타입에서만 구현이 되죠!

타입멤버에서 사용하면, 인스턴스가 아닌 타입 자체를 가르킴!

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

타입 프로퍼티 일 땐 이렇게 사용할 수 있겠네용

타입 인스턴스를 가르키는 경우에 사용

class SomeClass {
    static let name = "SomeClass"
}


let myClass: SomeClass.Type = SomeClass.self
// SomeClass.Type ===> 메타타입 (후반부에 다룰 예정)


SomeClass.name
SomeClass.self.name


Int.max
Int.self.max

위와 같은 경우일 때! self 를 사용한 걸 확인해볼 수 있겠죠?!
그렇다면 Self 는..?


Self 는 특정 타입 내부에서 해당 타입을 가르키는 용도로 Self를 사용합니다!

  • 타입을 선언하는 위치에서 사용하거나,
  • 타입속성/타입메서드를 지칭하는 자리에서 대신 사용 가능

하다고 생각하면 좋을 것 같아요! 바로 예시 보시죠잉

extension Int {
    // 타입 저장 속성
    static let zero: Self = 0     // Int 타입
    //static let zero: Int = 0
    
    // 인스턴스 계산속성
    var zero: Self {  // 1) 타입을 선언하는 위치에서 사용
        return 0
    }

    // 2) 타입 속성/메서드에서 지칭
    static func toZero() -> Self {
        return Self.zero      // Int.zero
    }

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

Int.zero
5.zero

Int.toZero()
5.toZero()

또! 프로토콜에서도 Self 를 사용할 수 있어요 !

protocol Remote {
   func turnOn() -> Self
}

extension String: Remote {
   func turnOn() -> String {
       return ""
   }
}

학습 키워드

  • self
  • Self

문제점 / 고민한 점

  • 생성자 문법을 완벽하게 이해한게 아니구나..! 다시 공부 고고

TIL 시리즈는 막연히 제가 배운 걸 기록하는 공간입니다.


출처:
앨런 swift 문법 마스터 스쿨

profile
디자인씽킹을 하며 iOS 를 공부합니다

0개의 댓글