이니셜라이저는 구조체를 만드는 다양한 방법을 제공하는 특수메서드입니다.
모든 구조체는 기본적으로 멤버별 이니셜라이저를 제공합니다. 이것은 구조체를 만들 때 각 속성에 대한 값을 제공하도록 요청합니다.
이니셜라이저를 하고 난 뒤 func
메서드를 작성하지만, 이니셜라이저가 종료되기 전에 모든 속성에 값이 있는지 확인해야 합니다.
struct User {
var username: String
init() {
username = "Anonymous"
print("Creating a new user!")
}
}
var user = User()
print(user.username)
user.username = "twostraws"
print(user.username)
// 실행 결과
Creating a new user!
Anonymous
twostraws
메서드 내에서는 self
라고 불리는 특별한 상수를 얻을 수 있습니다. self
는 현재 사용중인 구조체 인스턴스를 가리킵니다.
struct Person {
var name: String
init(name: String) {
print("\(name) was born!")
self.name = name
}
}
[self.name](http://self.name)
은 구조체내의 속성을 의미하고 name
은 매개변수를 의미합니다.self
는 클로저에 있는 경우 자주 사용합니다.앱의 성능을 최적화하기 위한 방법 중 lazy
속성을 사용하는 방법이 있습니다.
struct FamilyTree {
init() {
print("Creating family tree!")
}
}
struct Person {
var name: String
lazy var familyTree = FamilyTree()
init(name: String) {
self.name = name
}
}
var ed = Person(name: "Ed")
// lazy 키워드를 사용했기 때문에 속성에 접근하기 전까지 메모리에 로드되지 않습니다.
ed.familyTree
// 접근한 순간 print("Creating family tree!")가 출력됩니다
FamilyTree
가 지금은 많은 일을 하지 않지만 추후 많은 일을 하게될 경우 항상 필요하지 않는데 구조체를 생성하면 불필요하기 때문에 접근한 경우에만 생성하도록 lazy
를 사용하면 성능이 향상됩니다.언제 lazy를 사용해야 할까?
lazy프로퍼티를 사용하면 연산프로퍼티와 비슷하게 보이지만 연산결과를 저장하기 때문에 다시 접근할 때 작업을 다시 실행하지 않습니다. 이를 통해 코드를 실행하지 않을 때 추가 성능을 제공하고 값이 캐시되므로 반복적으로 사용할 때 추가 성능을 제공할 수 있습니다.
lazy프로퍼티의 단점
https://www.hackingwithswift.com/quick-start/understanding-swift/when-should-properties-be-lazy
https://useyourloaf.com/blog/swift-lazy-property-initialization/
static
키워드를 사용하여 속성이나 메서드를 선언하면 구조체의 모든 인스턴스에서 특정 속성 및 메서드를 공유하도록 할 수 있습니다.
struct Student {
static var classSize = 0
var name: String
init(name: String) {
self.name = name
Student.classSize += 1
}
}
let ed = Student(name: "Ed")
let taylor = Student(name: "Taylor")
print(Student.classSize)
// 실행결과
2
접근제어자를 사용하면 속성과 메서드를 사용할 수 있는 코드를 제한 할 수 있습니다.
struct Person {
private var id: String
init(id: String) {
self.id = id
}
func identify() -> String {
return "My social security number is \(id)"
}
}
let ed = Person(id: "12345")
ed.identify()
private
키워드를 사용하면 구조체 외부에서 id속성을 접근할 수 없습니다. identify()메서드를 통해서만 접근이 가능합니다.public
키워드를 사용하면 다른 모든 코드에서 속성 및 메서드를 사용할 수 있습니다.접근제어자를 사용하는 이유가 뭘까?
예를 들면, 애플의 API로 앱을 만들 때 우리가 접근 할 수 있는것과 할 수 없는 것을 제한하고 있습니다. 사용자가 직접 접근제한을 변경할 수 있지만 인지할 수 있도록 해주는 의미가 있습니다.