안녕하세요!
Kio입니다 👻
여러분은self와Self의 차이가 무엇인지 아시나요?
저는대문자,소문자차이가 아닌가 라고 생각했는데
그 차이였다면... 헤매지 않았을거에요...😱
그래서 오늘은 어떤 차이가 있는지 알아볼게요!
Let's get started 🥰
포스팅을 읽으면서 헷갈릴 수 있으니
self(소문자)에는 🟡
Self(대문자)에는 🔵
🟡 self와🔵 Self⬅️ 이렇게 표시할게요
프로코토콜,프로토콜 확장을 사용할 때
🟡 self와🔵 Self에는 차이점이 있습니다.
🔵 Self를 사용할 때는
프로토콜을 준수하는Type을 나타냅니다.
ex) String, Int, Double
🟡 self를 사용할 때는
해당Type내부의 값을 나타냅니다.
ex) "Hello kio", 234
당연히 예시가 있어야겠죠?!
저는 예시 없이는 이해하지 못합니다...😱
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 을 넣어볼게요!
Int는BinaryInteger를 준수하므로
아래처럼 동작된다고 생각해볼 수 있습니다.
extension Int {
func squared() -> 🔵 Int {
return 🟡 10 * 🟡 10
}
func plus() -> 🔵 Int {
return 🟡 10 + 🟡 10
}
}
10.squared() // 100
10.plus() // 20
이제 왜 이런 값이 나오는 지 이해가 되실 것 같네요!
🔵 Self를 사용할 때는
프로토콜을 준수하는Type을 나타냅니다.
위의 예시 코드에서Int는BinaryInteger를 준수하므로
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문법 마스터 스쿨.png)
잘못된 정보가 있으면 언제든 코멘트 부탁드립니다 👻