9일차 - 21.06.16

수킴·2021년 6월 16일
0

100DaysOfSwift

목록 보기
10/37
post-thumbnail

학습키워드

  • struct
  • access control
  • static properties
  • laziness

1. Initializers

이니셜라이저는 구조체를 만드는 다양한 방법을 제공하는 특수메서드입니다.

모든 구조체는 기본적으로 멤버별 이니셜라이저를 제공합니다. 이것은 구조체를 만들 때 각 속성에 대한 값을 제공하도록 요청합니다.

이니셜라이저를 하고 난 뒤 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

2. Referring to the current instance

메서드 내에서는 self 라고 불리는 특별한 상수를 얻을 수 있습니다. self 는 현재 사용중인 구조체 인스턴스를 가리킵니다.

struct Person {
    var name: String

    init(name: String) {
        print("\(name) was born!")
        self.name = name
    }
}
  • [self.name](http://self.name) 은 구조체내의 속성을 의미하고 name 은 매개변수를 의미합니다.
  • self 는 클로저에 있는 경우 자주 사용합니다.

3. Lazy properties

앱의 성능을 최적화하기 위한 방법 중 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프로퍼티를 사용하면 연산프로퍼티와 비슷하게 보이지만 연산결과를 저장하기 때문에 다시 접근할 때 작업을 다시 실행하지 않습니다. 이를 통해 코드를 실행하지 않을 때 추가 성능을 제공하고 값이 캐시되므로 반복적으로 사용할 때 추가 성능을 제공할 수 있습니다.

4. Static properties and methods

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

5. Access control

접근제어자를 사용하면 속성과 메서드를 사용할 수 있는 코드를 제한 할 수 있습니다.

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로 앱을 만들 때 우리가 접근 할 수 있는것과 할 수 없는 것을 제한하고 있습니다. 사용자가 직접 접근제한을 변경할 수 있지만 인지할 수 있도록 해주는 의미가 있습니다.

링크

100 Days of Swift - Day 9 - Hacking with Swift

profile
iOS 공부 중 🧑🏻‍💻

0개의 댓글