본문 바로가기
Ios

self에 대해서 알아보자

by 잘먹는 개발자 에단 2024. 8. 16.

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