self
와 Self
의 차이점은 뭘까? 🤔
아니 .. 소문자면 소문자고 대문자면 대문자인거지 구별을 해야하나 ㅠ
라고 궁시렁 거렸지만! 공부해봤다 ㅎㅎ
먼저 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 ""
}
}
TIL 시리즈는 막연히 제가 배운 걸 기록하는 공간입니다.