reference : https://babbab2.tistory.com/122
함수
func 이라는 키워드로 생성한 것메서드
클래스, 구조체, 열거형 안에서 선언한 함수
- 인스턴스 메서드
아무런 수식어 없이 func 로 시작하는 메서드class KSW { // func로 시작하는 인스턴스 메서드 func introduce() { print("Hi, I'm Kim Sang Woo") } } // 인스턴스 생성 let ksw = KSW() // 인스턴스 메서드 호출 ksw.introduce()
-> 인스턴스 메서드는 "인스턴스" 와 연관된 메서드. 인스턴스를 생성해야 한다.
- 타입 메서드
-> 타입 프로퍼티는 인스턴스 생성과 상관 없이 해당 "형식"에 속한 프로퍼티 였다.
형식(Type)에 연관된 메서드로, 인스턴스 생성 없이 형식(Type) 이름만 알면 호출이 가능하다.
메서드 선언 시 func이란 키워드 앞에 static 혹은 class가 붙으면, 그 메서드는 타입 메서드이다.class KSW { // static static func introduce() { print("Hi I'm Kim Sang Woo") } // class class func sayBye() { print("Bye") } } KSW.introduce() KSW.sayBye()
이렇게 타입 메서드도 인스턴스의 생성이 필요가 없이 "KSW" 라는 타입에만 연관되어 있기 때문에, "KSW"라는 타입에 대고 호출한다.
- static func : 메서드 오버라이딩을 허용하지 않는다.
- class func : 메서드 오버라이딩을 허용한다.
class KSW { // static static func introduce() { print("Hi I'm Kim Sang Woo") } // class class func sayBye() { print("Bye") } } class KSW2: KSW { // 타입 프로퍼티 static var age = 25 // 오버라이딩 금지 // override static func introduce() {} // 오버라이딩 허용 override class func sayBye() { print("Bye Bye") } } KSW2.sayBye()
1. 인스턴스 메서드
저장 프로퍼티 접근 가능, 타입 프로퍼티는 타입을 안다면 접근 가능
2. 타입 메서드
저장 프로퍼티 접근 불가능, 타입 프로퍼티는 같은 타입이라면 타입이름 없이 접근 가능// 타입 메서드와 인스턴스 메서드의 접근 범위 class KSW3 { let name = "Kim Sang Woo" static let age = 26 // 인스턴스 메서드 func introduce() { // 저장 프로퍼티 접근 가능 print("이름은 \(name)") // 타입 프로퍼티의 타입을 안다면 접근 가능 print("나이는 \(KSW3.age)") } // 타입 메서드 class func introduce2() { // 저장 프로퍼티 접근 불가능 // print("이름은 \(name)") // 같은 타입 멤버는 타입이름 없이 접근 가능 print("나이는 \(age)") print("다른 타입 접근 : \(KSW2.age)") } } KSW3.introduce2()
- 이 접근 범위들은 생각해보면 당연하다.
타입 메서드는 인스턴스를 생성하지 않고 타입에 대고 접근하고,
인스턴스 메서드는 인스턴스를 생성한 뒤에 접근하기 때문이다.