간단하게 설명하면 메소드 = 함수 라고 이해하면 된다.
함수의 경우 클래스나 구조체에 정의 되어 사용되는 인스턴스 메소드나 static으로 사용되는 타입 메서드 등 여러가지 형태가 있다.
앞서 말한거 처럼 클래스나 구조체 안에 선언되서 인스턴스로 불러와서 사용되는 함수를 인스턴스 메소드라고 한다.
class Counter {
var count = 0
func increment() {
count += 1
}
func increment(by amount: Int) {
count += amount
}
func reset() {
count = 0
}
}
let counter = Counter()
counter.increment()
counter.increment(by: 5)
counter.reset()
인스턴스 메소드는 우리가 익숙한 형태로 사용한다.
인스턴스이름.메소드이름( ) 의 형태로 사용한다.
자바의 this와 비슷하게 Swift에서는 self를 지원한다.
struct someStruct{
var x:Int
var y:Int
init(x: Int, y:Int){
self.x = x
self.y = y
}
}
self는 내부 메소드등에서 변수이름이 헷갈리지 않도록 사용한다.
사실 self를 안써도 컴파일러가 알아서 암시적으로 self를 저장프로퍼티 앞에 붙여 주기때문에 필수는 아니다.
하지만 위 코드의 경우에서 컴파일러는 그냥 x는 클래스 내부 저장 프로퍼티가 아닌 함수의 인수라벨로 인식하기 때문에 이러한 경우에는 self키워드가 필수이다.
구조체나 열거형의 경우 값타입이라고 이야기 했었다.
이러한 값타입의 경우 Swift에서 인스턴스 메소드로는 내부 저장 프로퍼티의 값을 수정 할 수 없다.
이러한 한계를 해결해주는게 mutating 키워드이다.
struct Pos{
var x:Int
var y:Int
init(x: Int, y:Int){
self.x = x
self.y = y
}
mutating func changePos(x: Int, y: Int){
self.x = x
self.y = y
}
}
위 xy 좌표를 저장하는 Pos 구조체를 내부 인스턴스 메소드로 값을 변경해 주려면 mutating키워드가 들어간 changePos() 메소드를 사용해주어야 한다.
struct Pos{
var x:Int
var y:Int
init(x: Int, y:Int){
self.x = x
self.y = y
}
mutating func changePos(x: Int, y: Int){
self.x = x
self.y = y
}
}
let pos:Pos = Pos(x: 10, y: 20)
pos.changePos(x: 20, y: 40) //오류 발생
구조체의 경우 다른 포스트에서 말했듯 값타입이라 인스턴스 내부 프로퍼티를 수정이 불가능하다 비록 구조체 인스턴스 메소드라고 하더라도 예외는 없다. 불가하다
mutating함수내부에서 self는 임시 인스턴스로 사용될 수 있다.
struct Point {
var x = 0.0, y = 0.0
mutating func moveBy(x: Double, y: Double) {
self = Point(x: self.x + x, y: self.y + y)
}
}
↳ self를 완전히 새로운 인스턴스로 사용하고 있다.
이전에 이야기 했던 타입 프로퍼티의 메소드 버전이라고 생각하면 된다.
< 타입프로퍼티 >와 < 클래스와구조체 >에서 잠깐 이야기 했는데 클래스와 구조체는 타입이라고 한적이 있다.
실제로 자주 사용하는 Int, Double, Bool, String 타입들이 struct로 작성되어있다.
타입프로퍼티와 타입 메소드는 이런 타입에 붙어있는 존재들이라고 생각하면 된다.
↳ 마치 이런 핸드폰에 달고다니는 젠더키링처럼 타입에 붙어 다니면서 가방에서 꺼내지 않아도(= 인스턴스를 생성하지 않아도) 간단하게 바로바로 사용할 수 있는 존재들이 타입 프로퍼티와 타입메소드들이다.
class SomeClass {
class func someTypeMethod() {
}
static func anotherTypeMethod(){
}
}
SomeClass.someTypeMethod()
SomeClass.anotherTypeMethod()
클래스의 경우 func앞에 class키워드를 붙이거나 static키워드를 붙이면 된다 두개의 의미는 동일하게 동작한다.
구조체의 경우에는 static만 사용가능하다.(struct는 불가능)
Swift에서 메소드는 클래스나 구조체 내부에 작성된 함수를 말한다. 종류는 두가지 존재한다.
인스턴스 메소드, 타입 메소드
인스턴스 메소드는 일반적으로 사용되는 형태의 메소드로 인스턴스를 생성해서 사용한다.
타입 메소드는 static으로 작성한다, 인스턴스의 생성없이 사용이 가능하다.