새소식

iOS/Swift

[Swift] 상속

  • -
참조 :  Swift 스위프트 프로그래밍 3판 Swift 5, 저자 야곰 (한빛미디어) , The Swift Programming Language Swift 5.6 Edition (iBooks)(https://books.apple.com/kr/book/the-swift-programming-language-swift-5-6/id881256329)

 

 

 

상속


- 클래스는 메서드나 프로퍼티 등을 다른 클래스로 부터 상속받을 수 있음

- 어떤 클래스로부터 상속을 받음 → 자식클래스(Subclass / Child-class)

- 자식클래스에게 자신의 특성을 물려준 클래스 → 부모클래스(Superclass / Parents-class)

- 부모클래스로부터 물려받은 메서드, 프로퍼티, 서브스크립트 등을 자신만의 내용으로 재정의 가능

- 다른 클래스로부터 상속받지 않는 클래스 → 기반클래스(Base class)

 

 

 

 

클래스 상속


- 기반클래스를 다른 클래스에서 물려받는 것 → 상속

- 부모클래스의 메서드, 프로퍼티 등을 재정의 / 기반클래스의 기능이나 프로퍼티를 물려받고 자신의 기능을 추가할 수 있음

- 어떤 클래스의 자식클래스가 다른 클래스의 부모클래스가 될 수 있음

- Person 클래스를 상속 받은 Student 클래스

 

class Person{
    var names: String = ""
    var age:Int = 0
    
    var introuduction: String{
        return "이름 : \(names), 나이 : \(age)"
    }
    
    func speak(){
        print("가나다라마바사")
    }
}

class Student: Person{
    var grade: String = "F"
    
    func study(){
        print("열공중...")
    }
}

let lee: Student = Student()
lee.names = "Lee"
lee.age = 50
lee.grade = "A+"
print(lee.introduction) // 이름 : Lee, 나이 : 50
print(lee.grade, lee.age) // A+ 50
lee.study() // 열공중...

 

 

 

 

 

재정의(override)


- 재정의(override) :  자식클래스가 부모클래스로부터 물려받은 특성을 그대로 사용하지 않고 자신만의 기능으로 변경하여 사용하는 것

- override 키워드를 사용, 스위프트 컴파일러가 조상클래스(부모를 포함한 그 상위 부모클래스)에 해당 특성이 있는지 확인 후 재정의

- 부모클래스의 특성을 자식클래스에서 사용하고 싶다면  → super 프로퍼티 사용

- super 키워드를 타입 메서드 내에서 사용한다면? → 부모 클래스의 타입 메서드와 타입 프로퍼티에 접근 가능

- super 키워드를 인스턴스 메서드 내에서 사용한다면? → 부모클래스의 인스턴스 메서드와 인스턴스 프로퍼티, 서브스크립트 접근 가능

 

class Person{
    var name: String = ""
    var age:Int = 0
    var koreanAge: Int{
        return self.age + 1
    }
    var introduction: String{
        return "이름 : \(name), 나이 : \(age)"
    }
}

class Student: Person{
    var grade: String = "F"
    
    override var introduction: String{
        return super.introduction + " " + "학점 : \(self.grade)"
    }
    
    override var koreanAge: Int{
        get{
            return super.koreanAge
        }
        set{
            self.age = newValue - 1
        }
    }
}

let kim: Person = Person()
kim.name = "kim"
kim.age = 23
print(kim.introduction) // 이름 : kim, 나이 : 23
print(kim.koreanAge) // 24


let lee: Student = Student()
lee.name = "lee"
lee.age = 15
lee.koreanAge = 16
print(lee.introduction) // 이름 : lee, 나이 : 15 학점 : F
print(lee.koreanAge) // 16

 

 

 

클래스의 이니셜라이저


- 값 타입의 이니셜라이저는 구분하지 않지만, 클래스에서는 지정 이니셜라이저와 편의 이니셜라이저로 구분

 

- 지정 이니셜라이저(Designated Initializer)

  • 클래스의 주요 이니셜라이저
  • 필요에 따라 부모클래스의 이니셜라이저 호출 가능
  • 이니셜라이저가 정의된 클래스의 모든 프로퍼티를 초기화하는 임무를 가짐
  • 모든 클래스는 하나 이상의 지정 이니셜라이저를 가짐

 

- 편의 이니셜라이저(Convenience Initializer)

  • 초기화를 조금 더 손쉽게 도와주는 역할
  • 지정 이니셜라이저를 자신 내부에서 호출
  • 필수 요소는 아님 → 클래스 설계자의 의도대로 외부에서 사용하길 원하거나 인스턴스 생성 코드를 작성하는 수고를 덜 때 유용
  •  convenience 지정자를 init 키워드 앞에 명시

class Person{
    var name: String
    
    init(name: String) {
        self.name = name
    }
    convenience init() {
        self.init(name: "UnKnown")
    }
}
class Student: Person{
    var major: String = "Swift"
}

let kim: Person = Person(name: "kim")
let lee: Student = Student(name: "lee")

print(kim.name) // kim
print(lee.name) // lee

let wizplan: Person = Person()
let jinSung: Student = Student()

print(wizplan.name) // UnKnown
print(jinSung.name) // UnKnown

 

 

 

 

 

요구 이니셜라이저


- required 수식어를 클래스의 이니셜라이저 앞에 명시

- 상속받을 때 반드시 재정의해야 하는 이니셜라이저 앞에 required 붙임

- 자식클래스에서 요구 이니셜라이저를 재정의할 때는 override 대신 required 수식어 사용

 

class Person{
    var name: String
    
    required init(){
        self.name = "UnKnown"
    }
}

class Student: Person{
    var major:String = "UnKnown"
    
    init(major: String) {
        self.major = major
        super.init()
    }
    
    required init() {
        self.major = "UnKnown"
        super.init()
    }
}

class UniversityStudent: Student{
    var grade: String
    
    init(grade: String) {
        self.grade = grade
        super.init()
    }
    
    required init() {
        self.grade = "F"
        super.init()
    }
}

let jisoo: Student = Student()
print(jisoo.major) // UnKnown


let kim: Student = Student(major: "Swift")
print(kim.major) // Swift

let lee: UniversityStudent = UniversityStudent(grade: "A+")
print(lee.grade) // A+
728x90

'iOS > Swift' 카테고리의 다른 글

[Swift] 인스턴스  (0) 2022.09.28
[Swift] Extension  (0) 2022.09.27
[Swift] 서브스크립트  (2) 2022.09.22
[Swift] print(_:separator:terminator:)  (0) 2022.09.21
[Swift] 프로퍼티와 메서드  (0) 2022.09.20
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.