프로퍼티는 크게 다음과 같이 종류를 나눠줄 수 있다.
- 저장 프로퍼티 (stored property)
- 연산 프로퍼티 (computed property)
- 타입 프로퍼티 (type property)
- 프로퍼티 예시 코드
// 프로퍼티
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
}
}
// 타입 저장 프로퍼티
static var typeDescription: String = "학생"
/*
// 인스턴스 메서드
func selfIntroduce() {
print("저는 \(self.class)반 \(name)입니다.")
}
*/
// 읽기전용 인스턴스 연산 프로퍼티
var selfIntroduction: String {
get {
return "저는 \(self.class)반 \(name)입니다."
}
}
/*
// 타입 메서드
static func selfIntroduce() {
print("학생타입입니다.")
}
*/
// 읽기전용 타입 연산 프로퍼티
// 읽기전용에서는 get을 생략할 수 있음
static var selfIntroduction: String {
return "학생타입입니다."
}
}
[ 저장 프로퍼티 ]
일반적으로 사용하는 값을 저장하기 위한 프로퍼티

[ 연산 프로퍼티 ]
특정한 연산을 수행한 결과값 프로퍼티로, 접근자(getter)와 설정자(setter)의 역할을 수행해 줄 수 있다. 메소드를 2개 만드는 것보다 더 간편하고 직관적으로 코드를 작성할 수 있게 해준다.

연산 프로퍼티는 get 메서드만 구현함으로써 읽기 전용 상태로 구현하기 쉽지만, 쓰기 전용 상태로는 구현할 수 없다는 단점이 있다. (쓰기 전용을 원한다면 메소드로 구현)

[ 타입 프로퍼티 ]
각각의 인스턴스가 아닌 타입 자체에 속하는 프로퍼티로, 인스턴스의 생성 여부와 상관없이 타입 프로퍼티의 값은 하나이다.

위에서 정의한 읽기 전용 인스턴스 연산 프로퍼티인 selfIntroduce와 이름이 같지만, 각각 인스턴와 클래스 자체에 대한 읽기 전용 프로퍼티라는 점이 다르기 때문에 각각 사용 가능하다.

- 테스트 코드 예시
// 타입 연산 프로퍼티 사용
print(Student.selfIntroduction)
// 학생타입입니다.
// 인스턴스 생성
var kybeen: Student = Student()
kybeen.koreanAge = 10
// 인스턴스 저장 프로퍼티 사용
kybeen.name = "kybeen"
print(kybeen.name)
// kybeen
// 인스턴스 연산 프로퍼티 사용
print(kybeen.selfIntroduction)
// 저는 Swift반 kybeen 입니다.
print("제 한국나이는 \(kybeen.koreanAge)살이고, 미국나이는 \(kybeen.westernAge)살입니다.")
// 제 한국나이는 10살이고, 미국나이는 9살입니다.

◈ 추가적으로
저장 프로퍼티와 연산 프로퍼티의 기능은 함수, 메소드, 클로저, 타입 등의 외부에 위치한 지역/전역 변수에도 모두 사용이 가능하다.
var a: Int = 100
var b: Int = 200
var sum: Int {
return a + b
}
print(sum) // 300
[ 프로퍼티 감시자 ]
프로퍼티 감시자를 사용하면 프로퍼티 값이 변경될 때 원하는 동작을 수행할 수 있도록 해줄 수 있다.
아래의 2가지 메소드를 사용하여 프로퍼티 값이 변경되는 상황에서 원하는 동작을 수행하도록 해 줄 수 있다.
- willSet() : 해당 프로퍼티가 바뀌기 직전에 호출
- didSet() : 해당 프로퍼티가 바뀌었을 때 호출
willSet과 didSet에 매개변수 이름을 따로 명시해주지 않으면, 암시적으로 각각 newValue와 oldValue라는 이름의 매개변수를 통해 바뀔 값과 이전 값의 의미로 사용 가능하다.

※ 프로퍼티 감시자와 연산 프로퍼티 기능은 동시에 사용할 수 없다.

- 프로퍼티 감시자 테스트 코드 예시
var moneyInMyPocket: Money = Money()
// 환율이 1100.0에서 1150.0으로 변경될 예정입니다.
moneyInMyPocket.currecyRate = 1150
// 환율이 1100.0에서 1150.0으로 변경되었습니다.
// 0.0달러에서 10.0달러로 변경될 예정입니다.
moneyInMyPocket.dollar = 10
// 0.0달러에서 10.0달러로 변경되었습니다.
print(moneyInMyPocket.won)
// 11500.0

▣ 프로퍼티 감시자의 기능 역시
함수, 메소드, 클로저, 타입 등의 외부에 위치한 지역/전역 변수에도 모두 사용이 가능하다.
var a: Int = 100 {
willSet {
print("\(a)에서 \(newValue)로 변경될 예정입니다.")
}
didSet {
print("\(oldValue)에서 \(a)로 변경되었습니다.")
}
}
// 100에서 200로 변경될 예정입니다.
a = 200
// 100에서 200로 변경되었습니다.
'Swift' 카테고리의 다른 글
[ Swift ] Swift 기초 문법11 - 옵셔널 체이닝과 nil 병합 연산자 (0) | 2023.02.19 |
---|---|
[ Swift ] Swift 기초 문법10 - 인스턴스의 생성과 소멸 (0) | 2023.02.19 |
[ Swift ] Swift 기초 문법8 - 클로저 (0) | 2023.01.30 |
[ Swift ] Swift 기초 문법7 - 값 타입과 참조 타입 (클래스, 구조체, 열거형 비교) (0) | 2023.01.30 |
[ Swift ] Swift 기초 문법6 - 열거형 (0) | 2023.01.30 |
프로퍼티는 크게 다음과 같이 종류를 나눠줄 수 있다.
- 저장 프로퍼티 (stored property)
- 연산 프로퍼티 (computed property)
- 타입 프로퍼티 (type property)
- 프로퍼티 예시 코드
// 프로퍼티
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
}
}
// 타입 저장 프로퍼티
static var typeDescription: String = "학생"
/*
// 인스턴스 메서드
func selfIntroduce() {
print("저는 \(self.class)반 \(name)입니다.")
}
*/
// 읽기전용 인스턴스 연산 프로퍼티
var selfIntroduction: String {
get {
return "저는 \(self.class)반 \(name)입니다."
}
}
/*
// 타입 메서드
static func selfIntroduce() {
print("학생타입입니다.")
}
*/
// 읽기전용 타입 연산 프로퍼티
// 읽기전용에서는 get을 생략할 수 있음
static var selfIntroduction: String {
return "학생타입입니다."
}
}
[ 저장 프로퍼티 ]
일반적으로 사용하는 값을 저장하기 위한 프로퍼티

[ 연산 프로퍼티 ]
특정한 연산을 수행한 결과값 프로퍼티로, 접근자(getter)와 설정자(setter)의 역할을 수행해 줄 수 있다. 메소드를 2개 만드는 것보다 더 간편하고 직관적으로 코드를 작성할 수 있게 해준다.

연산 프로퍼티는 get 메서드만 구현함으로써 읽기 전용 상태로 구현하기 쉽지만, 쓰기 전용 상태로는 구현할 수 없다는 단점이 있다. (쓰기 전용을 원한다면 메소드로 구현)

[ 타입 프로퍼티 ]
각각의 인스턴스가 아닌 타입 자체에 속하는 프로퍼티로, 인스턴스의 생성 여부와 상관없이 타입 프로퍼티의 값은 하나이다.

위에서 정의한 읽기 전용 인스턴스 연산 프로퍼티인 selfIntroduce와 이름이 같지만, 각각 인스턴와 클래스 자체에 대한 읽기 전용 프로퍼티라는 점이 다르기 때문에 각각 사용 가능하다.

- 테스트 코드 예시
// 타입 연산 프로퍼티 사용
print(Student.selfIntroduction)
// 학생타입입니다.
// 인스턴스 생성
var kybeen: Student = Student()
kybeen.koreanAge = 10
// 인스턴스 저장 프로퍼티 사용
kybeen.name = "kybeen"
print(kybeen.name)
// kybeen
// 인스턴스 연산 프로퍼티 사용
print(kybeen.selfIntroduction)
// 저는 Swift반 kybeen 입니다.
print("제 한국나이는 \(kybeen.koreanAge)살이고, 미국나이는 \(kybeen.westernAge)살입니다.")
// 제 한국나이는 10살이고, 미국나이는 9살입니다.

◈ 추가적으로
저장 프로퍼티와 연산 프로퍼티의 기능은 함수, 메소드, 클로저, 타입 등의 외부에 위치한 지역/전역 변수에도 모두 사용이 가능하다.
var a: Int = 100
var b: Int = 200
var sum: Int {
return a + b
}
print(sum) // 300
[ 프로퍼티 감시자 ]
프로퍼티 감시자를 사용하면 프로퍼티 값이 변경될 때 원하는 동작을 수행할 수 있도록 해줄 수 있다.
아래의 2가지 메소드를 사용하여 프로퍼티 값이 변경되는 상황에서 원하는 동작을 수행하도록 해 줄 수 있다.
- willSet() : 해당 프로퍼티가 바뀌기 직전에 호출
- didSet() : 해당 프로퍼티가 바뀌었을 때 호출
willSet과 didSet에 매개변수 이름을 따로 명시해주지 않으면, 암시적으로 각각 newValue와 oldValue라는 이름의 매개변수를 통해 바뀔 값과 이전 값의 의미로 사용 가능하다.

※ 프로퍼티 감시자와 연산 프로퍼티 기능은 동시에 사용할 수 없다.

- 프로퍼티 감시자 테스트 코드 예시
var moneyInMyPocket: Money = Money()
// 환율이 1100.0에서 1150.0으로 변경될 예정입니다.
moneyInMyPocket.currecyRate = 1150
// 환율이 1100.0에서 1150.0으로 변경되었습니다.
// 0.0달러에서 10.0달러로 변경될 예정입니다.
moneyInMyPocket.dollar = 10
// 0.0달러에서 10.0달러로 변경되었습니다.
print(moneyInMyPocket.won)
// 11500.0

▣ 프로퍼티 감시자의 기능 역시
함수, 메소드, 클로저, 타입 등의 외부에 위치한 지역/전역 변수에도 모두 사용이 가능하다.
var a: Int = 100 {
willSet {
print("\(a)에서 \(newValue)로 변경될 예정입니다.")
}
didSet {
print("\(oldValue)에서 \(a)로 변경되었습니다.")
}
}
// 100에서 200로 변경될 예정입니다.
a = 200
// 100에서 200로 변경되었습니다.
'Swift' 카테고리의 다른 글
[ Swift ] Swift 기초 문법11 - 옵셔널 체이닝과 nil 병합 연산자 (0) | 2023.02.19 |
---|---|
[ Swift ] Swift 기초 문법10 - 인스턴스의 생성과 소멸 (0) | 2023.02.19 |
[ Swift ] Swift 기초 문법8 - 클로저 (0) | 2023.01.30 |
[ Swift ] Swift 기초 문법7 - 값 타입과 참조 타입 (클래스, 구조체, 열거형 비교) (0) | 2023.01.30 |
[ Swift ] Swift 기초 문법6 - 열거형 (0) | 2023.01.30 |