Swift에서 static을 사용할 때 주의해야 할 점

임혜정·2024년 7월 3일
0

static 프로퍼티는 프로그램이 실행되는 동안 계속 메모리를 차지한다. 따라서 필요한 경우에만 사용해야 한다.

static키워드를 사용하는 경우가 무엇이겠는가

static을 사용하는 때 : 인스턴스가 불필요할 때

1. 유틸리티 함수

struct UIComponents {
    
    static func makeLabel() -> UILabel {
        let label = UILabel()
        label.text = "0"
        label.textColor = .white
        label.textAlignment = .right
        label.font = .systemFont(ofSize: 60, weight: .bold)
        return label
    }
    
    static func makeVerticalStackView() -> UIStackView {
        let stackView = UIStackView()
        stackView.axis = .vertical
        stackView.backgroundColor = .black
        ⭐️stackView.spacing = ViewController.Constants.stackViewSpacing
        stackView.distribution = .fillEqually
        return stackView
    }
}

상태를 유지할 필요가 없는 함수들이다. 인스턴스를 생성하지 않고도 사용할 수 있어야한다.이 경우 UIComponents 구조체의 인스턴스를 생성하지 않고 viewcontroller에서 UIComponents.makeLabel()로 호출할 수 있다.

2. 전역적으로 사용되는 상수나 설정값

⭐️부분과 같이 전역적으로 사용되는 상수이다.
뷰컨트롤러에 static으로 선언되어 있을 것이다.

3. 공통 데이터부분, 예를들면

  • 사용자 권한 리스트를 저장하는 구조체
  • 여러부분에서 공통으로 사용하는 API키를 저장하는 구조체

4. 싱글톤 패턴


Swift에서 static을 사용할 때 주의해야 할 점

1. 메모리 사용

실행되는 동안 계속 메모리를 차지한다. 꼭 필요한지 생각해봐야한다.

2. 테스트 어려움

static 메서드와 프로퍼티는 단위 테스트를 어렵게 만들 수 있다. 모의 객체(mock)를 만들거나 의존성을 주입하기 어렵기 때문이다.

3. 상속 제한

static 메서드는 오버라이드할 수 없다. 상속을 통한 다형성이 필요한 경우 class 키워드를 사용해야 한다.

4. 스레드 안전성

static 프로퍼티에 여러 스레드가 동시에 접근할 경우 동기화 문제가 발생할 수 있다. 필요한 경우 적절한 동기화 메커니즘을 구현해야 한다.

5. 초기화 시점

static 프로퍼티는 처음 접근할 때 초기화된다. 복잡한 초기화 로직이 있는 경우 성능에 영향을 줄 수 있다.

6. 의존성 관리

static 메서드나 프로퍼티를 과도하게 사용하면 코드 간의 의존성이 높아질 수 있다. 이는 유지보수를 어렵게 만들 수 있다.

7. 싱글턴 패턴 남용

static을 사용한 싱글턴 패턴은 편리하지만, 과도한 사용은 객체 지향 설계 원칙을 위반할 수 있다.

8. 네임스페이스 오용

struct나 enum을 네임스페이스처럼 사용하고 모든 멤버를 static으로 선언하는 것은 좋지 않은 관행이다.

9. 상태 관리

static 프로퍼티는 전역 상태를 만들 수 있으며, 이는 애플리케이션의 복잡성을 증가시킬 수 있다.


유틸리티 함수, 상수, 팩토리 메서드 등 상태를 유지할 필요가 없는 경우에 주로 사용하는 것이 좋다.

profile
오늘 배운걸 까먹었을 미래의 나에게..⭐️

0개의 댓글