[Swift] 인스턴스 메서드 vs 타입 메서드

김상우·2021년 10월 28일
0

reference : https://babbab2.tistory.com/122

함수 vs 메서드

  • 함수
    func 이라는 키워드로 생성한 것

  • 메서드
    클래스, 구조체, 열거형 안에서 선언한 함수

인스턴스 메서드 vs 타입 메서드

  • 인스턴스 메서드
    아무런 수식어 없이 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 vs class func

  • 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()
  • 이 접근 범위들은 생각해보면 당연하다.
    타입 메서드는 인스턴스를 생성하지 않고 타입에 대고 접근하고,
    인스턴스 메서드는 인스턴스를 생성한 뒤에 접근하기 때문이다.
profile
안녕하세요, iOS 와 알고리즘에 대한 글을 씁니다.

0개의 댓글