study record

[Swift] static 본문

Swift/스위프트 정리

[Swift] static

asong 2022. 2. 26. 21:49

프로젝트를 리팩토링하는 과정에서 어떤 값에 대해서 전달해주기가 너무 애매한 상황이 발생했다. 그래서 임시적으로 static var로 프로퍼티를 선언해두고 다른 곳에서 접근하기 쉽도록 임시방편해두었는데, 이게 좋은 방법인지 제대로 알아두고자 작성하게 되었다.

 

스위프트에서 static은 싱글톤 패턴을 적용할 때 사용했던 적이 있었다. static을 사용하면 프로그램이 종료될 때까지 메모리에 사라지지 않고 남아있기 때문에 많이 사용하는 것은 좋지 않다고 알고 있었다.

 

static 프로퍼티는 애플리케이션 전체에서 유지되어야 하는 전역 설정을 객체 생성 없이 진행할 수 있다는 장점이 있다. 따라서 많은 객체를 생성하지 않아도 되어 비용을 줄일 수 있다. 인스턴스가 생성될 때마다 새로운 값이 필요하지 않은 경우, 중복적으로 만들어지는 것은 낭비이기 때문이다.

 

따라서 생성하는데 비용이 많이 들면서, 안전하게 재사용될 수 있는 object에 대해서는 정적으로 정의하는 것이 좋다. 그러면 해당 type에서는 비싼 object를 매번 생성하는 대신 한번만 생성하고 사용할 수 있다.

 

대표적 정의 :

스위프트에서 Static은 '타입' 프로퍼티 혹은 '타입' 함수를 의미한다. 'static'과 'class' 프로퍼티/함수와의 차이점은 'class' 프로퍼티/함수는 오버라이딩이 가능하지만, 'static'은 오버라이딩이 불가능하다는 점이다.

 

인스턴스 메서드

인스턴스 메서드는 인스턴스를 생성해야만 접근할 수 있는, 사용할 수 있는 메서드이다.

 

타입 메서드

타입 메서드는 타입으로 접근해서 사용할 수 있는 메서드이다. 타입 메서드로 선언하고 싶을 때 static 키워드를 사용한다. static 멤버는 인스턴스에서 접근해서는 사용할 수 없다.

 

class, static 둘 다 타입 메서드로 만들 수 있는데 무엇이 다를까?

단순하게 class는 오버라이딩이 가능한데, static은 오버라이딩이 불가능하다.

(오버라이딩은 슈퍼 클래스(상위 클래스)에서 선언된 메서드를 재정의하는 것이다.)

class 메서드는 상속해서 재정의할 수 있지만 static 메서드는 재정의할 수 없다.

그리고 클래스의 메서드는 class, static 둘 다 사용할 수 있지만 구조체와 열거형의 메서드는 static만 사용이 가능하다.

덧붙여 final 키워드는 오버라이딩을 방지하기 위해 사용할 수 있다.

 

+메모리 관련 정리

메모리에는

  • 코드 영역
    • Read only
  • 데이터 영역(전역 변수, 정적 변수)
    • Read, Write
    • 프로그램이 종료되어야 메모리에서 해제된다.
  • 힙 영역(클래스 인스턴스, 클로저)
    • 크기 제한 없다.
  • 스택 영역(변수, 리턴값)
    • 크기 제한 있다.

네 가지 영역으로 구성되어 있다. 우리가 알아본 static 정적 변수는 데이터 영역에 할당되어 프로그램이 종료될 때 메모리에서 해제되기 때문에 너무 많이 사용하는 것은 좋지 않을 것으로 보인다.

 

참고 :

https://sujinnaljin.medium.com/swift-static과-class-method-property-효과적으로-사용하기-b336311a923c

https://varyeun.tistory.com/entry/스위프트에서-static-키워드란-static-in-swift

https://velog.io/@kipsong/SwiftOS-메모리-구조에-대하여