본문 바로가기

난 iOS개발자/iOS

Method( Instance Method, Type Method)

728x90

특정 유형과 연관된 함수(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 }
    }
}

응 접근 불가

728x90

'난 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