본문으로 바로가기

[Swift] 메서드(Methods)의 종류

category Swift문법 3년 전

1. 인스턴스 메서드

가장 기본적인 메서드

- 메서드 접근시, 인스턴스 이름으로 접근 -> instance.method()

- 값타입의 인스턴스(구조체, 열거형)의 인스턴스메서드에서는 인스턴스 고유의 프로퍼티 수정을 할 수 없음

  (수정할려면 mutating 키워드 필요)

class aClass {
    var num: Int
    
    init(num: Int) {
        self.num = num
    }
    
    func changeNumber(_ newNum: Int) { // 인스턴스 메서드
        num = newNum
        print("newNum --> \(newNum)")
    }
    
    func changeNumber() { // 오버로딩 지원
        print("숫자바꿈")
    }
}

var aa = aClass(num: 10)
aa.changeNumber(20) // 인스턴스 메서드 실행

/* 콘솔
 newNum --> 20
*/

struct bStruct {
    var num: Int
    
    init(num: Int) {
        self.num = num
    }
    
    mutating func changeNumber(_ newNum: Int) { // 값형식의 인스턴스 메서드에서 인스턴스 고유의
        num = newNum                       // 수정시 mutating 키워드를 붙여줘야 한다
        print("newNum --> \(newNum)")
    }
}

var bb = bStruct(num: 10)
bb.changeNumber(20) // 인스턴스 메서드 실행

/* 콘솔
 newNum --> 20
*/

2. 타입메서드

인스턴스에 속한 메서드가 아닌 타입 자체에 속한 메서드이기에 접근시 Type.method()로 접근해야함

- static 또는 class키워드를 사용한다(class 키워드를 붙이면 상속시 재정의가 가능하다 -> class 키워드는 class에서만 사용)

class aClass {
    static var num: Int = 10
    
    init() {
    }
    
    static func printNum() {
        print("num --> \(num)")
    }
    
    class func printNum2() {
        print("num --> \(num)")
    }
}

var aa = aClass()
//aa.printNum() // 인스턴스에서 접근 불가능
aClass.printNum() // 타입으로 접근

/* 콘솔
 num --> 10
*/

aClass.printNum2()

class bClass: aClass { // aClass를 상속한 bClass
    override class func printNum2() { // class키워드를 사용한 타임메서드는
        print("출력안할거임ㅅㄱ")          // 상속시 override 키워드를 사용해서 재정의 가능
    }
    
//    override static func printNum() { } // static키워드는 재정의 불가능
}

bClass.printNum2()

/* 콘솔
 num --> 10
 출력안할거임ㅅㄱ
 */

3. 서브스크립트

대괄호를 이용하여 접근가능

ex) 배열[index], 딕셔너리[key]

- 메서드 구현시 func 키워드가 아닌 subscript 키워드 사용

- 메서드 접근시 instance[파라미터] 형식으로 접근

- 파라미터 2개 이상도 구현가능

- get블록(필수구현)이랑 set블록(선택구현) 존재

- set블록에는 기본 파라미터 newValue가 제공 (set(파라미터) 형식으로 직접 파라미터 이름 설정도 가능)

- 서브스크립트 메서드 앞에 static 또는 class 키워드를 붙이면 타입서브스크립트가 됨

class aClass {
    var multipleNum: Int = 2
    
    subscript(num: Int) -> Int { // get블록만 구현시엔 get 키워드 생략가능
        return multipleNum * num
    }
}

let aa = aClass()
aa[1] // 2
aa[2] // 4
aa[3] // 6

class bClass {
    var arr = [1, 3, 5, 7, 9]
    
    subscript(index: Int) -> Int {
        get {
            return arr[index]
        } set {
            arr[index] = newValue
        }
    }
}

let bb = bClass()
bb[0]           // 1
bb[0] = 100     // set블록 수행
bb[0]           // 100

enum Name: Int {
    case Jimin, Minji, Chulsu
    
    static subscript(index: Int) -> Self? {
        if let name = Name(rawValue: index) {
            return name
        } else {
            return nil
        }
    }
}

let name = Name[0]   // Jimin
let name2 = Name[2]  // Chulsu
let name3 = Name[5]  // nil