어느 덧 추운 겨울이 지나고 봄이 슬며시 다가왔네요~
국회의사당 사랑채에는 벌써 꽃이 만개하였네요
날도 따뜻해졌으니 더욱 힘내서 공부를 해야겠죠?-_-
지난 시간에 스위프트5(Swift5)의 함수, 메서드, 클로저에 대해 알아보았습니다
오늘은 스위프트의 클래스와 구조체에 대해 알아보겠습니다
클래스는 요새 거의 모든 언어에서 언급하므로
구지 따로 설명드릴 필요는 없을 것 같고 코드를 작성해보면서 익히면 될 것 같습니다
class BankAccount {
//: Stored property
var accountBalance: Float = 0
var accountNumber: Int = 0
let fees: Float = 25.00
//: Computed property
var balanceLessFees: Float {
get {
return self.accountBalance - self.fees
}
set(newBalance) {
self.accountBalance = newBalance - self.fees
}
}
init(number: Int, balance: Float) {
self.accountNumber = number
self.accountBalance = balance
}
deinit {
// deinitializer
}
func displayBalance() {
print("Number \(self.accountNumber)")
print("Current balance is \(self.accountBalance)")
}
class func getMaxBalance() -> Float {
return 100000.00
}
}
var account1 = BankAccount(number: 12312312, balance: 400.54)
account1.displayBalance()
print(BankAccount.getMaxBalance())
print(account1.balanceLessFees)
account1.balanceLessFees = 12123.12
print(account1.balanceLessFees)
BackAcount 클래스를 생성한 코드입니다
위의 코드에서 accounBalance, accountNumber, fees는 저장 프로퍼티(stored property)이며
balanceLessFees는 연산 프로퍼티(computed property)입니다
저장 프로퍼티는 상수나 변수에 담기는 값을 말하고
연산 프로퍼티는 getter를 생성하고
선택적으로 setter 메서드를 생성하며 연산을 수행할 코드가 포함됩니다
init과, deinit은 생성자와 소멸자이며
displayBalance은 인스턴스 메서드(instance method),
getMaxBalance는 타입 메서드(type method)입니다
타입 메서드는 static method라고 생각하면 될 것 같네요
코드를 한 번 실행시켜보시면 이해가 바로 되실 꺼라고 생각합니다~
다음으로 스위프트의 프로토콜(protocol)을 살펴보겠습니다
프로토콜은 자바의 인터페이스(interface)를 떠올리면 될 것 같네요
//: Protocol
protocol MessageBuilder {
var name: String { get }
func buildMessage() -> String
}
class MyMessage: MessageBuilder {
var name: String
init(name: String) {
self.name = name
}
func buildMessage() -> String {
"Hello " + name
}
}
위처럼 프로토콜을 통해 클래스가
반드시 포함해야 하는 메서드와 프로퍼티를 정의합니다
다음은 클래스가 나오면 꼭 나오는 이야기인 상속을 살펴보겠습니다
class SavingAccount: BankAccount {
var interestRate: Float = 0.0
init(number: Int, balance: Float, rate: Float) {
interestRate = rate
super.init(number: number, balance: balance)
}
func calculateInterest() -> Float {
return interestRate * accountBalance
}
override func displayBalance() {
super.displayBalance()
print("Prevailing interest rate is \(interestRate)")
}
}
let savings1 = SavingAccount(number: 12311, balance: 600.00, rate: 0.07)
print(savings1.calculateInterest())
savings1.displayBalance()
extension Double {
var squared: Double {
return self * self
}
var cubed: Double {
return self * self * self
}
}
SavingAccount클래스는 위에서 생성한 BankAccount를 상속했습니다
새로운 메서드도 추가되었고 기존에 있던 displayBalance 메서드를 override하였네요
extension 키워드를 붙인 Double 클래스를 볼 수 있는데요
익스텐션은 하위 클래스를 사용하지 않고
클래스의 기능을 확장할 수 있는 빠르고 편리한 방식을 제공합니다
하지만 클래스의 기존 기능을 오버라이드할 수 없고
저장 프로퍼티를 포함할 수도 없습니다
//: Opaque return type
func doubleFunc1(value: Int) -> some Equatable {
value * 2
}
func doubleFunc2(value: String) -> some Equatable {
value + value
}
let intOne = doubleFunc1(value: 10)
let stringOne = doubleFunc2(value: "Hello")
위의 코드는 불투명 반환 타입이라고해서
지난 시간에 학습한 함수에서 반환 타입을 구체화하지 않고
불투명하게 하는 것을 의미하고 'some' 키워드를 사용합니다
some Equatable은 해당 함수가
스위프트가 제공하는 표준 프로토콜 Equatable을
따르는 모든 타입을 반환한다는 의미입니다
클래스에 대해서는 이 정도로 마치도록하고
구조체(Structure)를 잠깐 살펴보겠습니다
struct SampleStruct {
var name: String
init(name: String) {
self.name = name
}
}
let myStruct1 = SampleStruct(name: "Mark")
print(myStruct1.name)
var myStruct2 = myStruct1
myStruct2.name = "David"
print(myStruct2.name)
위의 코드를 보면 클래스와 큰 차이가 없습니다
실제로 몇 가지 차이점을 제외하고 거의 같다고 보면 됩니다
차이점을 살펴보면 다음과 같습니다
구조체 vs 클래스 1. 구조체 인스턴스는 값 타입(value type), 클래스의 인스턴스는 참조 타입(reference type) 2. 구조체는 상속이나 하위클래스를 지원하지 않음(상속x) 3. 구조체는 소멸자 메서드(deinit)를 포함할 수 없음 4. 런타임에서 클래스 인스턴스의 유형은 식별 가능 구조체는 식별 불가능 |
이것으로 오늘의 학습을 마치겠습니다
그럼 이만-_-
'iOS' 카테고리의 다른 글
[iOS] 스위프트5 프로퍼티 레퍼와 에러 핸들링(Swift5 PropertyWrapper and Error Handling) (0) | 2020.03.26 |
---|---|
[iOS] Swift5 Function, Method, Closure(스위프트5 함수, 메서드, 클로저) (0) | 2020.03.23 |