Notice
Recent Posts
Recent Comments
Link
大器晩成
타입 메서드 본문
타입 메서드(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 |