개발하는 뚝딱이

[swift] 메소드 (method) 본문

swift

[swift] 메소드 (method)

개발자뚝딱이 2020. 4. 27. 23:35

책 <스위프트 프로그래밍 3판 ;야곰 지음> 을 정리한 글입니다.

 

 


메소드

- 특정 타입에 관련된 함수

- 클래스, 구조체, 열거형 등은 실행하는 기능을 캡슐화한 인스턴스 메소드를 정의할 수 있음

- 타입 자체와 관련된 기능을 실행하는 타입 메서드를 정의 할 수 있음


 

 

1. 인스턴스 메소드

- 특정 타입의 인스턴스에 속한 함수

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: 3) // Jump to 3
// Level 3

 

- 클래스와 달리 struct나 enum에서 메소드를 통해 프로퍼티 값을 변경할 때 func 키워드 앞에 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
    }
}

var levelStructInstance: LevelStruct = LevelStruct()
levelStructInstance.levelUp() // Level Up!
// Level 1

levelStructInstance.levelDown() // Level Down!
// Level 0

levelStructInstance.levelDown() // Level Down!
// Level -1
// Reset!
// Level 0

levelStructInstance.jumpLevel(to: 3) // Jump to 3
// Level 3

 

 

2. self 프로퍼티

- 모든 인스턴스는 암시적으로 자기 자신을 가리키는 self 프로퍼티를 가짐 (자바의 this와 비슷한 개념)

- 인스턴스 메서드에서 self는 인스턴스를 가리키지만, 타입 메서드의 self는 타입을 가리킴

 

- 매개변수로 넘어온 값이 아니라 클래스의 프로퍼티를 가리키기 위해 self 사용

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

 

- 값 타입 인스턴스 자체의 값을 self를 이용하여 치환할 수 있음

- class 인스턴스는 참조 타입이라서 self 프로퍼티에 다른 참조를 할당할 수 없음

- struct나 enum은 self 프로퍼티를 사용하여 자신 자체를 치환할 수 있음

class LevelClass {
    var level: Int = 0
    
    func reset() {
        self = LevelClass() // 오류! self 프로퍼티 참조 변경 불가
    }
}


struct LevelStruct {
    var level: Int = 0
    
    mutating func levelUp() {
        print("Level Up!")
        level += 1
    }
    
    mutating func reset() {
        print("Reset!")
        self = LevelStruct()
    }
}

var levelStructInstance: LevelStruct = LevelStruct()
levelStructInstance.levelUp() // Level Up!
print(levelStructInstance.level) // 1

levelStructInstance.reset() // Reset!
print(levelStructInstance.level) // 0

enum OnOffSwitch {
    case on, off
    mutating func nextState() {
        self = self == .on ? .off : .on
    }
}

var toggle: OnOffSwitch = OnOffSwitch.off
toggle.nextState()
print(toggle) // on


var classA: LevelClass = LevelClass()
var classB: LevelClass = classA
classB = LevelClass()

 

 

3. 타입 메소드

- 타입 자체에 호출이 가능한 메소드 (클래스 메소드와 같은 개념)

- static 키워드 사용

class AClass {
    static func staticTypeMethod() {
        print("AClass staticTypeMethod")
    }
    
    class func classTypeMethod() {
        print("AClass classTypeMethod")
    }
}

class BClass: AClass {
    // 오류! override 불가
    override static func staticTypeMethod() {
        
    }
    
    override class func classTypeMethod() {
        print("BClass classTypeMethod")
    }
}

AClass.staticTypeMethod() // AClass staticTypeMethod
AClass.classTypeMethod() // AClass classTypeMethod
BClass.classTypeMethod() // BClass classTypeMethod
struct SystemVolume {
    static var volume: Int = 5
    
    // 타입 프로퍼티를 제어하기 위해서는 타입 메소드를 사용해야 함
    static func mute() {
        self.volume = 0
    }
}

class Navigation {
    var volume: Int = 5
    
    func guideWay() {
        SystemVolume.mute()
    }
    
    func finishGuideWay() {
        SystemVolume.volume = volume
    }
}

SystemVolume.volume = 10

let myNavi: Navigation = Navigation()

myNavi.guideWay()
print(SystemVolume.volume) // 0

myNavi.finishGuideWay()
print(SystemVolume.volume) // 5

 

 

 

 

 

 

 

 

 

 

 

'swift' 카테고리의 다른 글

[swift] 인스턴스 생성 및 소멸  (0) 2020.05.01
[swift] 옵셔널  (0) 2020.04.28
[swift] 프로퍼티(property)  (0) 2020.04.15
[swift] 구조체(struct)와 클래스(class) 비교  (0) 2020.04.08
[swift] 연산자  (0) 2020.04.06