본문 바로가기
Swfit

Method(메서드)란?

by GGShin 2022. 10. 25.

Java에서는 method라는 표현만 주로 사용하는 것 같았는데, 

Swift에서는 function(함수)과 method(메서드)를 섞어쓰기는 해도 이 둘에 차이가 있다는 것을 알게 되었습니다. 

 

Function과 method의 가장 큰 차이는 Class, Structure, Enumeration에 속하지 않거나 속하거나 입니다. 

 

이번에는 이 둘 중에 method에 대해서 알아보겠습니다. 공식문서에 나온 설명을 참고하면, method는 특정 타입에 관련된 함수라고 합니다. 그리고 Method에는 크게 instance methodtype method가 있습니다.

 

특정 타입과 관련된 "function(함수)"라고 문서에도 나와있듯이, method는 function의 일종인 것입니다!

 

Instance method

Instance method는 특정 타입의 인스턴스에 속한 함수입니다. 그렇기 때문에 instance를 통해서만 해당 method를 사용할 수 있습니다. Class, Structure, Enumeration의 내부에서 정의하게됩니다.  

Class 내부에 정의한 인스턴스 메소드를 예시로 확인 해보겠습니다. 

class ClassA {
    var name: String = "Unknown"
   
   //changeName 이라는 instance method 정의
    func changeName(_ name: String) {
        self.name = name
    }
}

 

이렇게 정의된 ClassA 내부의 changeName(_ name:) method는 instance method로 인스턴스가 있어야지만 해당 메소드를 호출할 수 있습니다.

 

var myAClass = ClassA()
//myAClass라는 ClassA의 인스턴스를 통해서만 changeName method 호출가능
myAClass.changeName("Geology")
print(myAClass.name) //Prints Geology

 

ClassA의 changeName method에서 사용된 self 키워드는 instance의 property를 지칭합니다.

 

 

Property의 값을 변경하는 method를 Structure나 enumeration에서 사용할 때는, method 앞에 mutating keyword를 붙여주어야 합니다 (struct와 enum이 "value type"이므로). Mutating해당 method가 instance 내부의 값을 변경한다는 것을 의미하는 키워드입니다. 

 

struct StructA {
    var name: String
    
    //mutating을 붙여주지 않으면 컴파일에러가 발생합니다.
    mutating func changeName(_ name: String) {
        self.name = name
    }
}

 

mutating을 붙여서 내부 값을 변경한다는 것을 명시해주어야 합니다. 역시나 instance method이므로 인스턴스를 통해서만 changeName 메소드를 호출할 수 있습니다.

 

var myAStruct = StructA(name: "Struct A")
myAStruct.changeName("Changed Struct")
print(myAStruct.name)

 

Type method

Type method는 type 자체로 호출이 가능한 method입니다(class method와 유사). Instance method와 마찬가지로 Class, Structure, Enumeration의 내부에서 정의합니다. Method 앞에 static keyword를 사용하여 type method임을 나타냅니다. Class type method는 static 또는 class keyword를 사용할 수 있습니다. static을 붙이게 되면 상속 후에 method override가 불가능하고 class로 정의할 때에는 가능합니다.  

 

class TypeClass {
    static func staticTypeMethod() {
        print("Static type method")
    }
    
    class func classTypeMethod() {
        print("Class type method")
    }
}

TypeClass.staticTypeMethod()
TypeClass.classTypeMethod()

 

위의 예시에서 볼 수 있는 것처럼 type method는 인스턴스가 없어도 호출이 가능합니다. 

 

Type method에서도 self keyword를 사용할 수 있습니다. 다만, 이 경우에 self는 type 그 자체를 지칭합니다. 

예시로 한 번 확인해보겠습니다. 

 

import UIKit

struct Light {
    static var brightness: Int = 90
    
    static func lowerBrightness(level: Int) {
        self.brightness -= level //self.brightness는 Light.brightness와 동일한 의미입니다.
    }
    
}

Light.lowerBrightness(level: 10)
print(Light.brightness)

 

lowerBrighteness라는 type method를 static으로 정의하였습니다. 이 메서드에서 사용된 self는 결국 Light이라는 타입을 지칭합니다. 예시에서는 self.brightness를 사용했지만, Light.brightness라고 사용해도 동일한 의미이며 Self.brightness라고 사용해도 결국 같은 의미가 됩니다. 

 


참고자료

https://docs.swift.org/swift-book/LanguageGuide/Methods.html

 

Methods — The Swift Programming Language (Swift 5.7)

Methods Methods are functions that are associated with a particular type. Classes, structures, and enumerations can all define instance methods, which encapsulate specific tasks and functionality for working with an instance of a given type. Classes, struc

docs.swift.org

https://www.geeksforgeeks.org/swift-difference-between-function-and-method/

 

Swift - Difference Between Function and Method - GeeksforGeeks

A Computer Science portal for geeks. It contains well written, well thought and well explained computer science and programming articles, quizzes and practice/competitive programming/company interview Questions.

www.geeksforgeeks.org

스위프트 프로그래밍(3편) (야곰 저)

 

https://sujinnaljin.medium.com/swift-function-vs-method-ca76a0314484

 

[Swift] function vs method

function.. 너.. 뭐.. 돼..?

sujinnaljin.medium.com

https://ayunascode.medium.com/static-keyword-swift-98b06ebc7020

 

Properties in Swift

Type properties and static keyword

ayunascode.medium.com

 

반응형