static하면 어떤게 떠오르시나요
저는 tableView의 identifier 설정하는 게 떠오르네요...
아니면 싱글톤?
어쨌든 여러곳에 사용할 수 있는 좋은 키워드죠
🩵 Static
인스턴스가 아니라 타입 자체에 속하게 될 메서드, 프로퍼티 등을 선언하기 위해서 사용합니다
Static으로 선언된 메서드와 프로퍼티는
인스턴스를 생성하지 않아도 그냥 접근해서 사용할 수 있어요
구조체, 열거형, 클래스 전부 다요!
🩵 특징
✔️ 타입 속성 + 타입 메서드
static 키워드를 통해서 선언하면
모든 인스턴스가 공유하는 값이 됩니다
예를 들어 원주율을 제공하는 프로퍼티와과 사각형의 넓이를 구하는 메소드를 제공해주는 구조체가 있다고 해 볼까요?
위에서 설명했듯이 어떠한 인스턴스에 속하는 것이 아니라 타입 그 자체에 속하게 되어서
MathConstants라는 타입으로부터 바로 사용 가능해집니다
struct MathConstants {
static let pi = 3.14159
static func square(_ value: Double) -> Double {
return value * value
}
}
let piValue = MathConstants.pi
let squearOfFour = MathConstants.square(4)
✔️ 오버라이딩 불가능
우선 오버라이딩이라는 것은
서브 클래스에서 슈퍼 클래스의 메소드, 프로퍼티, 서브 스크립트의 기능을
자신(서브 클래스)에게 맞도록 수정하는 것을 의미해요
상속받은 기능을 수정하거나 확장할 수 있고,
동일한 인터페이스를 유지하면서도 서브 클래스에 특화된 동작을 구현할 수 있습니다
class Animal {
func makeSound() {
print("동물이 소리를 냅니다")
}
}
class Dog: Animal {
override func makeSound() {
super.makeSound() // 오버라이딩
print("멍멍멍!") // 추가구현
}
}
let myDog = Dog()
myDog.makeSound() -> 동물이 소리를 냅니다 멍멍멍!
여기서는 Animal이라는 슈퍼 클래스를 Dog라는 서브 클래스가 상속하여
내부의 메서드를 super 키워드를 사용하여 오버라이딩 했네요
그리고 자신에게 맞는 새로운 부분까지 추가 구현해주었어요
✅ super 키워드
- 슈퍼 클래스를 참조하기 위해 사용합니다
- 슈퍼 클래스의 메서드, 프로퍼티, 서브 스크립트에 접근할 수 있습니다
- 주로 오버라이드 된 메서드의 안에서 슈퍼 클래스의 원본 구현을 호출하기 위해 사용합니다
🚨 class 키워드 :: 메서드 오버라이딩을 가능하게 하는 방법
static은 서브 클래스의 오버라이딩을 불가능하게 막아버린다고 했었죠?
반대로 class 라는 키워드는 서브 클래스의 오버라이딩을 허용해주는 역할입니다
func만 사용해도 잘만 쓸 수 있는데 왜 class 키워드를 붙이냐구요?
아무 키워드도 없는 func은 반드시 인스턴스를 생성해야만 사용할 수 있는 인스턴스 메소드이기 때문입니다!!
인스턴스가 아니라 타입에 속한다는 점에서 static과 결이 같죠? ㅎㅎ
class SomeClass {
var property: Int = 0
func instanceMethod() {
print("This is an instance method")
}
class func classMethod() {
print("This is a class method")
}
}
let instance = SomeClass()
instance.instanceMethod() // 인스턴스 메소드 호출
SomeClass.classMethod() // 클래스 메소드 호출
class func은 해당 메소드가 서브 클래스에서 오버라이딩 될 수 있게 허용하여
객체 지향의 특징인 다형성을 구현하고 코드의 유연성을 높여줍니다
class Animal {
class func makeSound() {
print("동물이 소리를 냅니다")
}
}
class Dog: Animal {
override class func makeSound() {
print("멍멍")
}
}
class Cat: Animal {
override class func makeSound() {
print("야옹")
}
}
Animal.makeSound() // 출력: 동물이 소리를 냅니다
Dog.makeSound() // 출력: 멍멍
Cat.makeSound() // 출력: 야옹
여기서 Animal은 모든 동물이 가질 수 있는 공통 메서드를 class func으로 정의했어요
그래서 서브 클래스에서는 class func으로 선언된 메서드를 오버라이딩 할 수 있게 됐습니다
위에 있던 오버라이딩을 설명하는 Animal 클래스와 비교해보세요
인스턴스 메서드와 클래스 메서드의 사용 차이점을 알 수 있을거에요ㅎㅎ
처음 공부하던 시기에는 접근제한자와 static을 헷갈려서 막 뒤섞어 쓰던 기억이 나네요
지금 다시 보면 그걸 왜 헷갈렸지 싶어요ㅋㅋㅋ (⑉・̆⌓・̆⑉)
'iOS > Swift' 카테고리의 다른 글
[Swift] CoW / Copy on Write (0) | 2024.03.19 |
---|---|
[Swift] Unit Test (2) 유닛 테스트 시작하기 (0) | 2024.03.07 |
[Swift]Unit Test (1) 코드 테스트의 원칙 (0) | 2024.03.06 |
[Swift] 열거형 Enumeration / 타입 안정성 (0) | 2024.03.04 |
[Swift] iOS 알림 설정 허용받기 - User Notifications (0) | 2024.03.02 |