Swift

[Swift] 메서드(Method) - 인스턴스 메서드

💡 메서드(Method)

메서드는 특정 타입에 관련된 함수를 뜻합니다.

 

클래스, 구조체, 열거형 등

👉 실행하는 기능을 캡슐화한 인스턴스 메서드 정의 가능

👉 타입 자체와 관련된 기능을 실행하는 타입 메서드 정의 가능

 

💡인스턴스 메서드

인스턴스 메서드는 특정 타입의 인스턴스에 속한 함수를 뜻합니다.

특정 타입 내부에 구현할 수 있으며 인스턴스가 존재할 때만 사용할 수 있습니다.

class LevelClass {
    // 현재 레벨을 저장하는 저장 프로퍼티
    var level: Int = 0{
        // 프로퍼티 값이 변경되면 호출하는 프로퍼티 감시자
        didSet {
            print("Level \(level)")
        }
    }

    // 레벨이 올랐을 때 호출할 메서드
    func  levelUp() {
        print("Level Up!")
        level += 1
    }
    
    // 레벨이 감소했을 때 호출할 메서드
    func levelDown() {
        print("Level Down")
        level -= 1
        if level<0 {
            reset()
        }
    }
    
    // 특정 레벨로 이동할 때 호출할 메서드
    func jumpLevel(to: Int) {
        print("Jump to \(to)")
        level = to
    }
    
    // 레벨을 초기화할 때 호출할 메서드
    func reset() {
        print("Reset")
        level = 0
    }
}

var levelClassInstance: LevelClass = LevelClass()
levelClassInstance.levelUp() // Level Up!
// Level 1
levelClassInstance.levelDown()  // Level Down
// Level 0
levelClassInstance.levelDown()  // Level Down
// Level -1
// Reset
// Level 0
levelClassInstance.jumpLevel(to: 5) // Jump to 5
// Level 5

위 예시는 LevelClass에서 level 인스턴스 프로퍼티의 값을 수정하는 코드를 가지고 있는 인스턴스 메서드를 구현한 것입니다.

 

단, 자신의 프로퍼티 값을 수정할 때 클래스의 인스턴스 메서드는 크게 신경 쓸 필요가 없지만 구조체나 열거형 등은 값 타입이므로 메서드 앞에 mutating 키워드를 붙여서 해당 메서드가 인스턴스 내부의 값을 변경한다는 것을 명시해야 합니다.

struct LevelStruct {
    var level: Int = 0 {
        didSet {
            print("Level \(level)")
        }
    }
    
    mutating func levelUp() {
        print("Level Up!")
        level += 1
    }
    
    mutating func levelDown() {
        print("Level Down")
        level -= 1
        if level<0 {
            reset()
        }
    }
    
    mutating func jumpLevel(to: Int) {
        print("Jump to \(to)")
        level = to
    }
    
    mutating func reset() {
        print("Reset")
        level = 0
    }
}

 

self 프로퍼티

모든 인스턴스는 암시적으로 생성된 self 프로퍼티를 갖습니다.

인스턴스 자기 자신을 가리키는 프로퍼티로 인스턴스를 더 명확히 지칭하고 싶을 때 사용합니다.

위의 첫 번째 예시에서 jumpLevel 메소드를 self 프로퍼티를 써서 바꾸면 다음과 같습니다.

func jumpLevel(to level: Int) {
	print("Jump to \(level)")
    self.level = level
}

메서드의 매개변수 이름이 인스턴스 프로퍼티 이름과 같을 때 좌측에 self를 붙여주면 좌측의 level이 인스턴스 프로퍼티라는 것을 명확히 할 수 있습니다.

 

또한, self 프로퍼티의 다른 용도는 값 타입 인스턴스 자체의 값을 치환할 수 있습니다. 따라서 구조체나 열거형 등은 self 프로퍼티를 사용하여 자신 자체를 치환할 수도 있습니다.

 

인스턴스를 함수처럼 호출하도록 하는 메서드

사용자 정의 명목 타입의 호출 가능한 값을 구현하기 위해 인스턴스를 함수처럼 호출할 수 있도록 하는 메서드가 있습니다.

다시 쉽게 말하자면 특정 타입의 인스턴스를 문법적으로 함수를 사용하는 것처럼 보이게 할 수 있다는 뜻입니다.

이를 사용하기 위해서는 callAsFuntion 메서드를 구현하면 되는데요. 이 메서드는 매개변수와 반환 타입만 다르다면 개수에 제한 없이 원하는만큼 만들 수 있습니다.

struct Puppy {
    
    var name: String = "멍멍이"
    
    func callAsFunction() {
        print("멍멍")
    }
    
    func callAsFunction(destination: String) {
        print("\(destination)(으)로 달려갑니다")
    }
    
    func callAsFunction(something: String, times: Int) {
        print("\(something)(을)를 \(times)번 반복합니다")
    }
    
    func callAsFunction(color: String) -> String {
        return "\(color) 응가"
    }
    
    mutating func callAsFunction(name: String) {
        self.name = name
    }
}

var doggy: Puppy = Puppy()

doggy() // 멍멍
doggy.callAsFunction()  // 멍멍

doggy.callAsFunction(destination: "집")  //집(으)로 달려갑니다
doggy(destination: "집")   // 집(으)로 달려갑니다

doggy(something: "재주넘기", times: 3)  // 재주넘기(을)를 3번 반복합니다

print(doggy(color: "무지개색")) // 무지개색 응가

doggy(name: "댕댕이")
print(doggy.name)   // 댕댕이

위의 예시를 보면 doggy()와 doggy.callAsFunction(), doggy.callAsFunction(destination: "집")과 doggy(destination: "집")은 같은 표현입니다.

 

하지만 메서드를 호출하는 것 외에 함수 표현으로는 사용할 수 없습니다.

ex) let function: (String) -> Void = doggy(destination: ) ❌ 대신 doggy.callAsFunction(destination: )로 표현

 

타입 메서드에 대한 설명은 다음 포스팅 참고해주세요 :)

2021/01/11 - [Swift] - [Swift] 메서드(Method) - 타입 메서드

 

[Swift] 메서드(Method) - 타입 메서드

💡타입 메서드 타입 메서드는 타입 자체에 호출이 가능한 메서드를 말합니다. 메서드 앞에 다음과 같은 키워드를 사용하여 타입 메서드임을 나타내줍니다. 구조체 - static 클래스 - static(상속 후

bes24.tistory.com

 

이 글은 Swift 프로그래밍 책을 읽고 내용을 정리하여 작성하였습니다.
728x90