- 클래스, 구조체, 열거형과 관련된 함수를
메서드
라 한다.- 특정 타입의 인스턴스에서 실행할 수 있는 메서드인
인스턴스 메서드
와 타입 자체에서 호출할 수 있는 메서드인타입 메서드
가 있다.- Objective-C 의 타입 메서드는 클래스에서만 선언이 가능했던 반면, Swift의 타입 메서드는 클래스, 구조체, 열거형에서 선언이 가능하다.
- 인스턴스 메서드는 특정 클래스, 구조체, 열거형의 인스턴스에 속하는 메서드 이다.
- 인스턴스 메서드를 통해, 인스턴스 내의 값을 제어 / 변경할 수 있다.
모든 프로퍼티는 암시적으로
인스턴스 자체
를 의미하는self
프로퍼티를 갖는다.
(self
를 사용해 인스턴스 자체를 참조 )
class Game {
var score = 0
func whenYouWin() {
score += 1
}
func whenYouLose(score: Int) {
self.score -= score
}
}
위 코드를 예로
self
를 붙이지 않아도 등록된 메서드 / 프로퍼티라고 자동으로 인식self
키워드를 붙여주어야 한다.whenYouWin()
의 score에는 붙지 않은 self 가 whenYouLose(score: Int)
score에는 존재하는 이유
- 구조체와 열거형은
값 타입
이라, 기본적으로 인스턴스 메소드 내에서 프로퍼티를 변경할 수 없다.- 하지만,
mutating
키워드를 메서드 앞에 붙이면 변경이 가능해진다.
( 메서드의 계산이 끝난 후, 원본 구조체에 그 결과를 덮어쓰는 것으로 값을 변경 )
struct Season {
var now = "봄"
mutating func changeToSummer() {
now = "여름"
}
}
var changeSeasons = Season()
changeSeasons.changeToSummer()
❗️ 구조체에서 mutating
을 사용하기 위해서는, 위 코드처럼 인스턴스를 변수로 선언해주어야 한다.
struct Season {
var now = "봄"
mutating func changeToSummer() {
self = Season(now: "여름")
}
}
위 코드처럼 self
키워드와 함께 사용할 수 있다.
두 코드의 동작은 완전히 동일하다.
- 타입 자체에서 호출해 사용하는 메서드이다.
- 해당 메서드 앞에
static
/class
키워드를 붙여 사용한다.- 인스턴스를 생성 할 필요 없이
타입.타입메서드
로 호출해 사용한다.- 타입 메서드에서의 self는 인스턴스가 아닌 타입을 가리킨다.
키워드 | 설명 |
---|---|
static | 서브클래스에서 오버라이드 할 수 없다. |
class | 서브클래스에서 오버라이드 할 수 있는 타임 메서드 이다. |
class Season {
var now = "봄"
static func changeToSummer() {
now = "여름" // 컴파일 오류
}
}
위 코드를 작성 시, 컴파일 오류가 난다.
아래와 같이 var now
에 똑같이 static
을 붙여주어야 한다.
class Season {
static var now = "봄"
static func changeToFall() {
now = "가을"
}
}
Season.changeToFall()
오류가 나는 이유?
타입 메서드는 빌드 타임에 확정이 된다.
반면, 변수는 런타임에 확정이 되기 때문에 컴파일 오류가 발생된다.
때문에static
키워드가 붙은 프로퍼티에만 접근이 가능하다.
쉽게 말해, 타입 메서드는 인스턴스를 선언 할 필요가 없다. ( 메모리가 미리 할당됨 )
메모리에 할당되지 않은 인스턴스에 접근이 불가능하다.
타입 메서드는 언제 사용하는가?
- 인스턴스보다는 타입 자체와 연관될 때
- Factory 메서드 구현 시
- 테스트에 필요한 메서드 구현 시
참고문서
공식문서 번역