[Swift] self vs Self

un1945·2022년 2월 18일
1

Swift

목록 보기
14/14

안녕하세요! Kio입니다 👻

여러분은 selfSelf 의 차이가 무엇인지 아시나요?
저는 대문자, 소문자 차이가 아닌가 라고 생각했는데
그 차이였다면... 헤매지 않았을거에요...😱
그래서 오늘은 어떤 차이가 있는지 알아볼게요!

Let's get started 🥰

포스팅을 읽으면서 헷갈릴 수 있으니
self(소문자) 에는 🟡
Self(대문자) 에는 🔵

🟡 self🔵 Self ⬅️ 이렇게 표시할게요




self vs Self

프로코토콜, 프로토콜 확장을 사용할 때
🟡 self🔵 Self에는 차이점이 있습니다.

🔵 Self 를 사용할 때는
프로토콜을 준수하는 Type 을 나타냅니다.
ex) String, Int, Double

🟡 self 를 사용할 때는
해당 Type 내부의 값을 나타냅니다.
ex) "Hello kio", 234


예시 (Discussion)

당연히 예시가 있어야겠죠?!
저는 예시 없이는 이해하지 못합니다...😱

extension BinaryInteger {
    func squared() -> Self {
        return self * self
    }
    
    func plus() -> Self {
    	return self + self
	}
}

아니,BinaryInteger 가 뭔지 알려줘야 하는 거 아냐?
네... 저도 몰라서 찾아봤습니다.

BinaryInteger protocol
모든 integer types의 기초가 되는 프로토콜입니다.

쉽게 말해서 Int, Int64, UInt32 등의
integer types 은 모두 BinaryInteger protocol을 따르고 있다는 거죠 👻


그럼 실제 코드를 볼까요?!
저는 머리가 안 좋은 관계로 Int 만 사용해보았습니다 👀
extension 으로 확장해서 선언했던 메서드가 사용가능하네요!

10.squared()
10.plus()

어떻게 이 결과가 나온 지 이해가 되시나요?!
🟡 self🔵 Self 를 여기서 설명해볼 수 있을 것 같은데요!
10 이라는 Int 를 사용했으니 Int 로 해볼게요!


extension으로 BinaryInteger를 이렇게 확장했었죠

extension BinaryInteger {
    func squared() -> 🔵 Self { 
        return 🟡 self * 🟡 self
    }
    
    func plus() -> 🔵 Self {
    	return 🟡 self + 🟡 self
	}
}

그리고 실제 넣었던 값인 10 을 넣어볼게요!
IntBinaryInteger 를 준수하므로
아래처럼 동작된다고 생각해볼 수 있습니다.

extension Int {
    func squared() -> 🔵 Int { 
        return 🟡 10 * 🟡 10
    }
    
    func plus() -> 🔵 Int {
    	return 🟡 10 + 🟡 10
	}
}



10.squared() // 100
10.plus()	 // 20

이제 왜 이런 값이 나오는 지 이해가 되실 것 같네요!

🔵 Self 를 사용할 때는
프로토콜을 준수하는 Type 을 나타냅니다.

위의 예시 코드에서 IntBinaryInteger 를 준수하므로
10 이라는 Int Type 을 넣으면 return 값이
🔵 Self 이기 때문에 처음 넣었던 Int Type 를 반환합니다.


🟡 self
해당 Type이 보유하는 모든 값을 나타냅니다.

위의 예시에서 10 이라는 값을 호출하였으니
squared() 를 사용한다면 10 * 10 이 됩니다.




마치면서

이렇게 🟡 self🔵 Self 에 대해 알아보았는데요!
이제 어떤 차이인지 아셨을 거에요 👻

But... 확실히 알려면 아래도 알아야합니다(?)

🟡 self 에는
1) 인스턴스 내부에서 인스턴스 속성을 가르킬 때
2) 타입속성 메서드에서 타입자체를 가르킬 때
3) 타입자체의 형태를 가르킬 때

🔵 Self 에는
1) 프로토콜에서 채택하는 타입을 지칭할 때
2) 타입을 확장할 때 내부에서 타입을 선언할 때
3) 타입 내부에서 타입 속성 및 타입 메서드를 지칭할 때

그런데 이거는 왜 포스팅 안하냐구요?!
너무 힘들어요... 안할 거에요... ~공부하세요(아쿠마,,,)~

저는 이 부분을 정리한 것만으로도 기분이 아주 좋습니다 🥰




참고

Self vs self - what's the difference? - Hacking with Swift
BinaryInteger - developer.apple
앨런 Swift문법 마스터 스쿨




잘못된 정보가 있으면 언제든 코멘트 부탁드립니다 👻

profile
Someday_iOS_Dev

0개의 댓글