📌 메서드(Methods)
특정 타입과 연관된 함수
기존 objective-C와는 다르게 Swift에서는 클래스 뿐만 아니라, 구조체, 열거형 모두 메서드를 정의할 수 있다.
1️⃣ 인스턴스 매서드(Instance Methods)
특정 클래스, 구조체, 또는 열거형의 인스턴스에 속하는 함수
인스턴스 프로퍼티에 접근하고 수정하는 방법 제공
class Counter {
var count = 0
func increment() {
count += 1
}
func increment(by amount: Int) {
count += amount
}
func reset() {
count = 0
}
}
위의 Counter 클래스는 3개의 인스턴스 매서드를 갖고 있다.
- increment() : 1씩 카운터 증가
- increment(by: Int) : 특정 정수 크기만큼 카운터 증가
- reset() : 카운터를 0으로 재설정
counter 프로퍼티 변수를 선언하여 Counter 클래스 인스턴스를 만들어보자😃
인스턴스 매서드를 호출하려면 점 구문(.)으로 접근하면 된다.
let counter = Counter()
//초기는 0
counter.increment()
// 1 증가
counter.increment(by: 5)
// 5 증가 -> 1 + 5 결과는 6
counter.reset()
// 0으로 리셋
2️⃣ self 프로퍼티
타입 인스턴스는 인스턴스 자체와 일치할 경우, self 라는 암시적 프로퍼티를 사용해 나타낼 수 있다.
현재 인스턴스의 프로퍼티나 혹은 매서드를 참조할 때는 self를 명시적으로 작성하지 않아도 된다.
func increment() {
self.count += 1
}
🔎 그렇다면 self를 붙여야 할 때는??
👉 인스턴스 매서드에서 파라미터 명과 프로퍼티 명이 일치할 때이다.
동일한 이름이 사용될 때, 파라미터 명이 더 우선시 되고, 프로퍼티를 참조하기 위해서는 self를 붙여 접근한다.
아래 isToTheRightOf 인스턴스 매서드의 파라미터 명은 x 이고, 프로퍼티 중 x 또한 존재한다.
이를 분리하기 위해 self 프로퍼티를 사용한다.
struct Point {
var x = 0.0, y = 0.0
func isToTheRightOf(x: Double) -> Bool {
return self.x > x
}
}
예시를 보자
somePoint 상수를 통해 Point 인스턴스를 생성한다.
isToTheRightOf의 매서드 파라미터는 1.0으로 주어져 있다.
self.x의 값은 4.0 파라미터 x의 값은 1.0으로 참이 되어 print 문이 출력된다.
let somePoint = Point(x: 4.0, y: 5.0)
if somePoint.isToTheRightOf(x: 1.0) {
print("This point is to the right of the line where x == 1.0")
}
// This point is to the right of the line where x == 1.0 출력
3️⃣ 인스턴스 매서드 내에서 값 타입 수정
구조체와 열거형은 값 타입.
하지만 값 타입 프로퍼티는 인스턴스 매서드 내에서 수정될 수 없다.
🔎 만약 수정이 필요하다면 어떻게??
👉 mutating 키워드를 붙여 메서드에 대한 동작을 변경하도록 함.
mutating을 붙이지 않고 func mobeBy에서 x값 y값을 변경하려고 하면 에러가 난다.
struct Point {
var x = 0.0, y = 0.0
mutating func moveBy(x deltaX: Double, y deltaY: Double) {
x += deltaX
y += deltaY
}
}
그럼 테스트를 통해 값을 확인해보자
var somePoint = Point(x: 1.0, y: 1.0)
somePoint.moveBy(x: 2.0, y: 3.0)
print("The point is now at (\(somePoint.x), \(somePoint.y))")
// Prints "The point is now at (3.0, 4.0)"
x값 1.0 y값 1.0으로 설정된 Point 인스턴스를 변수 somePoint에 할당하였다.
moveBy 메소드를 통해 x 는 2.0 y 에는 3.0을 저장해주면
somePoint.x 는 3.0 = 1.0 + 2.0 이 somePoint.y 에는 4.0 = 1.0 + 3.0 값으로 수정된다.
하지만 변수 할당이 아닌 상수로 인스턴스를 선언하였다면😮??
👉 상수에 대해서는 변경 메서드를 호출할 수 없기 때문에, moveBy 메소드를 호출했을 때 에러가 난다.
let fixedPoint = Point(x: 3.0, y: 3.0)
fixedPoint.moveBy(x: 2.0, y: 3.0) // 에러 발생
4️⃣ 변경 메서드 내에서 self 할당
위에서 작성한 변경 메소드 moveBy는 self 프로퍼티를 사용하여 나타낼 수 있다.
struct Point {
var x = 0.0, y = 0.0
mutating func moveBy(x deltaX: Double, y deltaY: Double) {
self = Point(x: x + deltaX, y: y + deltaY)
}
}
x와 y 값 자체가 변경되는 것이 아니라, moveBy 메서드는 x와 y 값이 설정된 새로운 위치로 새로운 구조체를 생성하는 것이다. ➡️ 쉽게 말해 변경 메소드를 호출하면 새로운 구조체를 생성하여 그 곳의 x와 y 값을 가져오는 것이라 할 수 있다.
열거형에서도 self 파라미터를 설정할 수 있다.
enum TriStateSwitch {
case off, low, high
mutating func next() {
switch self {
case .off:
self = .low
case .low:
self = .high
case .high:
self = .off
}
}
}
var ovenLight = TriStateSwitch.low
ovenLight.next()
// high 출력
ovenLight.next()
// off 출력
5️⃣ 타입 메서드 (Type Methods)
타입 자체에서 호출되는 메서드이다.
메서드의 func 키워드 전에 static 키워드를 작성하여 나타낸다. (static으로 작성 시, override 불가)
클래스는 class 키워드 사용(하위 클래스가 해당 메서드의 수퍼클래스 구현 재정의 가능)
SomeClass에서 타입 메서드 생성
class SomeClass {
class func someTypeMethod() {
}
}
호출하는 방법
SomeClass.someTypeMethod()
점 구문으로 호출되지만, 인스턴스를 호출하는 것이 아닌, 타입으로 타입 메서드를 호출한다 (타입 자체를 참조한다는 뜻)
⭐ 정리
인스턴스 메서드와 타입 메서드의 가장 큰 차이는 인스턴스를 만들고 호출하는 가 아닌가 이다.
class SomeClass {
// 인스턴스 메소드
func InstanceMethod() -> String {
return "Instance 입니다!"
}
// 타입 메소드
class func someTypeMethod() -> String{
return "Type 입니다!"
}
}
✅ 인스턴스 메서드 호출
var some = SomeClass()
print(some.InstanceMethod())
// Instance 입니다! 출력
✅ 타입 메서드 호출
// 인스턴스를 만들지 않고 바로 호출
print(someClass.someTypeMethod())
// Type 입니다! 출력
인스턴스 메서드와 타입 메서드에 대해 잘 정리하신 글을 참고 바란다.
자세한 내용은 링크 참고.
'IOS > Swift' 카테고리의 다른 글
[Swift] UIProgressView와 AVAudioPlayer를 활용한 타이머 구현 (0) | 2023.03.12 |
---|---|
[Swift] 서브 스크립트(Subscripts) (0) | 2023.02.13 |
[Swift] 구조체와 클래스의 프로퍼티(Properties) (0) | 2023.02.13 |
[Swift] 구조체와 클래스(Structures and Classes) (0) | 2023.02.08 |
[Swift] 열거형(Enumerations) (0) | 2023.01.16 |