1. 인스턴스(Instance) 메서드, 타입(Type) 메서드
Swift에서 메서드는 인스턴스 메서드와 타입 메서드로 나눠볼 수 있다. 인스턴스 메서드는 생성된 각각의 인스턴스에 대한 메서드라고 보면 되고 타입 메서드는 구조체나 클래스와 같은 타입 자체에 대한 메서드라고 보면 된다.
1-1. 인스턴스 메서드
인스턴스 메서드란 구조체(Struct), 클래스(Class), 열거형(enum) 내에 선언되는 메서드를 말한다.
class Person {
var name: String
var born: Int
init(name: String, born: Int) {
self.name = name
self.born = born
}
func printAge(now: Int) {
print("현재 나이는 \(now - born + 1)입니다.")
}
}
let person = Person(name: "김민수", born: 2000)
person.printAge(now: 2024)
// 현재 나이는 25살 입니다.
이때 인스턴스 메서드는 타입 프로퍼티에는 접근할 수 없다. 타입 프로퍼티는 인스턴스가 생성되지 않더라도 접근 가능한 프로퍼티이기 때문이다. 인스턴스 메서드는 각 인스턴스에 대한 메서드이기에 타입 전체에 해당되는 타입 프로퍼티에는 접근할 수 없다.
...
static var country: String = "Korea" // ❗️타입 프로퍼티
...
func printCountry() { // ❗️Static member 'country' cannot be used on instance on type 'Person'
print("출생 국가는 \(country)입니다.")
}
...
1-2. 타입 메서드
타입 메서드는 해당 타입 자체에 대한 메서드로, 인스턴스를 사용한 접근은 불가하며 항상 타입 자체를 통해 접근할 수 있다.
class Example {
static func greeting() {
print("안녕하세요~")
}
}
Example.greeting() // 안녕하세요~
let e = Example()
e.greeting() // Static member 'greeting' cannot be used on instance of type 'Example'
인스턴스 메서드에서는 접근하지 못했던 타입 프로퍼티는 타입 메서드에서 접근할 수 있다.
class Example {
static var count: Int = 0
static func greeting() {
print("\(count)번 안녕하세요~")
count += 1
}
}
Example.greeting() // 0번 안녕하세요~
Example.greeting() // 1번 안녕하세요~
Example.greeting() // 2번 안녕하세요~
2. mutating 키워드
참조형인 클래스(class)와는 다르게 값 타입인 구조체(struct)는 인스턴스 메서드 내에서 프로퍼티가 수정될 수 없다.
그러나 만약 메서드 내에서 값의 변경이 필요한 경우 mutating 키워드를 사용하면 된다.
Q. 구조체의 타입 프로퍼티를 수정할 때도 메서드에 mutating 키워드를 사용해야 할까?
A. 타입 프로퍼티는 애초에 인스턴스 메서드가 아닌 타입 메서드로만 접근할 수 있고, 이때는 mutating 키워드 없이 타입 프로퍼티를 수정할 수 있다.
3. self 키워드
인스턴스 메서드는 스스로를 뜻하는 self 라는 암시적 프로퍼티를 가지고 있다. 만약 count라는 프로퍼티를 가지고 있으면 self.count 로 접근할 수 있는 것이다.
struct Counter {
var count: Int = 0
func getCount() {
print("count: \(self.count)")
}
}
let counter = Counter()
counter.getCount() // count: 0
사실 위처럼 self.count라고 쓰지 않고 count라고만 적어도 사용할 수는 있다. 단, 클래스에서의 초기화 함수처럼 프로퍼티명과 매개변수명을 동일하게 사용한다면 메서드 내에서 이를 구별하기 위해 self 키워드를 붙여 사용해야 한다.
class Person {
var name: String
var age: Int
init(name: String, age: Int) {
self.name = name // ❗️self 키워드 사용
self.age = age
}
}
만약 같은 이름을 사용했을 때 self 키워드를 사용하지 않는다면 메서드 내에서는 프로퍼티보다 매개변수가 더 우선시되므로 다음과 같은 오류가 발생한다.
끝!
'[Programming Language] > [Swift]' 카테고리의 다른 글
[Swift] mutating 키워드란? (값 타입 인스턴스에서의 값 수정) (0) | 2024.11.17 |
---|---|
[Swift] Queue 자료 구조 (removeFirst를 popLast로 대체하기) (0) | 2024.11.16 |
[Swift] 프로퍼티 관찰자(Property Observers) (0) | 2024.11.06 |
[Swift] 프로퍼티(Property) [Stored •Computed, getter, setter, read-only] (8) | 2024.11.05 |
[Swift] 구조체(Structure) vs 클래스(Class) 차이점 (4) | 2024.11.04 |