본문 바로가기

iOS

[Swift] Self와 self의 차이

이 글은 개념 정리 용도로 작성하였기 때문에 잘못된 지식이 있을 수 있습니다!

보실 경우, 댓글로 지적해주시면 감사하겠습니다 🤗🤗🤗

 

 

 

SwiftUI Tutorial을 따라하다가 처음 보는 용어가 나왔습니다. Self!!

 

iOS개발을 하면서 self는 정말 많이 사용했지만 Self는 사용해본 적이 없네요. ㅎㅎ 

소문자로 시작하는 self는 아는데.. 대문자로 시작하는 건 무엇이지...? 

 

그래서 그 차이를 알아보려고 합니다~~~~~~~

 

 

self

 

먼저 소문자로 시작하는 self는 "모든 인스턴스들이 암시적으로 생성하는 프로퍼티다." 라고 Swift 책에 나와있습니다. 

 

이 self 프로퍼티는 자기 자신을 가리키는 프로퍼티..!!! 클래스, 구조체 등 인스턴스 내에서 사용되는 건 아마 다른 언어를 하다 오신 분들도 아실거예요. 자바나 C++의 this와 같이 자기 자신을 가리키는 용도로 쓰이거든요. 그래도 혹시나해서 더 찾아보았습니다~ 아래와 같이 두가지 용도로 쓰입니다!!

 

첫째로, 인스턴스 내부에 같은 이름으로 선언된 변수들이 있다면, 좀 더 명확히 명시해줍니다.

 

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

 

위 예시같은 경우, 이니셜라이저 내부에 있는 name은 지역변수, 매개변수, 인스턴스 프로퍼티 순으로 무엇을 지칭하는지 찾습니다. 이럴 때, 바로 인스턴스 프로퍼티로 지칭해주기 위해서 사용됩니다~

 

다른 용도로는, 값 타입 인스턴스 자체의 값을 치환하기 위해서도 사용됩니다!

 

struct Calculator {
    var number: Int = 0
    
    mutating func plus(num: Int) {
        number = number + num
    }
    mutating func reset() {
        self = Calculator()
    }
}

 

클래스는 참조 타입이라 self 프로퍼티에 다른 참조를 할당할 수 없지만, 구조체나 enum은 self 프로퍼티를 사용해서 자신으로 교체할 수도 있어요.

 

결국, 소문자로 시작하는 self는 인스턴스가 가지고 있는 프로퍼티이다!!! 프로퍼티!

 

Self

 

그럼 Self는 뭘까? 

 

대문자로 시작하는 Self는 Swift사전을 찾아보니 타입이었어요. 아래와 같이 정의되어져 있는데.

위 뜻을 해석해보자면,

Self 타입은 특정한 Type이 아니고! 타입의 이름을 반복해서 쓰는 대신에 현재 타입을 쓸 수 있도록 도와준다!!라고 쓰여져 있는데 즉, 클래스, 구조체, enum 등에서 Self를 사용하면 그 타입을 가리킨다는 뜻으로 이해할 수 있네요. 

 

class SuperClass {
    func f() -> Self {
        return self
    }
}
class SubClass: SuperClass {}

let x = SuperClass()
x.f()
// SuperClass

let y = SubClass()
y.f()
// SubClass

 

위 예시에보면 대문자로 시작하는 Self랑 소문자로 시작하는 self 모두 SuperClass와 SubClass를 가리키고 있는 것 같이 보여요.

하지만!!!

대문자로 시작하는 Self 타입은 말 그대로 SuperClass와 SubClass 타입을 가리키고 있고, 소문자 self 프로퍼티는 SuperClass와 SubClass의 인스턴스들을 가리키고 있는 것입니다!! 

솔직히 말해서 아직도 이해가 안되서... 좀 더 찾아봤는데

결국 self와 Self의 차이는 "인스턴스를 가리키냐 타입을 가리키냐"의 차이더라구요

 

여기서 name은 인스턴스 프로퍼티니까 오류가 뜹니다! 

self 로 고치니까 오류 해결!

 

왜 오류가 해결되냐?

name은 인스턴스 프로퍼티이기 때문이에요!!

 

self와 Self의 차이를 조금은 알 것 같아요! 

둘의 쓰임이 완전 다릅니다 ㅎㅎ

 

Self는 타입프로퍼티와 타입메서드를 가리킬 때 사용되고,

self는 인스턴스프로퍼티와 인스턴스메서드를 가리킬 때 사용됩니다! ⭐️⭐️⭐️

위와 같이 사용되요~~

 

SwiftUI Tutorial에서 나온 Self는 결국 타입인스턴스를 가리키는거였어요! 

 

 

정리하다보니 타입과 인스턴스의 개념이 헷갈려서 간단히 정리해보았습니당

 

타입은 말 그래도 우리가 선언한 클래스나 구조체, enum을 가리켜요.

인스턴스는 선언을 해줘야 생성돼요!!

 

위를 보면 

PersonAA라는 타입을 가진 클래스를 만들고 Jaeyong이라는 PersonAA 타입의 인스턴스를 만들어준거예요!

 

그럼 여기서 타입프로퍼티와 타입메서드는 무엇이냐! 

타입으로 접근 가능하게 하고 싶은 경우 타입프로퍼티와 타입메소드로 선언해줘요!!

static과 class 키워드를 이용해서 타입메소드를,

static 키워드를 이용해서 타입프로퍼티를 선언해줍니다.

그리고 다른 곳에서 아래와 같이 불러올 수 있어요!

print(PersonAA.identifier)

그리고 인스턴스프로퍼티와 인스턴스메서드는 무조건!!! 인스턴스를 생성후에 불러줘야합니다~

 

iOS개발에서 HTTP통신을 위해서 Service를 만들 때와 Cell의 이름을 불러올 때 싱글톤으로 사용되고 있었네요...^^

 

싱글톤 패턴은 타입프로퍼티를 이용한 것이었네요ㅎㅎ