Swift - 메서드란?
Swift - 메서드란?
메서드란?
- 클래스, 구조체 등 객체 안에 정의된 함수를 뜻함.
일반 함수와의 차이점으로는 메서드는 해당 객체에 종속되는 특징을 지녔지만, 일반 함수는 단순히 독립적인 실행 구문을 나타냄. 하지만, 보통은 혼용해서 사용함.
메서드에는 두 가지 유형이 있음.
- 인스턴스 메서드
- 타입 메서드
인스턴스 메서드
- 직접 클래스, 구조체 등의 인스턴스를 생성한 후 접근하여 사용하는 메서드.
예시
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class TestClass{
func test() -> String{
return "Hello Class Func!"
}
}
struct TestStruct{
func test() -> String{
return "Hello Struct Func!"
}
}
var testClass = TestClass()
var testStruct = TestStruct()
print(testClass.test())
print(testStruct.test())
결과
1
2
Hello Class Func!
Hello Struct Func!
self 키워드를 사용하여 해당 객체 내에 정의된 프로퍼티에 접근이 가능함.
self키워드 사용은 필수적이지 않지만, 메서드 내에서 사용되는 변수명과 프로퍼티명이 같은 경우엔 이를 구분하기 위해 필수적으로 사용됨.
예시
1
2
3
4
5
6
7
8
9
10
11
class TestClass{
var count: Int = 0
func increment(){
self.count += 1
}
}
var testClass = TestClass()
testClass.increment()
print(testClass.count)
결과
1
1
주의해야할 것은 구조체와 같은 값타입 객체는 self를 사용하기 위해선 mutating 키워드를 메서드 선언 시에 같이 붙여줘야함.
값 타입의 인스턴스 메서드는 호출 시 self가 복사본으로 전달되기 때문에 프로퍼티를 수정할 경우 원본에는 영향이 없음.
이런 문제를 해결하기 위해 mutating을 붙여줌.
예시
1
2
3
4
5
6
7
8
9
10
11
struct TestStruct{
var count: Int = 0
mutating func increment(){
self.count += 1
}
}
var testStruct = TestStruct()
testStruct.increment()
print(testStruct.count)
결과
1
1
타입 메서드
- 타입 프로퍼티와 유사하게 인스턴스를 생성한 후에 접근하는 것이 아닌 해당 클래스나 구조체에 직접 접근하여 사용함.
- 위에서 살펴본 인스턴스 메서드와는 달리 타입 메서드는 인스턴스 프로퍼티에는 접근이 불가능하며 타입 프로퍼티에만 접근이 가능함.
static,class키워드를 통해 정의 가능함.class키워드는 클래스에서만 사용이 가능함.class키워드를 통해 타입 메서드를 정의한 경우 해당 클래스를 상속받은 하위 클래스에서 재정의가 가능함.
예시
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
struct TestStruct{
static var testProperty: Int = 0
static func increment(){
self.testProperty += 1
}
}
TestStruct.increment()
print(TestStruct.testProperty)
class TestClass{
static var testProperty: Int = 0
static func increment1(){
self.testProperty += 1
}
class func increment2(){
self.testProperty += 1
}
}
TestClass.increment1()
TestClass.increment2()
print(TestClass.testProperty)
결과
1
2
1
2
위 예시에서 구조체에 정의된 메서드에는 mutating이 붙지 않은 것을 확인할 수 있음.
왜냐하면, 타입 프로퍼티는 각 인스턴스마다 값이 복사되는 것이 아닌 타입 자체에 종속되기 때문에 mutating을 붙여줄 필요가 없음.
This post is licensed under CC BY 4.0 by the author.