NameSpace는 한마디로 묶여있어야 하는 친구들을 한 번에 모아서 쓸 때나 관리하기 쉽게 만들어 놓은 공간! 집안 정리를 잘해두는 사람들의 옷 서랍장을 열면, 속옷은 속옷대로, 수건은 수건대로 딱딱 모아놓고 관련 있는 애들끼리 모아 놓은 공간을 NameSpace이라고 할 수 있겠죠?
그럼 NameSpace를 어떻게 만드는지 확인해보겠습니다.
방법 1. Struct 사용
struct Size {
staticlet width: CGFloat = 10
staticlet height: CGFloat = 20
}
멀쩡해 보이긴 하는데 이렇게 하면 문제점이 struct라서 인스턴스화할 수 있습니다. 여기서 그럼 질문으로 인스턴스가 무엇인가?
Swift에서 인스턴스는 클래스, 구조체, 또는 열거형 등의 타입을 바탕으로 만들어진 실제 객체를 의미한다고 한다..?
자! 이래도 이해가 안간다면 더 쉽게 제가 이해한걸 자동차로 예를 들어보겠습니다.
예를 들어, '자동차'라는 클래스를 생각해 볼 수 있습니다. 이 '자동차' 클래스는 자동차의 특성(색상, 모델, 제조사 등)과 행동(달린다, 멈춘다 등)을 정의하고 있습니다. 하지만 이 '자동차' 클래스 자체는 실제 자동차를 의미하는 것은 아닙니다!!!!!!!
여기서 실제 '자동차'를 만들기 위해서는 '자동차' 클래스를 바탕으로 인스턴스를 생성해야 합니다.
'자동차' 인스턴스는 '자동차' 클래스에서 정의한 특성과 행동을 가진 실제 '자동차'를 의미합니다. 예를 들어, '빨간색 페라리'나 '파란색 포르쉐' 등은 '자동차' 클래스의 인스턴스라고 할 수 있겠죠.
즉, 클래스나 구조체, 열거형은 '틀'이라면, 인스턴스는 그 '틀'을 바탕으로 만들어진 실제 '객체'라고 이해하시면 됩니다.!!
그럼 이걸 방지하고자 private init() {}을 쓰면 되는 것 아닌가? 할 수 있습니다. 그런데 여기서 private init() {} 을 쓰게 되면 인스턴스화를 방지하는 것이 아니라 오히려 오류를 발생시킵니다. struct는 기본적으로 인스턴스화가 가능한 타입이므로, private init()를 사용하면 인스턴스 생성을 제한하게 되어 네임스페이스로서의 역할을 수행하지 못하게 됩니다. 🙅♀️ 🙅♀️ 🙅♀️
그럼 이제 다른 방법은 없을까요?
방법 2. enum 사용
enum Size {
staticlet width: CGFloat = 10
staticlet height: CGFloat = 20
}
위랑 크게 다른 게 없습니다. 그냥 static에서 enum으로 바뀐 거뿐! 그럼 문제가 static let과 같은 타입 프로퍼티도 가질 수 있게 되는 건데. 여기서 그럼 새로운 의문들이 들게 될 텐데..
의문
Q1. static let이 뭐죠?
Q2. 타입 프로퍼티는 뭔데?
A1. static let 은 스위프트에서 정적 상수를 선언할 때 사용하는 키워드입니다. '정적'이라는 말은 '변하지 않는다' 또는 '고정된'이란 의미로, 즉 정적 상수는 한 번 값을 설정하면 그 이후로는 그 값이 변경되지 않는 상수를 말합니다. 여기서 'static' 키워드는 이 상수가 해당 타입 자체에 속하게 하고, 'let' 키워드는 이 상수의 값을 변경할 수 없게 합니다.
A2. 타입 프로퍼티란 무엇인가요? 타입 프로퍼티는 특정 타입에 속한 프로퍼티로, 그 타입의 모든 인스턴스가 공유하는 값입니다. 즉, 타입 프로퍼티는 특정 타입에 속하며 그 타입의 모든 인스턴스에서 같은 값을 가집니다. 'static let'으로 선언된 프로퍼티는 타입 프로퍼티의 한 예입니다.
이제 NameSpace를 사용을 해보겠습니다.
let box = Size.width * Size.height
이렇게 사용하면 되는 거겠죠?
그럼 여기서 이 enum을 인스턴스화하려고 하면?
let box= Size()
이렇게 하게 되면 또 바로 에러가 빠바바바바박! 하고 나오니깐 조심하셔야 합니다.🙅♀️ 🙅♀️ 🙅♀️
그럼 이전에 내가 만든 프로젝트에서 했던 extension에서의 color값들은 어떤 친구인지, 어떻게 바꿀 수 있을지 궁금했습니다.
//이전 코드
import Foundation
import SwiftUI
extension Color {
static let PrimaryOrange400 = Color("PrimaryOrange400")
static let PrimaryOrange300 = Color("PrimaryOrange300")
static let PrimaryOrange200 = Color("PrimaryOrange200")
static let PrimaryOrange100 = Color("PrimaryOrange100")
static let MainPage = Color("MainPage")
static let BlackWhiteWhite: Color = .white
static let StateError = Color("StateError")
static let StateSuccess = Color("StateSuccess")
static let GrayScale900 = Color("GrayScale900")
static let GrayScale800 = Color("GrayScale800")
static let GrayScale700 = Color("GrayScale700")
static let GrayScale600 = Color("GrayScale600")
static let GrayScale500 = Color("GrayScale500")
static let GrayScale400 = Color("GrayScale400")
static let GrayScale300 = Color("GrayScale300")
static let GrayScale200 = Color("GrayScale200")
static let GrayScale100 = Color("GrayScale100")
static let GrayScale50 = Color("GrayScale50")
}
이 코드도 물론 네임스페이스라고 볼 수 있다. 근데 이제 중요한 건 extension을 사용해서 기존의 iOS가 가지고 있던 Color 타입을 확장해서 내가 임의로 추가한 것이기 때문에 네임스페이스긴 한데 여기서 그럼 수정할 수 있는 것이 무엇일까? 이 글을 다 읽은 사람들은 다 알겠죠? 바로 enum을 사용하면 훨씬 깔끔하게 만들 수 있다는 거죠! 그럼 어떻게 만들었나 한번 구경을 해보자
//이후 코드
import Foundation
import SwiftUI
extension Color {
enum PrimaryOrange {
static let _400 = Color("PrimaryOrange400")
static let _300 = Color("PrimaryOrange300")
static let _200 = Color("PrimaryOrange200")
static let _100 = Color("PrimaryOrange100")
}
enum MainPage {
static let color = Color("MainPage")
}
static let BlackWhiteWhite: Color = .white
enum State {
static let error = Color("StateError")
static let success = Color("StateSuccess")
}
enum GrayScale {
static let _900 = Color("GrayScale900")
static let _800 = Color("GrayScale800")
static let _700 = Color("GrayScale700")
static let _600 = Color("GrayScale600")
static let _500 = Color("GrayScale500")
static let _400 = Color("GrayScale400")
static let _300 = Color("GrayScale300")
static let _200 = Color("GrayScale200")
static let _100 = Color("GrayScale100")
static let _50 = Color("GrayScale50")
}
}
비슷하면서도 내 눈에는 훨씬 enum으로 분리를 해서 그런지 깔끔하게 보이는데! 아주 좋다는 말이죠. 사람마다 취향 차이겠지만..