Featured image of post Swift에서의 nameSpace

Swift에서의 nameSpace

NameSpace란?

관련 있는 값들을 묶어 놓은 공간을 nameSpace 라고 하는데, swift에서는 namespace를 아직 지원하지 않고 있다. (SwiftUI에서는 nameSpace를 지원하고 있는 듯 하다)

프로젝트 파일 안에서 사용되고 있는 메시지들을 묶어서 한곳에서 관리하면 나중에 메세지를 변경해야 할 일이 있을 때 일일이 고쳐주지 않고 nameSpace를 수정하고 프로그램 상에서 호출하여 사용하면 유지보수 측면에서 좋을 것 같아 찾아보았다.

일반적으로 사용되는 방식은 Struct를 사용하거나 Enum을 활용하는 방법으로 해결할 수 있다.

struct 구조체를 이용하는 방법

1
2
3
4
5
6
struct GameMessages {
  private init() {}
  static let inputWrong: String = "잘못된 입력입니다. 다시 시도해주세요."
  static let endGame: String = "게임종료"
  static let victory: String = "의 승리!"
}

프로그램 안에서 사용되는 텍스트를 묶어서 GameMessages라는 구조체를 만들어 주고 static 키워드를 이용하여 타입 프로퍼티로 생성해 주었다.

사용할 때에는

1
2
let wrongInput = GameMessages.inputwrong
let gameFinish = GameMessages.endGame

으로 선언하여 사용한다.

struct로 nameSpace를 사용할 때의 문제점은 다른 개발자가 실수로 인스턴스를 생성할 수 있다는 점이다. 인스턴스 생성을 막기 위해 private init() {}을 써주어서 인스턴스화 할 수 없도록 만들어준다.

enum 열거형을 이용하는 방법

다른 방법으로는 enum을 이용하여 nameSpace를 설정해주는 방법이다.
case를 설정하지 않고 enum을 만들 수 있나요? 네! 방법이 있습니다.

1
2
3
4
5
enum GameMessages {
    static let inputWrong: String = "잘못된 입력입니다. 다시 시도해주세요."
    static let endGame: String = "게임종료"
    static let victory: String = "의 승리!"
}

case가 없는 열거형을 사용하면 실수로 인스턴스화를 할 수 없고 nameSpace의 역할을 할 수 있도록 설정가능하다.

유지보수의 측면에서는 한 곳에서 여러개의 리터럴을 관리하고 수정할 수 있어서 nameSpace를 사용하는 편이 좋겠지만, 메모리 측면에서는 프로그램이 실행되면 모든 static 상수가 메모리에 탑재되므로 메모리 관리 측면에서는 좋은 방법이 아닐 수도 있다는 생각이 들었다.

Reference