11: structs 2

그루두·2024년 4월 20일
0

100 days of SwiftUI

목록 보기
16/108

100 days of swiftui: 11
https://www.hackingwithswift.com/100/swiftui/11

access control

사과를 저장하거나 꺼내서 먹을 수 있는 냉장고를 다음 예시로 설정했다.

struct Refrigerator {
    var apples = 0
    
    mutating func storeApples(count: Int) {
        apples += count
    }
    mutating func eatApples(count: Int) -> Bool {
        if count > apples {
            return false
        } else {
            apples -= count
            return true
        }
    }
}

var oneRefrigerator = Refrigerator()
oneRefrigerator.storeApples(count: 5)
if oneRefrigerator.eatApples(count: 3) {
    print("Now we have \(oneRefrigerator.apples) apples in the refrigerator")
}

결과:

Now we have 2 apples in the refrigerator

그러나 위의 예시는 Refrigerator의 멤버 변수인 apples를 직접 값을 입력해서 변경할 수도 있다. 이를 금지하고 메소드를 통해서만 값을 변경하게 설정하려면 access control을 사용하면 된다.

access control의 종류:
1. private: struct 안의 것만 접근 가능함
2. fileprivate: file 안의 것만 접근 가능함
3. public: 누구나 접근 가능함
4. private(set): 누구나 read할 수 있지만, struct 안의 것만 접근 가능함

다시 예시로 돌아오자면, struct의 밖에서 apples 값을 확인하고 싶으나, method인 storeAppleseatApplesapples 값을 변경하게 하려면 private(set)을 사용하면 된다.

private(set) var apples = 0


(직접 변경 불가능)

❗️private을 사용하는 멤버 변수의 값이 설정되어 있지 않은 경우 initializer를 직접 설정해야 한다. 이때 자동적으로 제공하면 memberwise initializer는 사용할 수 없다.

코드 파일
https://github.com/soaringwave/Ios-studying/commit/c0518154a03611570d9b72c3d3c85867091eaf21

static properties

instance를 생성하지 않고도 struct를 활용하는 방법이 있다. 바로 static을 사용하면 된다.

struct House {
    static var members: [String] = []
    
    static func addMember(newMember: String) {
        members.append(newMember)
    }
}

House.addMember(newMember: "a cat")
print(House.members)

결과:

["a cat"]

static property인 membersaddMember()House 자체에 속한다. 그래서 struct의 멤버 변수를 변화하는 addMember()는 mutating 키워드를 작성하지 않아도 된다.

코드 파일
https://github.com/soaringwave/Ios-studying/commit/58a736b2c8c6922118457bd68065358a3b2408cc

위처럼 static property로만 struct를 구성할 수도 있지만, non-static property와도 함께 사용할 수도 있다. 이땐 non-static에서 static으로만 접근이 가능하다. 예시로 non-static을 instance라고 생각하고 static을 특정 static 멤버 변수라고 생각하면 이해가 쉽게 된다.

추가 설명
https://www.hackingwithswift.com/quick-start/beginners/static-properties-and-methods

위 링크에서 작자는 static property를 두 가지 경우에 활용한다고 한다.

  1. 앱에서 자주 쓰이는 정보를 정돈할 때
struct AppData {
    static let version = "1.3 beta 2"
    static let saveFilename = "settings.json"
    static let homeURL = "https://www.hackingwithswift.com"
}

이러면 어디서든 AppData.version 등을 출력해서 정보를 알아낼 수 있다.

  1. 예시를 활용할 때
struct Employee {
    let username: String
    let password: String

    static let example = Employee(username: "cfederighi", password: "hairforceone")
}

내가 struct를 만들고 이를 활용해보기 위해서는 instance를 만들고 값을 지정하는 과정을 거쳐야 하는데, 위의 경우엔 Employee.example로 간단히 활용할 수 있다.

struct LegoBrick {
	static var numberMade = 0
	var shape: String
	var color: String
	init(shape: String, color: String) {
		self.shape = shape
		self.color = color
		LegoBrick.numberMade += 1
	}
}

그리고 위처럼 초기화 하면 된다.

아직 특정 범위에서 어떻게 설정하고 활용하는지에 대해서 헷갈려서 퀴즈를 다시 풀면서 감을 잡아야겠다.

퀴즈
https://www.hackingwithswift.com/review/sixty/static-properties-and-methods

profile
계속 해보자

0개의 댓글

관련 채용 정보