[Swift] NameSpace 지정하기- struct vs enum

일단 저는 struct로 하고 있었습니다만..?

naljin
7 min readAug 9, 2020

NameSpace 란?

개-하! (개발자 하이라는 뜻)

님덜 이런 코드 본적 있음여? CGSize를 리턴하는 코드예요!

func size() -> CGSize {  return CGSize(width: Size.width, height: Size.height)}

👥👤👥뭐야..👤👥👥👤👥👥👤👥👤👥👥👥👤👥👤👥👤👤👥👤👥👥👤👥👤👥👤웅성웅성..👥👥👤👥👤👥👤👥👥다짜고짜...👤👥👤👤👥👤👥👤Size는 어디서나온건데…👤👥👥👤자기만 알고..👥👤👥👤👥👥👤👥👥👤👥👤웅성웅성👥👥👥👥👤👥👤👥👥👥

희희… 저 Size는 어디서 나온 애냐면요..! 사실 이런 식으로 같은 파일 안에서 선언해주고 있었음요 ㅎㅂㅎ

struct Size {  static let width: CGFloat = 10  static let height: CGFloat = 20}

이렇게 모아져 있으니까 쓰거나 관리하기 쉬울거 같지 않나요?? 이렇게 서로 관련되어 있는 애들을 모아 놓은 공간?을 Name Space 라고 한답니다.

그리고 저 안의 프로퍼티들은 static 으로 선언되어있기 때문에 Size를 instance화 하지 않고 바로 접근할 수 있었던 거구요.

NameSpace 를 만드는 방법

저는 이렇게 struct 와 static property 를 이용해서 namespace를 쓰고 있었어요. 하지만 다른 친구에게 ‘나는 그런건 인스턴스 만들 필요가 없는 enum 씀!’ 라는 말을 듣고 마는데..!

놀랍게도 예전에 번역한 글([Swift] static과 class method, property 효과적으로 사용하기) 에서도 namespace를 enum으로 사용하고 있더라구요..

찾아보니 swift에서는 name space를 크게 두가지 방법으로 사용하고 있었는데..! 두둥탁. 지금부터 알아봅시다.

1. struct

name space를 struct로 어떻게 만들었죠? 다시 봅시다

struct Size {  static let width: CGFloat = 10  static let height: CGFloat = 20}

하지만 여기서 문제점(?)은?! struct이기 때문에 인스턴스화 할 수 있다는 것!

let sizeInstance = Size()

따로 side effect가 생기진 않겠지만..생성할 필요도 없는걸 여기저기서 만들 수 있다는 것도 싫잖아요?

private init() {} 을 통해 외부에서 생성을 막을 수도 있겠지만..! enum을 쓰면 되는데 굳이…?가 나오는거죠

2. enum

자 그럼 enum을 알아봅시다.

enum Size {  static let width: CGFloat = 10  static let height: CGFloat = 20}

아까랑 비슷하지만 structenum 으로 바꼈읍니다..!

원래 enum하면 case 를 많이 썼죠???! 하지만 이렇게 static let과 같은 type property도 가질 수 있답니다. (타입 프로퍼티는 또 뭔데..?! 하시는 분들은 여기를 읽고 오세요)

자 이제 초기화를 해볼까요?

let sizeInstance = Size()
// error: 'Size' cannot be constructed because it has no accessible initializers

두둥 실패했습니다!

이렇게 case가 없는 (case-less) enum을 쓸 때 장점은

  1. 뜻하지 않는 초기화를 막을 수 있고
  2. 순수히 namespace 로서만 작동

할 수 있다는 점!

name space로서의 enum?

좋아! enum이 좋은거 같군. 이걸로 써야지~ 했다가..! enum을 name space로 사용했을때 생기는 이슈가 있다는 글도.. 봤어요! ㅎㅎ

enum은 type이기 때문에 고유해야 하는 binary에서 type 메타 데이터를 생성하거나 link 시간에 중복 기호(symbol)가 생성될 수 있다

라고 하는데.. 잘 모르겠습니다만..ㅎ 난 그냥 쓸거야. 더 자세히 보고 싶으면 여기를 참고 하시길. (혼란만 남기고 떠나기)

마무리

자자 여러분들은 name space를 어떻게 사용하고 계신가요? enum? struct? 아니면 다른 방법? 이미 네임 스페이스를 잘 사용하고 계신 분들은 이 글을 볼 일이 없으시려나… ㅎ

궁금하니까 댓글 남겨주시면 압도적 감사겠음!

바이!

참고

--

--