구조체 또는 클래스 내 프로퍼티를 읽기만 가능하도록 제한 하려면 어떻게 해야 하는가?
이럴 경우 설정자setter
만 더 낮은 접근 수준을 갖도록 제한해주면 된다.
요소의 접근 수준 키워드 뒤에 private(set)을 작성 해주면 설정자의 접근수준만 더 낮도록 지정해 줄 수 있다.
*이 제한은 프로퍼티, 서브스크립트, 변수 등에 적용될 수 있다.
지금까지 알아본 프로퍼티 개념은 모두
프로퍼티이다.
이렇게 인스턴스에 속하게 되는 것은...
인스턴스 프로퍼티[Instance Property]이다
특정 타입의 인스턴스에 속하는 프로퍼티
ex) 구조체, 클래스에 속해야 하는 저장프로퍼티와 연산 프로퍼티가 바로
인스턴스 프로퍼티이다
인스턴스 프로퍼티는 인스턴스를 새로 생성할 때마다 초깃값에 해당되는 값이 프로퍼티의 값이 되고, 인스턴스마다 다른 값을 지닐 수 있다.
일반적으로 저장 프로퍼티와 연산프로퍼티는 특정 타입의 인스턴스
와 연결된다.
그러나 타입프로퍼티는
프로퍼티를 타입 자체와 연결한다
따라서 타입프로퍼티는 인스턴스프로퍼티가 아니다.
처음에는 dictionary
를 활용하여 각 과일마다 수량을 정해 준 뒤 설계할까 생각했었다.
각 딕셔너리의 key에 과일이름 그리고 value에 해당과일재고를 넣으면 효과적으로 해당 데이터를 관리할 수 있을 것이라 생각했다. 이런 생각을 공유 했더니 이번 프로젝트 같은 경우 딕셔너리가 적합한 수단이 아닐 것 같다는 피드백을 들었다.
🙋 왜 딕셔너리 사용은 적합하지 않은 상황일까? 곰곰히 생각 해 보고 나름대로 내린 결론을 남기자면 딕셔너리는 말 그대로 사전과 같이 데이터와 해당 데이터의 내용을 저장하는 용도로 사용해야 하지 쥬스메이커 처럼 수량이 변화하는 메뉴판과 같은 데이터를 다루기에는 적합하지 않을것 같다는 생각이 들었다. 사전을 펼칠 때 마다 단어의 뜻이 변화한다면 그 사전은 더이상 사전이 아닌 것이 되버리기 때문이다.
그러던 와중 enum
과 static let
을 활용 해 보라는 피드백을 반영해서 코드를 작성 해 보았다.
enum
과 static let
을 활용하여 각 과일을 타입프로퍼티로 활용하여 값을 처리하려 하였으나 처음 보는 개념이라 이해가 잘 되지 않았다. 이것을 어떻게 사용해야 하는지 꽤나 오랜시간 애를 먹었다. 🙋 또한 왜 static property
를 활용하는게 더 나은 방법일까에 대한 생각이 머릿속에 꽤나 오래 남아 있었다.
func makeStrawberryJuice() throws {
let requiredAmount: Int = 16
if FruitType.strawberry.fruitStock > requiredAmount || FruitType.strawberry.fruitStock == requiredAmount {
FruitType.strawberry.useStock(amount: requiredAmount)
}
else {
throw AppError.outOfStock
}
static property
를 활용하여 프로젝트 step1의 방향성만 잡아봤다. 인스턴스를 생성하지 않아도 각 과일의 프로퍼티를 메소드를 통해 변화를 줄 수 있다는 점이 신기했다. 추후에 더 효율적인 방향으로 수정할 예정이다.
구글링을 통해 static property를 사용하면서 얻는 이점에 대해서도 조금이나마 깨닫게 되었다. property에 static접두사를 붙여서 사용함으로써 과일이라는 정적인 개체를 instance
로 생성하지 않고도 전역변수 처럼 전체 앱에서 활용할 수 있다는 점이 큰 메리트라 생각됐고 또한 후에 배울 객체의 singleton
또한 static property
를 활용하여 만들 수 있다는 점을 고려했을 때 type레벨에서 과일 을 설정하는 것이 좀 더 알맞은 방향이라는 결론에 다다를 수 있었다.
참고:
Swift ) Properties - Stored Property(저장 프로퍼티) (tistory.com)
Swift ) Properties - Type Properties (tistory.com)
Effectively using static and class methods and properties – Donny Wals