이번 포스팅에서는 메서드에 대해서 알아보겠다.
참고로 함수가 위치하고 있는 곳, 또는
사용되는 범위 등에 따라서
함수인지 메서드인지
호칭만 달리 정해진다.
모듈 전체에서 사용 - 함수
구조체, 클래스, 열거형등 특정 타입에 연관되어 사용 - 메서드
따라서 기본적인 함수의 형태를 다루었던
저번 함수 포스팅의 연장선이라고 할수 있겠다.
Instance Method
먼저 인스턴스 메서드를 보자면
특정 타입의 인스턴스(객체)에 속한 함수라고 할 수 있다.
인스턴스 내부의 프로퍼티 값을 변경한다거나
특정 연산 결과를 반환하는등
인스턴스와 관련된 기능을 실행한다.
하단 코드를 보겠다.
add라는 인스턴스 메서드를 호출했을때
someValue라는 인스턴스 프로퍼티의 값을 수정하고있다.
이와 같이 자신의 프로퍼티 값을 수정할 때
class의 인스턴스 메서드는 딱히 신경써줘야할 부분이 없다.
class MyClass {
var someValue: Int = 1
func add() {
someValue += 1
}
}
하지만 참조 타입의 class가 아닌
값타입의 성격을 띄고 있는
구조체나 열거형에서는
메서드를 사용하여 자신의 프로퍼티의 값을 변경할때
메서드 앞에 mutating 키워드를 붙여서
해당 메서드가 인스턴스 내부의 값을
변경한다는것을 명시해주어야한다.
struct MyStruct {
var someValue: Int = 1
mutating func add() {
someValue += 1
}
}
Type Method
두번째로 볼 메서드는 타입 메서드이다.
타입 자체에서 호출이 가능하며
메서드 앞에 static 키워드를 붙혀서 사용하고
class에서는 특별히 class 키워드를 붙혀 사용할 수도 있다.
class에서
static 키워드로 정의를 한다면
상속 후 메서드 재정의가 불가능하고
class 키워드로 정의를 한다면
상속 후 메서드 재정의가 가능하다.
class SomeClass {
static func someStaticFunc() { // 상속후에 override 못함
...
}
class func soneClassFunc() { // 상속후에 override 가능
...
}
}
struct SomeStruct {
static func someStaticFunc() {
...
}
}
메서드 내에서 self 사용
모든 인스턴스는
인스턴스 자기 자신을 가리키는 프로퍼티인
self 프로퍼티를
암시적으로 가지고 있다.
일반적으로 인스턴스를 더 명확히 지칭하고 싶을때 사용한다.
하단 코드에서
someFunc 메소드 내부를 보자면
메서드의 매게변수 값을
someValue에 할당하는데에 있어
문제 되는게 없다.
class MyClass {
var someValue: Int = 1
func someFunc(value: Int) {
someValue = value
}
}
하지만 아래와 같이 메서드의 매개변수명과
프로퍼티명이 같다고 했을때
컴파일러는 someValue를
클래스의 프로퍼티가 아닌
메서드의 매게변수로 먼저 인식하게
되버리는 현상이 생긴다.
메소드 내에서 컴파일러가 인식하는 순서를 잠깐 보자면 아래와 같다.
1. 메서드 내부에 선언된 지역변수를 찾다가
2. 찾는데 실패하면 메서드의 매개변수,
3. 그다음은 인스턴스의 프로퍼티를 찾으면서
컴파일러가 어느 위치의 someValue인지 유추를 하게한다.
인스턴스 자기 자신을 가리키는 프로퍼티인 self를 사용하여
컴파일러가 원치 않는 프로퍼티를 유추하지 못하게 주의해줘야한다.
class MyClass {
var someValue: Int = 1
func someFunc(someValue: Int) {
self.someValue = someValue
}
}
'Swift_Grammar' 카테고리의 다른 글
[Swift_Library] ProgressHUD (0) | 2021.01.14 |
---|---|
[Swift_Grammar] Initialization (0) | 2021.01.12 |
[Swift_Grammar] Property (0) | 2020.12.31 |
[Swift_Grammar] 구조체와 클래스 (0) | 2020.12.30 |
[Swift_Grammar] Optional (0) | 2020.12.28 |