Ios

self에 대해서 알아보자

잘먹는 개발자 에단 2024. 8. 16. 15:01

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" 출력