반응형
참고 사이트: iOS 프로그래밍을 위한 스위프트 기초(edwith)
참고 문서: The Swift Language Guide (한국어)
실행 환경: Xcode 12 실행 → Create a new Xcode project → macOS → Command Line Tool 선택 → Product Name, Organization Identifier 입력 후 프로젝트 생성
목차
- 스위프트(Swift) 5 배워보기 - 1. 다양한 타입
- 스위프트(Swift) 5 배워보기 - 2. 함수, 제어문, 옵셔널
- 스위프트(Swift) 5 배워보기 - 3. 클래스, 구조체, 열거형
- 스위프트(Swift) 5 배워보기 - 4. 클로저
- 스위프트(Swift) 5 배워보기 - 5. 프로퍼티
- 스위프트(Swift) 5 배워보기 - 6. 상속, 인스턴스 생성/소멸
- (계속)
프로퍼티
- 프로퍼티(Properties)는 구조체, 클래스, 열거형 내부에 구현하는 값이다.
프로퍼티 종류
- 저장 프로퍼티(Stored Properties)
- 값을 저장하고 있는 프로퍼티
- 클래스, 구조체에서만 사용 가능
- let 혹은 var로 선언 가능
- 단, 구조체를 상수로 선언(let)하면 그 구조체 인스턴스의 프로퍼티를 변경할 수 없다.
- 그러나 클래스는 상수로 선언(let)해도 프로퍼티 변경이 가능하다. -> 클래스 인스턴스는 참조 타입이기 때문
- 인스턴스 저장 프로퍼티와 타입 저장 프로퍼티, 지연 저장 프로퍼티로 구분할 수 있다.
- 지연 저장 프로퍼티는 값이 처음으로 사용 되지 전에는 계산되지 않는 프로퍼티이다.
- lazy 키워드 사용
- var로만 선언 가능
struct Student {
// 인스턴스 저장 프로퍼티
var name: String = ""
var `class`: String = "Swift"
var koreanAge: Int = 0
// 타입 저장 프로퍼티
static var typeDescription: String = "학생"
}
// 인스턴스 생성
var nyebo: Student = Student()
nyebo.koreanAge = 10
// 인스턴스 저장 프로퍼티 사용
nyebo.name = "nyebo1"
// 구조체 내의 프로퍼티가 let이 아닌 var로 선언되었기 때문에
// 값 변경 가능
nyebo.name = "nyebo2"
print(nyebo.name) // nyebo2 출력
// 지연 저장 프로퍼티
// 아래 DataImporter 클래스는 외부에서 data.txt 파일을 가져온다.
// 클래스 초기화를 하는데 많은 시간이 소요된다고 가정
class DataImporter {
var filename = "data.txt"
// 이하 데이터 가져오는 코드
}
class DataManager {
// lazy를 붙여 지연 저장 프로퍼티로 선언
// DataImporter() 초기화 시 많은 시간이 소요된다.
lazy var importer = DataImporter()
var data = [String]()
// 이하 데이터 관리하는 코드
}
// DataManger 인스턴스 manager를 생성하고
// data늘 append로 추가하여도,
// 아직 DataImporter 인스턴스는 생성되어 있지 않다.
let manager = DataManager()
manager.data.append("Some data")
manager.data.append("Some more data")
// 실제로 importer 프로퍼티에 처음 접근할 때,
// importer 인스턴스가 생성된다.
print(manager.importer.filename)
// the DataImporter 인스턴스가 생성되었습니다.
// "data.txt" 파일을 출력합니다.
- 연산 프로퍼티(Computed Properties)
- 값을 저장하고 있지 않고 특정하게 계산한 값을 반환해 주는 프로퍼티
- getter와 optional한 setter를 제공해 값을 탐색하고, 간적접으로 다른 프로퍼티 값을 설정할 수 있다.
- 클래스, 구조체, 열거형 모두 사용 가능
- var 로만 선언 가능
- 읽기 전용으로 구현 가능하나, 쓰기 전용으로는 구현할 수 없음
- 값을 저장하고 있지 않고 특정하게 계산한 값을 반환해 주는 프로퍼티
struct Student {
var name: String = ""
var `class`: String = "Swift"
var koreanAge: Int = 0
// 인스턴스 연산 프로퍼티
var westernAge: Int {
get {
return koreanAge - 1
}
set(inputValue) {
koreanAge = inputValue + 1
}
}
// get만 사용하여 읽기 전용 인스턴스 연산 프로퍼티 선언
var selfIntroduction: String {
get {
return "저는 \(self.class)반 \(name)입니다"
}
}
// 읽기 전용 타입 연산 프로퍼티
// 읽기 전용에서는 get을 생략할 수 있다.
static var selfIntroduction: String {
return "학생타입입니다"
}
}
// 타입 연산 프로퍼티 사용
print(Student.selfIntroduction) // 학생타입입니다
// 인스턴스 생성
var nyebo: Student = Student()
nyebo.name = "nyebo"
// 인스턴스 연산 프로퍼티 사용
print(nyebo.selfIntroduction) // 저는 Swift반 nyebo입니다
프로퍼티 옵저버(Property Observers)
- 프로퍼티의 값이 변경(set) 될 때마다 이를 감지할 수 있다.
- 지연 저장 프로퍼티와 연산 프로피터에는 사용할 수 없다.
- 두 가지 옵저버가 제공된다.
- willSet: 값이 저장되기 바로 직전에 호출 됨
- 새 값의 파라미터명을 지정할 수 있는데, 지정하지 않으면 기본 값으로 newValue를 사용한다.
- didSet: 새 값이 저장되고 난 직후에 호출 됨
- 바뀌기 전의 값의 파라미터명을 지정할 수 있는데, 지정하지 않으면 기본 값으로 oldValue를 사용한다.
- willSet: 값이 저장되기 바로 직전에 호출 됨
struct Money {
// 프로퍼티 옵저버 사용
var currencyRate: Double = 1100 {
willSet(newRate) {
print("환율이 \(currencyRate)에서 \(newRate)으로 변경될 예정입니다")
}
didSet(oldRate) {
print("환율이 \(oldRate)에서 \(currencyRate)으로 변경되었습니다")
}
}
// 프로퍼티 옵저버 사용 -- 기본 파라미터명 사용 시
var dollar: Double = 0 {
// willSet의 암시적 매개변수 이름 newValue
willSet {
print("\(dollar)달러에서 \(newValue)달러로 변경될 예정입니다")
}
// didSet의 암시적 매개변수 이름 oldValue
didSet {
print("\(oldValue)달러에서 \(dollar)달러로 변경되었습니다")
}
}
}
var moneyInMyPocket: Money = Money()
// 환율이 1100.0에서 1150.0으로 변경될 예정입니다
moneyInMyPocket.currencyRate = 1150
// 환율이 1100.0에서 1150.0으로 변경되었습니다
// 0.0달러에서 10.0달러로 변경될 예정입니다
moneyInMyPocket.dollar = 10
// 0.0달러에서 10.0달러로 변경되었습니다
반응형
'IT' 카테고리의 다른 글
LEMP + TALL(Tailwind, Alpine, Laravel, Livewire) 초기 설정법 (0) | 2021.07.17 |
---|---|
스위프트(Swift) 5 배워보기 - 6. 상속, 인스턴스 생성/소멸 (0) | 2021.06.08 |
스위프트(Swift) 5 배워보기 - 4. 클로저 (0) | 2021.06.07 |
[언리얼4] C++ 컴파일이 느린 경우 해결 방법 중 1개 (0) | 2021.06.02 |
스위프트(Swift) 5 배워보기 - 3. 클래스, 구조체, 열거형 (0) | 2020.10.09 |
최근댓글