오늘은 프로퍼티의 다양한 사용에 대해 공부했다.
프로퍼티는 구조체, 클래스, 열거형 내부에 구현 할 수 있다. 약간 C++로 따지자면 생성자, 함수, 변수 등으로 나눠지는 느낌이다.
단 열거형 내부에는 연산 프로퍼티만 구현할 수 있다.
인스턴스 저장 프로퍼티
struct Student {
// 인스턴스 저장 프로퍼티
var name: String = ""
var `class`: String = "Swift"
var koreanAge: Int = 0
}
각 타입에 맞는 것들을 저장 할 수 있는 저장 프로퍼티이다.
인스턴스 연산 프로퍼티
struct Student {
// 인스턴스 연산 프로퍼티
var westernAge: Int {
get {
return koreanAge - 1
}
// 직접 저장하고 그러는게 아니라 위에 저장 프로퍼티를 끌어와서 연산을 한 후에
// 할당을 해주거나 변환을 해주는 작업을 수행할 수 있다.
set(inputValue) {
koreanAge = inputValue + 1
}
}
}
기존의 저장 프로퍼티는 뭔가를 입력받아 저장만 하는 용도였다면, 연산 프로퍼티는 저장된 저장 프로퍼티를 가져와 연산을 한 후에 다시 할당을 해주는 역할을 하게 된다. 하지만, 연산 프로퍼티 단독적으로 뭔가를 저장하고 막 그러는 것이 아님을 기억해라.
타입 저장 프로퍼티
struct Student {
// 타입 저장 프로퍼티
static var typeDescription: String = "학생"
}
구조체에서 바로 불러올 수 있는 타입 저장 프로퍼티도 이렇게 생성이 가능하다.
읽기전용 인스턴스 연산 프로퍼티
struct Student {
/*
// 인스턴스 메서드
func selfIntroduce() {
print("저는 \(self.class)반 \(name)입니다")
}
*/
// 읽기전용 인스턴스 연산 프로퍼티
var selfIntroduction: String {
get {
return "저는 \(self.class)반 \(name)입니다."
}
}
}
기존의 인스턴스 메서드도 가능하지만, 읽기전용 인스턴스 연산 프로퍼티를 이용해 출력을 할 수 있다. 읽기전용이라함은 get 블럭만 유지해놓고 프로퍼티를 만든 것을 의미한다.
읽기 전용 타입 연산 프로퍼티
struct Student {
/* 타입 메서드
static func selfIntroduce() {
print("학생입니다")
}
*/
// 읽기전용 타입 연산 프로퍼티
// 일기전용에서는 get을 생략할 수 있습니다.
static var selfIntroduction: String {
return "학생입니다"
}
}
기존의 타입 메서도드 사용이 가능하지만, 읽기 전용 타입 연산 프로퍼티로 기존의 기능을 대체할 수 있다. 타입 연산 프로퍼티이기때문에 static 이 붙는다. 구조체를 바로 불러와 사용이 가능하다.
사용
// 타입 연산 프로퍼티 사용
print(Student.selfIntroduction)
// 학생타입입니다
// 인스턴스 생성
var ITlearning: Student = Student()
ITlearning.koreanAge = 10
// 인스턴스 저장 프로퍼티 사용
ITlearning.name = "ITlearning"
print(ITlearning.name)
// ITlearning
// 인스턴스 연산 프로퍼티 사용
print(ITlearning.selfIntroduction)
// 저는 Swift반 ITlearning 입니다
print("제 한국나이는 \(ITlearning.koreanAge)이고, 미국나이는 \(ITlearning.westernAge)살입니다")
코드를 차근차근 풀어보자.
아까 읽기 전용 연산 프로퍼티를 생성했었다. 그리고 static 키워드가 붙어있었다. 그래서 구조체를 바로 불러와서 사용할 수 있다.
그리고 인스턴스를 생성해 값을 변경해 출력하는 모습이 보인다.
응용
struct Money {
var currencyRate: Double = 1100
var dollar: Double = 0
var won: Double {
get {
return dollar * currencyRate
}
set { // newValue - 특별히 매개변수 이름을 넣지 않았을 경우에 할당된다.
dollar = newValue / currencyRate
}
}
}
var moneyInPocket = Money()
moneyInPocket.won = 11000
print(moneyInPocket.won)
// 11000
moneyInPocket.dollar = 10
print(moneyInPocket.won)
// 11000
먼저 Money라는 이름의 구조체를 만들고, 안에는 저장 프로퍼티, 연산 프로퍼티를 생성한게 보인다.
연산 프로퍼티에서 처음보는 것이 하나 있다. 쓰기 부분에 newValue 키워드이다. 특별히 매개변수 이름을 넣지 않을 경우에 자동으로 저 키워드에 할당을 해준다. 유용하게 쓸 수있을 듯하다. 그리고, moneyInPocket 인스턴스를 생성해 사용할 수 있게 했다. 값을 변경하고 won 의 값을 변경할때는 바로 get 블럭이 보여지고, dollar를 조정했을 경우 set 블럭이 발동해 10 * 1100 을 하게 되어 11000이 나오게 된다.
지역변수,전역변수
var a: Int = 100
var b: Int = 200
var sum: Int {
return a + b
}
print(sum) // 300
저장 프로퍼티와 연산 프로퍼티의 기능은 함수, 메서드, 클로저, 타입 등의 외부에 위치한 지역/전역 변수에도 모두 사용이 가능하다.
전역 변수를 생성해 연산 프로퍼티에서 사용을 해 출력하는 모습의 코드이다.
댓글