특정 유형과 연관된 함수(Function)를 메서드라 한다.
:Class, Struct, Enum과 같은 유형과 연괸된 작업(기능)을 말한다.
Method와 Function의 차이
흔히 말하는 함수와 메서드의 차이는 클래스 내부에 정의한 함수를 메서드라고 하며, 이런 메서드와 별개로 독립적인 기능을 함수라 한다. 또 메서드는 객체의 속성을 다루기 위한 행위를 정의한 것이라는 의미도 포함되어 있다.
메서드의 종류
- 인스턴스 메서드(Instance Method)
- 타입 메서드(Type Method)
1. Instance Method
인스턴스 메서드는 특정 클래스, 구조 또는 열거형의 인스턴스로 접근 할 수 있는 메서드를 말한다.
인스턴스 메서드는 인스턴스 속성에 엑세스하고 수정하는 방법을 제공하거나, 인스턴스 목적과 연관된 기능을 제공한다.
다음 Counter 클래스를 예시로 보자.
class Counter {
var count = 0
func increment() {
count += 1
}
func increment(by amount: Int) {
count += amount
}
func reset() {
count = 0
}
}
위 Counter 클래스가 제공하는 인스턴스 메서드는 총 3개 이다.
인스턴스 메서드의 접근은 아래와 같다.
let counter = Counter()
counter.increment()
counter.increment(by: 5)
counter.reset()
인스턴스를 참조하는 Self
self유형은 인스턴스 자체와 동일한! 이라는 암시적 속성이다.
self를 통해 인스턴스 내에서 현재 인스턴스를 참조할 수 있다.
func increment() {
self.count += 1
}
Counter클래스의 참조를 갖고 멤버변수 count에 접근하여 속성을 수정했다.
Swift는 명시적으로 self를 작성하지 않아도 해당 인스턴스 내 변수명을 사용할 때 인스턴스를 참조하고 있다고 가정한다.
count -> self.count와 같다.
인스턴스 메서드 내에서 값 유형 수정
구조체와 열거형은 값 유형이다.
이들은 인스턴스 메서드로 속성을 수정할 수 없다.
만약 값 유형의 속성을 수정하고 싶다면 “mutating” 키워드를 사용하자.
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: 2.0)
somPoint.moveBy(x: 1.0, y: 3.0)
// somPoint.x = 2.0 y = 5.0
자신을 새롭게 초기화하기
struct Point {
var x = 0.0, y = 0.0
mutating func moveBy(x deltaX: Double, y deltaY: Double {
self = Point(x: deltaX, y: deltaY)
}
}
열거형도 아래와 같이 자신을 새롭게 할당할 수 있다.
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()
// ovenLight is now equal to .high
ovenLight.next()
// ovenLight is now equal to .off
2. Type Method
인스턴스에서 호출하는 메서드와 달리, 유형 자체에서 호출되는 메서드.
{특징: 인스턴스의 생성이 필요하지 않다}
Type Method 만들기
- static 키워드를 method앞에 붙여서 Type 메서드로 표시할 수 있다.
- static 과 같은 역할을 하는 {class}키워드는 구현을 재정의 할 수 있도록 한다.(override)
class SomeClass {
static func someStaticTypeMethod() {}
class func someOverrideTypeMethod() {}
}
SomeClass.someStaticTypeMethod() // ok~
SomeClass.someOverrideTypeMethod() // ok~
Type Method내에서의 Self
인스턴스의 Self는 인스턴스의 참조를 얻었다면 타입메서드 내 Self는 유형 자체를 호출한다.
아래 코드를 살펴보자.
struct LevelTracker {
static var highestUnlockedLevel = 1
static func unlock(_ level: Int) {
if level > highestUnlockedLevel { highestUnlockedLevel = level }
}
}
타입메서드 unlock은 highestUnlockedLevel이라는 타입프로퍼티에 접근한다. self가 생략되어 있지만 타입프로퍼티인highestUnlockedLevel 는 인스턴스 생성없이 타입으로 접근하기 때문에 self(유형).highestUnlockedLevel 과 같다.
만일 아래와 같았다면?
var highestUnlockedLevel = 1
static func unlock(_ level: Int) {
if level > highestUnlockedLevel { highestUnlockedLevel = level }
}
}
응 접근 불가
'난 iOS개발자 > iOS' 카테고리의 다른 글
initialization-2 (0) | 2022.04.27 |
---|---|
initialization-1 (0) | 2022.04.25 |
백그라운드모드에서 위치정보 가져오기 (BackgroundModes + LocationUpdates) (0) | 2022.03.04 |
Swift의 Property (0) | 2022.03.03 |
Timer로 작업 예약하기 (0) | 2022.02.17 |