self
객체 자기 자신을 가르키는 키워드입니다.
"자기 자신" 또는 "현재 인스턴스"로 해석할 수 있으며
클래스나 구조체 내에서 인스턴스 자신을 참조할 때 self를 사용합니다.
super
상위 클래스(부모 클래스)의 메서드나 속성을 호출할 때 사용하는 키워드입니다.
"부모" 또는 "상위 클래스" 로 해석할 수 있습니다.
현재 클래스의 메서드가 아닌 상위 클래스의 메서드를 호출할 수 있습니다.
조금 더 알아보기 쉽게 표로 정리하자면
키워드 | 의미 | 해석 | 사용 시점 |
self | 현재 인스턴스(자기 자신)를 가리킴 |
"자기 자신", "현재 인스턴스" | 클래스나 구조체 내에서 인스턴스 자신을 참조할 때 |
super | 상위 클래스(부모 클래스)를 가리킴 |
"부모", "상위 클래스" | 상위 클래스의 메서드나 속성을 호출할 때, 현재 클래스의 메서드 대신 사용 |
이렇게 나타낼 수 있습니다.
self, super 사용 이유
self
self는 인스턴스 자신을 참조하고, 이름 충돌을 피하거나 현재 인스턴스를 명확히 하기 위해 사용합니다.
이름 충돌을 피해는 예를 들어보자면
class Person {
var name: String
init(name: String) {
self.name = name
}
}
init 메서드에는 name이라는 매개변수가 있습니다.
클래스의 인스턴스 속성도 name이라는 이름을 사용합니다.
이때, 메서드 내에서 name이라고만 적으면 컴파일러는 어떤 name을 참조하는지 혼동할 수 있습니다.
예를 들어 만약 self를 사용하지 않고 name = name이라고만 적었다면, 컴파일러는 양쪽 모두 매개변수로 전달된 name으로 해석하게 됩니다.
결과적으로 인스턴스 속성은 초기화되지 않고 매개변수의 값만 재할당되는 문제가 발생하게 되는 것입니다.
따라서 self.name = name을 사용하여
self.name은 인스턴스 name 속성을 명확히 가르키고, (현재 인스턴스의 name 속성 (Person 객체의 속성))
name은 init의 메서드의 매개변수로 전달된 값을 가르킵니다. (메서드에 전달된 매개변수 (객체를 생성할 때 전달된 이름))
결론은
sefl를 사용하여 매개변수와 인스턴스 속성 간의 이름 충돌을 해결하기 위해 사용한 것입니다. 이를 통해 코드가 더 명확해지고, 오류 없이 잘 작동하는 것을 알 수 있습니다.
다음은 인스턴스를 참조하는 예를 보겠습니다.
class Counter {
var count = 0
func increment() {
self.count += 1
}
}
self.count += 1 여기서 self.count는 현재 인스턴스의 count 속성을 가리킵니다. 인스턴스 속성 count의 값을 1만큼 증가시킨다는 의미를 가지고 있습니다.
self를 사용하지 않더라도 count += 1이라고 쓸 수 있지만, self를 사용하면 해당 속성에 현재 인스턴스에 속해 있음을 명확히 나타낼 수 있습니다. 코드 가독성을 높힐 수 있고, 코드가 복잡해진다면 실수를 줄이는 데 도움이 됩니다.
출력하게 된다면
class Counter {
var count = 0
func increment() {
self.count += 1
print("count: \(self.count)")
}
}
let counter = Counter() // count는 초기값 0
counter.increment()
counter.increment()
counter.increment()
counter.increment()
counter.increment()
counter.increment()
counter.increment()
increment() 메서드가 호출될 때마다 self.count += 1이 실행되어, count 속성의 값이 1씩 계속하여 증가하는 것을 확인할 수 있습니다.
다음으로 super을 확인해보겠습니다.
super
super를 사용하여 부모 클래스의 기능을 유지하고 확장하기
class Animal {
func sound() {
print("Animal makes a sound")
}
}
class Dog: Animal {
override func sound() {
super.sound()
print("Dog barks")
}
}
상속을 통해 부모 클래스의 속성과 메서드를 자식 클래스에서 재사용할 수 있습니다.
하지만 부모 클래스의 기본 동작을 유지하면서 자식 클래스에서 추가적인 동작을 구현하고 싶을 때 super을 사용하면 매우 유용합니다.
super란
자식 클래스에서 부모 클래스의 메서드를 호출할 때 사용하는 키워드입니다.
이를 통해 자식 클래스는 부모 클래스의 기본 기능을 그대로 유지하면서, 자신만의 추가적인 기능을 추가할 수 있게 됩니다.
위 코드를 출력한다면
Animal makes a sound
Dog barks
의 출력 결과를 확인할 수 있습니다.
부모 클래스의 기본 동작을 유지하면서 자식 클래스에서 추가 된 기능 모두 구현 된 모습을 확인할 수 있습니다.
잘못된 내용 혹은 오타가 있거나 더 좋은 내용 피드백은 언제나 환영입니다 :)
'Apple > Swift' 카테고리의 다른 글
[iOS/Swift] 오버라이딩(Overriding) 이란? (1/2) (0) | 2024.08.26 |
---|---|
[iOS/Swift] 상속(Inheritance) 이란? (2) | 2024.08.25 |
[iOS/Swift] 형식 속성(Type Property) 이란? (0) | 2024.08.13 |
[iOS/Swift] 계산 속성(Computed Properties) 이란? (0) | 2024.08.11 |
[iOS/Swift] 저장 속성(Stored Property) 이란? (2/2) (0) | 2024.08.10 |