본문 바로가기
Xcode/Swift - PlayGround

PlayGround) Class func 와 Static func의 차이가 머지?

by 후르륵짭짭 2021. 1. 24.
728x90
반응형

안녕하세요!! 후르륵짭짭입니다.

이번에는 Swift의 상속을 공부하면서 궁금했던 Class func와 Static func의 차이를 다뤄 볼려고 합니다!

최근에 여러가지 바쁜 일이 있어서 블로그 운영이 쫌 뜸해졌네요 ㅠㅠ.

그럼 지금 부터 다뤄보도록 하겠습니다.

 

** Class func VS Static func **. 

일단 상속을 한다는 것은 자식 클래스가 부모 클래스의 기능을 사용 할 수 도록 하는 것을 의미합니다.

그래서 Override라는 것이 있지요.

부모의 기능을 그대로 사용하지 않고 커스터 마이징 하는 것을 Override라 합니다.

class Person{
    
    var name : String = ""
    var age : Int = 0
    
    var introductionn : String {
        get{
            return "이름 : \(name), 나이 : \(age)"
        }
    }
    
    func speak(){
        print("가나다라마바사")
    }
    
    //Static Class 모두 Type 프로퍼티이다.
    //하지만 Static은 Override가 안돼고
    //Class는 Override가 가능하다.
    class func introduceClass() -> String {
        return "인류의 소원은 평화 입니다. "
    }
    
    static func typeFunction() {
        print("I'm Static typeFunction")
    }
}

Person 클래스가 다음과 같다고 할 때, 우리가 주의 해서 봐야 할 것은 다음 두 코드 입니다.

 class func introduceClass() -> String {
      return "인류의 소원은 평화 입니다. "
  }

  static func typeFunction() {
      print("I'm Static typeFunction")
  }

class func와 static func 모두 TypeProperty 입니다.

즉, 외부에서 클래스를 생성하지 않고 접근 할 수 있도록 하는 것을 의미합니다.

하지만 둘은 차이가 있습니다.

아래와 같이 Student 클래스와 University 클래스 두개 있다고 할 때

class Student : Person{
    
    var grade : String = "F"
    
    func study(){
        print("Study hard,,,,")
    }
    
    override func speak() {
        print("저는 학생 입니당 ㅠㅠ")
    }
    
    
    //Static 변수는 Override가 안되지만 Class는 가능하다
    //override static func typeFunction(){}
    
}
class UniversityStudent : Student {
    
    var major : String = ""
    
    class func introduceClass(){
        print(super.introduceClass())
    }
    
    override class func introduceClass() -> String {
        return "대학생의 소원은 C+ 입니다."
    }
    
    override func speak() {
        super.speak()
        print("대학생이죠.")
    }
}

이 둘은 모두 Person 클래스를 상속 받고 있는 상태입니다.

그런데 여기서 Class func 로 선언하면 Type메소드가 되는 것입니다.

그리고 자식 클래스에서 그 함수를 재정의 해줄 때는 아래와 같이 재정의 해줘서 사용 해 줄 수 있습니다.

//재정의
override class func introduceClass() -> String {
        return "대학생의 소원은 C+ 입니다."
}

//사용할 때
print(UniversityStudent.introduceClass() as String)

이렇게 타입 메소드 형태로 접근할 수 있습니다.

그런데 왜 저기서 타입캐스팅이 사용이 됐는지 의구심이 들 겁니다.

그게 왜 그러냐면,,, 같은 이름이 두개 있기 때문입니다.

class func introduceClass(){
        print(super.introduceClass())
}

//사용 할 때
UniversityStudent.introduceClass() as Void

이 때 class를 앞에 붙여준 이유는 부모의 Class func을 호출 하기 위해서는 호출 하는 함수도 class func이어야 하기 때문 입니다.

 

그렇다면 Class func 과 Static func의 차이는 무엇일까요?

간단합니다. 

Class func은 Override가 가능하지만 Static func은 Override가 불가능 합니다.

위에 처럼 오류가 발생 합니다.

 

지금까지 Class func과 Static func의 차이에 대해서 알아봤습니다.

요약하면 

Class func과 Static func 모두 타입 메소드 입니다.

하지만 둘의 차이는 Override가 가능한가?에 따라 다릅니다.

그리고 Class func을 Override 할 때는 같은 Class func 함수만 가능 합니다!

 

참고 사이트 : 

sujinnaljin.medium.com/swift-class-func-vs-static-func-7e6feb264147

 

[Swift] class func vs static func

타입 메소드 &타입 프로퍼티 알아보기

sujinnaljin.medium.com

 

728x90
반응형

댓글