본문 바로가기
Swift

Static과 Class에 관하여

by iOS 개린이 2023. 1. 31.

-클래스, 구조체, 열거형 안에서 선언되는 함수나 변수/상수를 메소드와 프로퍼티라고 부른다. 

-Static과 Class는 프로퍼티나 메소드의 타입을 정의하기 위해 사용하는 키워드이다.

-메소드 앞에 키워드가 붙으면 "타입 메소드", 프로퍼티 앞에 키워드가 붙으면 "타입 프로퍼티" 라고 정의한다.

 

타입 메소드

평소처럼 메소드를 선언해보았다.

class Student {
   func instanceMethod() { }
}

 

안에 있는 메소드를 사용하기 위해서는 Student 클래스의 인스턴스를 만들어 함수를 실행해야 한다.

따라서 우리가 평소에 사용하는 인스턴스를 만들어 실행하는 메소드의 이름은 인스턴스 메소드라고 한다.

 

 

ex) 타입 메소드의 정의

class Student {
   static func staticMethod() { }
   class func classMethod() { }
}

 

요것이 바로 타입 메소드의 정의이다.

 

 

타입 메소드의 특성

-static이나 class 키워드가 붙으면 인스턴스를 생성하지 않고도 타입을 통해 바로 접근이 가능하다.

 

class Student {
   func instanceMethod() { }
   static func staticMethod() { }
   class func classMethod() { }
}

let student : Student = Student()
student.instanceMethod               //평소 인스턴스 메소드에 접근할 때

Student.staticMethod()      //타입을 통해 바로 접근
Student.classMethod()       //타입을 통해 바로 접근

 

인스턴스 메소드와 달리 Student라는 타입을 통해 접근이 가능하다.

 

Static과 Class의 차이

-이 둘의 차이는 오버라이딩의 가능 여부다.

Static을 사용하면 오버라이딩이 불가능한 것을 의미하고, Class를 사용하면 오버라이딩이 가능하다.

 

class SubStudent : Student {

  override static func staticMethod() {}  //에러발생 static은 오버라이딩 불가

  override class func classMethod() {}    //정상 class 메소드 오버라이딩 가능
}

 

-이전에  final 키워드를 붙이면 마지막 클래스로 상속 즉, 오버라이딩이 불가능해진다는 것을 배웠다.

-classMethod 앞에 final 키워드를 붙이면 staticMethod 와 같은 것이다.

 

 

 

타입 프로퍼티

-타입 메소드와 동일하게 프로퍼티 앞에 Static이나 Class 키워드를 붙여주면 타입 프로퍼티가 된다.

-저장 프로퍼티와 연산 프로퍼티 앞에 키워드를 붙여 타입 저장 프로퍼티, 타입 연산 프로퍼티가 가능하다.

 

정의

class Student {
    static let staticProperty : String = "학생"     // 저장 타입 프로퍼티
    
    class var classProperty : String {             // 연산 타입 프로퍼티
        return "학생"     
    }
}

 

-타입 프로퍼티도 타입 메소드와 동일하게 타입을 통해 접근이 가능하고,

class 키워드를 붙이면 상속이 가능하고, static은 불가능하다.

 

 

class 키워드를 사용한 타입 프로퍼티를 만들 때 저장 프로퍼티는 불가능하고, 연산 프로퍼티만 가능하다.

 

ex)

class Student {
    class var classSaveProperty : String = "학생"     //stored properties not supported in classes!!
    
    class var classComputedProperty : String {        //정상 활동 가능
        return "학생"     
    }
}

 

-class를 이용한 저장 타입 프로퍼티는 지원하지 않는다는 에러가 발생한다.

 

 

타입 메서드, 기본 메서드 안에서 타입 프로퍼티, 기본 프로퍼티 사용하기

 

class Student {
    let saveProperty = "학생"                     // 저장 프로퍼티
    
    static let staticProperty = "학생"            // 저장 타입 프로퍼티
}

 

다음과 같이 저장 프로퍼티와 저장 타입 프로퍼티가 있을 때, 인스턴스 메소드와 타입 메소드 안에서 각각의 프로퍼티를 사용할 수 있을지에 대해서 알아보겠다.

 

 

ex) 타입 메소드 안에서 사용.

class Student {
    let saveProperty = "학생"                     // 저장 프로퍼티
    static let staticProperty = "학생"            // 저장 타입 프로퍼티
 
    static func test() {                         //타입 메소드
        
        print(saveProperty)                  //에러 발생
        print(staticProperty)                //정상 실행
    }
}

 

test라는 타입 메소드 안에 각 프로퍼티를 찍어보았을 때 저장 프로퍼티는 에러가 발생했고,

타입 프로퍼티는 타입이름 없이 접근이 가능하다.

 

 

ex) 인스턴스 메소드 안에서 사용.

class Student {
    let saveProperty = "학생"                // 저장 프로퍼티
    static let staticProperty = "학생"       // 저장 타입 프로퍼티
 
    func test() {                           //인스턴스 메소드
        
        print(saveProperty)                  //정상 실행
        print(Student.staticProperty)        //타입 이름을 통해 접근 가능
    }
}

 

test라는 인스턴스 메소드 안에 각 프로퍼티를 찍어보았을 때 저장 프로퍼티는 당연하게 실행가능하고,

타입 프로퍼티는 타입이름을 통해 접근이 가능하다.

 

 

 

 

 

 

Tip

1. 저장 타입 프로퍼티는 선언할 때 초기값을 꼭 설정해주어야 한다.

보통 프로퍼티는 인스턴스를 생성할 때마다 매번 초기화가 된다.

타입 프로퍼티는 인스턴스가 아닌 타입을 통해서 초기화가 되고, 한번 메모리에 올라가면 언제 어디서든 프로퍼티에 접근이 가능한 공유 형태이기 때문에 초기값 설정이 되어있어야 한다.

 

2. 타입 프로퍼티와 지연 저장 프로퍼티(lazy)

타입 프로퍼티는 지연 저장 프로퍼티와 같이 인스턴스 초기화 때가 아닌 프로퍼티가 불려질 때 초기화가 된다.

하지만 지연 저장 프로퍼티는 선언 시 무조건 var로 선언을 해주어야 하는데, 타입 프로퍼티는 let, var 전혀 상관없이 선언이 가능하다.

 

먼저 지연 저장 프로퍼티는 인스턴스가 초기화될 때, "값이 없음"으로 설정되었다가 프로퍼티가 불려질 때 설정한 값으로 변하기 때문에 let으로 선언해두면 "값이 없음" -> 설정 값으로 변환이 안된다. 

따라서 무조건 var로 선언해야함.

 

타입 프로퍼티는 인스턴스가 초기화될 때 아무 변화가 없고, 불려질 때 초기화가 되기 때문에 let이나 var나 전혀 상관없이 선언이 가능한 것이다.

 

 

 

 

 

Reference

https://sujinnaljin.medium.com/swift-static%EA%B3%BC-class-method-property-%ED%9A%A8%EA%B3%BC%EC%A0%81%EC%9C%BC%EB%A1%9C-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0-b336311a923c

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

https://babbab2.tistory.com/122

https://babbab2.tistory.com/120

 

'Swift' 카테고리의 다른 글

열거형에 관하여  (0) 2023.02.15
함수와 메소드의 차이  (0) 2023.02.06
오버로딩(Overloading)에 관하여  (0) 2023.01.30
서브스크립트에 관하여  (0) 2023.01.28
오버라이딩(Overriding)에 관하여  (0) 2023.01.26