[Swift] property, 상속

최승원·2022년 5월 21일
0

TIL (Today I Learned)

목록 보기
15/21

Property

struct Student {
    // 인스턴스 저장 프로퍼티
    // 값을 저장하기 위해 선언되는 상수/변수
    var name: String = ""
    var `class`: String = "Swift"
    var koreanAge: Int = 0
    
    // 인스턴스 연산 프로퍼티
    // 특정한 연산을 수행해주기 위한 프로퍼티
    var westernAge: Int {
        // getter (다른 저장 프로퍼티의 값을 얻거나 연산하여 리턴)
        // 서양 나이를 한국 나이로 바꾸고 싶을 때
        get {
            return koreanAge - 1
        }
        
        // setter (다른 저장 프로퍼티에 값을 저장)
        // 한국 나이를 서양 나이로 바꾸고 싶을 때
        set(inputValue) {
            koreanAge = inputValue + 1
        }
    }
    
    // newValue를 사용하여 setter의 매개변수 생략 가능
    var westernAge2: Int {
        get {
            return koreanAge - 1
        }
        
        set {
            koreanAge = newValue + 1
        }
    }
    
    // 타입 저장 프로퍼티
    // static을 붙여서 선언하는 프로퍼티
    static var typeDescription: String = "학생"
    
    // 읽기 전용 연산 프로퍼티
    // setter가 필요 없는 경우
    var selfIntroduction: String {
        get {
            return "저는 \(self.class)\(name)입니다"
        }
    }
    
    // 읽기 전용 타입 연산 프로퍼티
    // get 생략 가능
    static var selfIntroduction: String {
        return "학생타입입니다"
    }
}

// 타입 연산 프로퍼티 사용
print(Student.selfIntroduction) // 학생타입입니다

// 인스턴스 연산 프로퍼티 사용
var yagom: Student = Student()
yagom.name = "yagom"
print(yagom.selfIntroduction) // 저는 Swift반 yagom입니다.

yagom.koreanAge = 10
print("미국 나이는 \(yagom.westernAge)살") // 미국 나이는 9살

yagom.westernAge = 11
print("한국 나이는 \(yagom.koreanAge)살") // 한국 나이는 12살

Property 감시자

struct Money {
    // 프로퍼티 감시자 사용
    // 연산 프로퍼티에서는 사용 불가
    var currencyRate: Double = 1100 {
        // currencyRate이 새로운 값으로 바뀌기 직전
        willSet(newRate) {
            print("환율이 \(currencyRate)에서 \(newRate)으로 바뀔 예정입니다.")
        }
        
        // currencyRate이 새로운 값으로 바뀐 후
        didSet(oldRate) {
            print("환율이 \(oldRate)에서 \(currencyRate)으로 바뀌었습니다.")
        }
    }
    
    var currencyRate2: Double = 1100 {
        // newValue와 oldValue로 매개변수 생략 가능
        willSet {
            print("환율이 \(currencyRate)에서 \(newValue)으로 바뀔 예정입니다.")
        }
        
        didSet {
            print("환율이 \(oldValue)에서 \(currencyRate)으로 바뀌었습니다.")
        }
    }
}

var moneyInMyPocket: Money = Money()

// 환율이 1100.0에서 1150.0으로 바뀔 예정입니다.
moneyInMyPocket.currencyRate = 1150
// 환율이 1100.0에서 1150.0으로 바뀌었습니다.

상속

class Person {
    var name: String = ""
    
    func selfIntroduce() {
        print("저는 \(name)입니다")
    }
    
    // final 키워드를 사용하여 재정의(오버라이드) 방지
    final func sayHello() {
        print("hello")
    }
    
    // 타입 메서드
    // 재정의 불가 타입 메서드 - static
    static func typeMethod() {
        print("type method - static")
    }
    
    // 재정의 가능 타입 메서드 - class
    class func classMethod() {
        print("type method - class")
    }
    
    // class 메서드에 final 키워드를 사용하면 재정의 불가
    final class func finalClassMethod() {
        print("type method - final class")
    }
}

// Person을 상속받은 class
class Student: Person {
    var major: String = ""
    
    override func selfIntroduce() {
        print("저는 \(name)이고, 전공은 \(major)입니다")
        
        // 부모클래스 호출
        super.selfIntroduce()
    }
    
    override class func classMethod() {
        print("overriden type method - class")
    }
}

let yagom: Person = Person()
let hana: Student = Student()

yagom.name = "yagom"
hana.name = "hana"
hana.major = "Swift"

yagom.selfIntroduce() // 저는 yagom입니다
hana.selfIntroduce() // 저는 hana이고, 전공은 Swift입니다
Person.classMethod() // type method - class
Person.typeMethod() // type method - static
Person.finalClassMethod() // type method - final class
Student.classMethod() // overriden type method - class
profile
문의 사항은 메일로 부탁드립니다🙇‍♀️

0개의 댓글