인스턴스 메서드(Instance Method) / 타입 메서드(Type Method)

Jee.e (황지희)·2022년 3월 9일
0

Methods

  • 클래스, 구조체, 열거형과 관련된 함수를 메서드 라 한다.
  • 특정 타입의 인스턴스에서 실행할 수 있는 메서드인 인스턴스 메서드 와 타입 자체에서 호출할 수 있는 메서드인 타입 메서드 가 있다.
  • Objective-C 의 타입 메서드는 클래스에서만 선언이 가능했던 반면, Swift의 타입 메서드는 클래스, 구조체, 열거형에서 선언이 가능하다.



인스턴스 메서드 (Instance Methods)

  • 인스턴스 메서드는 특정 클래스, 구조체, 열거형의 인스턴스에 속하는 메서드 이다.
  • 인스턴스 메서드를 통해, 인스턴스 내의 값을 제어 / 변경할 수 있다.

✅ Self Property

모든 프로퍼티는 암시적으로 인스턴스 자체 를 의미하는 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

  • 구조체와 열거형은 값 타입 이라, 기본적으로 인스턴스 메소드 내에서 프로퍼티를 변경할 수 없다.
  • 하지만, 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 키워드와 함께 사용할 수 있다.
두 코드의 동작은 완전히 동일하다.




타입 메서드 (Type Methods)

  • 타입 자체에서 호출해 사용하는 메서드이다.
  • 해당 메서드 앞에 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 메서드 구현 시
  • 테스트에 필요한 메서드 구현 시



참고문서
공식문서 번역

profile
교훈없는 경험은 없다고 생각하는 2년차 iOS 개발자입니다.

0개의 댓글