iOS/Swift

[Swift] static / class 키워드

YEN_ 2024. 3. 18. 23:37

 

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을 헷갈려서 막 뒤섞어 쓰던 기억이 나네요

지금 다시 보면 그걸 왜 헷갈렸지 싶어요ㅋㅋㅋ (⑉・̆⌓・̆⑉)