self는 swift에서 객체 내부에서 현재 인스턴스를 참조하기 위해서 사용되는 키워드입니다.
self를 사용하는 경우는 다음과 같습니다.
1. 인스턴스 프로퍼티와 메서드 접근
self는 클래스, 구조체, 또는 열거형의 인스턴스 내에서 그 인스턴스의 프로퍼티나 메서드를 참조할 때 사용됩니다.
일반적으로 프로퍼티 이름과 메서드 이름이 고유하기 때문에 self를 생략할 수 있지만, 이름이 충돌할 경우에는 self를 사용해야 합니다.
struct Person {
var name: String
func greet() {
print("Hello, my name is \(self.name).")
}
}
let person = Person(name: "Alice")
person.greet() // "Hello, my name is Alice."
위 코드에서는 self.named을 통해서 현재 인스턴스의 name프로퍼티에 접근하고 있는데, 이 경우 self는 생략할 수 있습니다.
print("Hello, my name is \(name).")
이 다음의 경우부터는 self가 필요합니다.
2. 이니셜라이저에서 파라미터와 프로퍼티 이름이 동일할 때
이니셜라이저 내에서 파라미터 이름과 인스턴스 프로퍼티 이름이 같을 경우에, 스위프트는 파라미터를 우선시합니다.
이때 self를 사용해 인스턴스 프로퍼티를 명확히 구분할 수 있습니다.
struct Person {
var name: String
init(name: String) {
self.name = name // 파라미터 'name'을 인스턴스 프로퍼티 'name'에 할당
}
}
let person = Person(name: "Alice")
print(person.name) // "Alice"
3. 클로저 내부에서 캡쳐리스트를 사용하지 않고 현재 인스턴스를 참조할때
클로저 내부에서 self를 사용하면 클로저는 해당 인스턴스를 캡쳐합니다.
이 경우 self를 명시적으로 사용해야합니다.
특히 self를 강하게 참조하는 클로저를 사용하면 메모리 누수가 발생할 수 있기 때문에 신중해야 합니다.
class MyClass{
var value : Int = 10
func doSomething(){
let closure = {
print(self.value)
}
closure()
}
}
let myObject = MyClass()
myObject.doSomething() // 10
4. 메서드 체이닝 및 메서드에서 자기 자신을 반환할 때
메서드 체이닝을 지원하기 위해서 메서드에서 self를 반환할 수 있습니다.
이렇게 하면 여러 메서드를 연속해서 호출할 수 있습니다.
class Counter{
var count = 0
func increment() -> Self{
count += 1
return self
}
func reset() -> Self{
count = 0
return self
}
}
let counter = Counter()
counter.increment().increment().reset()
print(counter.count) // 0
5. 타입 메서드에서 타입 자체를 참조할 때
타입 메서드( 클래스메서드, 구조체메서드, 열거형 메서드 ) 에서 self는 해당 타입 자체를 의미합니다.
struct MyStruct{
static func printType(){
print(self) // MyStruct
}
}
MyStruct.printType() // MyStruct
위 코드에서 self는 MyStruct 타입 자체를 나타냅니다.
6. 동일한 이름의 전역변수 및 함수와 구분할 때
클래스나 구조체 내부에 전역변수나 함수와 동일한 이름의 프로퍼티나 메서드가 있을 때, self를 사용하여 명확하게 구분할 수 있습니다.
let name = "Global Name"
struct Person {
var name: String
func printName() {
print(self.name) // 인스턴스의 'name' 출력
print(name) // 전역 변수 'name' 출력
}
}
let person = Person(name: "Alice")
person.printName() // "Alice", "Global Name" 출력
'Ios' 카테고리의 다른 글
RESTful API 사용하기 (0) | 2024.08.21 |
---|---|
클로저에 대해서 알아보자 (0) | 2024.08.16 |
struct 그리고 class (0) | 2024.08.16 |
as에 대해서 알아보자 (0) | 2024.08.16 |
DispatchQueue에 대해서 알아보자! (0) | 2024.08.16 |