스태틱(Static)
💡 스태틱(Static)
• 클래스, 구조체, 또는 열거형에서 사용되며, 해당 유형과 관련된 프로퍼티나 메서드를 정의하는데 사용된다.
→ 인스턴스(instance)와는 독립적으로 작동하며, 하위 클래스에서 재정의할 수 없다.
• static 키워드는 유형 자체에 속하며 인스턴스가 아닌 유형과 연결된다는 것을 나타낸다.
→ 키워드를 사용하여 정의된 프로퍼티 및 메서드는 해당 유형의 모든 인스턴스에서 동일한 값 또는 동작을 가진다.
→ Ex. 클래스의 정적 프로퍼티는 모든 인스턴스 간에 공유됨
⸰ 따라서 정적 멤버는 인스턴스 간에 공유되어야 하는 값이나 동작에 유용함
그러니까 인스턴스를 생성하지 않고 형식(Type) 이름으로 직접 접근하여 호출이 가능하고, 메서드 선언 시 func
앞에 static
, class
가 붙으면 그 메서드는 타입 메서드(Type Method)이다.
❮ 타입 메서드(Type Method) | class 키워드와 static 키워드의 차이점 ❯
Code_01
class Fruit {
// static
static func eat() {
print("Eat the fruit")
}
// class
class func wash() {
print("Wash the fruit")
}
}
class 키워드
• class 키워드는 하위 클래스(subclass)에서 멤버를 override(재정의)할 수 있는 가능성을 제공한다.
→ 이는 상속(inheritance) 관계에서 사용된다.
• 클래스 자체에 속하는 정적(static) 멤버를 정의할 때 사용되며, 이는 인스턴스(instance)가 아니라 클래스 자체에 속하는 멤버이다.
• 클래스의 저장 프로퍼티(stored property)도 class 키워드로 정의할 수 있으며, 이는 값을 저장하고 인스턴스의 상태를 나타낸다.
static 키워드
• static 키워드는 하위 클래스(subclass)에서 멤버를 Override(재정의)할 수 없다.
• 클래스, 구조체, 열거형 등에서 사용될 수 있다.
• 인스턴스에 속하지 않고 해당 유형 자체에 속하는 멤버를 정의할 때 사용된다.
• 저장 프로퍼티(stored property)와 연산 프로퍼티(computed property) 모두에 사용할 수 있다.
class 키워드와 static 키워드의 Override(재정의)
class 키워드로 선언된 멤버는 재정의(override)가 가능하며, 하위 클래스에서 동일한 이름의 멤버를 재정의할 수 있다. 반면에 static 키워드로 선언된 멤버는 재정의가 불가능하며, 하위 클래스에서 동일한 이름의 멤버를 다시 구현할 수 없다.
표 : class 키워드와 static 키워드의 차이점
기능 | class 키워드 | static 키워드 |
재정의 가능 여부 | 하위 클래스에서 가능 | 불가능 |
사용 가능한 타입 | 클래스(class)에만 사용 | 클래스, 구조체, 열거형 등 |
속성의 유형 | computed property만 가능 | stored property 및 computed property 가능 |
사용 예시 | class var property <br> class func method() | static var property <br> static func method() |
❮ 타입 메서드(Type Method) | 호출 방법 ❯
이 타입들은 인스턴스와 상관이 없으며, eat
(Code_01)라는 Type
에만 연관이 있다.
따라서 호출 방식은,
Code_02
Fruit.sayHello()
Fruit.sayBye()
위와 같은 방식(Code_02)으로 인스턴스 생성 없이 오로지 eat
가 속해있는 Type
이름만으로 메서드를 호출할 수 있다.
❮ 타입 메서드(Type Method) | 인스턴스 프로퍼티 사용 ❯
위 이미지에서 name
(저장 프로퍼티)은 인스턴스 멤버이기 때문에 정적(static) 메서드 내에서 사용할 수 없다. 정적(static) 메서드는 클래스 자체에 속하는 것이며, 인스턴스의 프로퍼티에 접근할 수 없다. 반면에 alias
는 저장 타입 프로퍼티로서 클래스 자체에 속하므로 정적(static) 메서드 내에서 사용할 수 있다.
Code_03
class Fruit {
static let name = "Apple"
static let alias = "Sweet Apple"
static func sayHello() {
print(name)
print(alias)
}
}
따라서 name을 static으로 변경하면 정적(static) 메서드 내에서 사용할 수 있다.
또는,
class Fruit {
let name = "Apple"
static let alias = "Sweet Apple"
func sayHello() {
print(name)
print(Fruit.alias)
}
}
name
(저장 프로퍼티)는 인스턴스 멤버이므로 인스턴스 메서드 내에서 직접적으로 접근할 수 있으나, alias
는 정적(static) 프로퍼티이므로 클래스 자체에 속하며 인스턴스 메서드 내에서는 클래스 이름을 통해 접근해야한다. 따라서 위와 같이 Fruit.alias
와 같이 사용할 수 있다.
' 𝗔𝗣𝗣𝗟𝗘 > SWIFT : GRAMMAR' 카테고리의 다른 글
Swift 기초 문법 - Codable: JSON을 위한 JSON에 대한 Encoding / Decoding (0) | 2024.04.13 |
---|---|
Swift 기초 문법 - allSatisfy() (0) | 2024.03.30 |
Swift 기초 문법 - 제네릭(Generic) (2) | 2024.03.15 |
Swift 기초 문법 - 확장(Extension) (0) | 2024.03.14 |
Swift 기초 문법 - 프로토콜(Protocol) (0) | 2024.03.14 |