大器晩成

타입 메서드 본문

iOS/Swift 문법

타입 메서드

zerobugpark 2024. 11. 25. 11:01

타입 메서드(Type Method)

  • 인스턴스를 생성하지 않고도 객체 타입 자체에서 호출할 수 있는 메서드를 타입 메서드라고 부릅니다.
  • 타입 프로퍼티의 속성을 메서드로 옮긴 것이 타입 메서드입니다.
  • 구조체나 열거형 클래스 모두 타입메서드를 선언할 때는 static 키워드를 사용합니다. 반면 하위 클래스에서 재정의 가능한 타입 메서드를 선언할 때는 class 키워드를 사용합니다(클래스의 경우에만).
  • class -  상속 시 재정의 가능 키워드 (static 키워드로 선언하면 상속 시 재정의 불가 -> 상속이 불가능한 것은 아니다.)
  • 이렇게 선언된 타입 메서드를 호출할 때는 인스턴스 메서드와 마찬가지로 점 구문을 이용합니다. 차이점은 인스턴스 메서드는 객체 타입의 인스턴스에 대해 호출하는 것이지만 타입 메서드는 객체 자체에 대한 호출입니다.
class Cat {
    static var species = "고양이"
    
    var name: String
    var weight: Double
    
    init(name: String, weight: Double) {
        self.name = name
        self.weight = weight
    }
    
    func sit() {
        print("\(name)가 앉았습니다.")
    }
    
    func trainning() {
        print("냐용 저는 \(Cat.species)입니다.")
        sit()
        sit()
        self.sit()
    }
    
    func changeName(newName name: String) {
        self.name = name
    }
    
    static func letmeKnow() {     // 타입 메서드에서, 타입속성에 접근시에는 타입으로 접근하지 않아도 됨
        print("종은 항상 \(Cat.species)입니다.")
        print("종은 항상 \(species)입니다.")      // Cat.species라고 써도됨 (타입 생략 가능)
    }
    
}


let nero = Cat(name: "네로", weight: 5.0)
nero.sit()

nero.changeName(newName: "검은고양이네로")
nero.sit()

// 타입 메서드의 호출
Cat.letmeKnow()


// 인스턴스 기능이 아닌, 타입 자체에 필요한 기능을 구현할때 주로 사용
// 타입 자제가 가져야 하는 공통된 기능(동작) 구현시
  • 타입 메서드는 메서드이지만, 인스턴스의 성격이 아닌 타입 자체의 성격에 가까운 메서드 일 때 사용합니다.
  • 인스턴스 메서드는 메서드의 동작 범위가 인스턴스 내부로 제한되기 때문에 두 개의 인스턴스를 생성하여 메서드를 실행하면 메서드에 의해 값이 변하더라도 해당 인스턴스에만 국한되어 값이 변하고 나머지 인스턴스에는 영향을 미치지 않습니다.
  • 그러나 타입 메서드는 객체 타입 전체에 영향을 미칩니다. 즉, 타입 메서드를 사용하여 객체의 값을 변경하면 해당 객체 타입을 사용하는 모든 곳에서 변경된 값이 적용됩니다.
  • 또한, 타입 메서드에서는 인스턴스 프로퍼티를 참조할 수 없습니다. 타입 메서드 자체에 인스턴스가 존재하지 않기 때문입니다. 타입 메서드에서 사용할 수 있는 프로퍼티는 타입 프로퍼티뿐입니다.

타입 메서드 활용 예시

#1.
Int.random(in: 1...100)

#2.
Double.random(in: 1.2...3.7)

 

타입 메서드 요약

  • 메서드이기 때문에 타입에 데이터 메모리 공간이 할당되어 있지 않습니다 (함수 주소를 저장하는 메모리 공간은 있습니다)
  • 인스턴스에 속한 속성이 아니고, 타입자체에 속한 속성이기에 내/외부에서 Type.method( )로 접근해야 합니다
  • 메서드 실행 시, 스택프레임을 만들고 타입 데이터를 사용 -> 메서드 종료 시 스택프레임이 사라짐
  • 타입에 해당하는 보편적인 동작의 경우 사용됩니다. ex) Int.random()
  • static 또는 class 키워드를 사용합니다.
    - static 키워드는 상속 시 재정의 불가하며 class 키워드를 사용 시 상속 시 재정의 가능 의미입니다.
728x90

'iOS > Swift 문법' 카테고리의 다른 글

접근 제어 (Access Control)  (0) 2024.11.25
서브 스크립트(Subscripts)  (0) 2024.11.25
인스턴스 메서드  (0) 2024.11.25
속성감시자(프로퍼티 옵저버, Property Observer)  (0) 2024.11.25
타입속성 (Type Properties)  (0) 2024.11.22