[Swift] NameSpace 지정하기- struct vs enum
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}
아까랑 비슷하지만 struct
가 enum
으로 바꼈읍니다..!
원래 enum
하면 case
를 많이 썼죠???! 하지만 이렇게 static let
과 같은 type property도 가질 수 있답니다. (타입 프로퍼티는 또 뭔데..?! 하시는 분들은 여기를 읽고 오세요)
자 이제 초기화를 해볼까요?
let sizeInstance = Size()
// error: 'Size' cannot be constructed because it has no accessible initializers
두둥 실패했습니다!
이렇게 case
가 없는 (case-less) enum
을 쓸 때 장점은
- 뜻하지 않는 초기화를 막을 수 있고
- 순수히 namespace 로서만 작동
할 수 있다는 점!
name space로서의 enum?
좋아! enum
이 좋은거 같군. 이걸로 써야지~ 했다가..! enum
을 name space로 사용했을때 생기는 이슈가 있다는 글도.. 봤어요! ㅎㅎ
enum
은 type이기 때문에 고유해야 하는 binary에서 type 메타 데이터를 생성하거나 link 시간에 중복 기호(symbol)가 생성될 수 있다
라고 하는데.. 잘 모르겠습니다만..ㅎ 난 그냥 쓸거야. 더 자세히 보고 싶으면 여기를 참고 하시길. (혼란만 남기고 떠나기)
마무리
자자 여러분들은 name space를 어떻게 사용하고 계신가요? enum
? struct
? 아니면 다른 방법? 이미 네임 스페이스를 잘 사용하고 계신 분들은 이 글을 볼 일이 없으시려나… ㅎ
튼 궁금하니까 댓글 남겨주시면 압도적 감사겠음!
바이!