현제의 현재이야기
[swift] 기초 문법 8일차(상속) 본문
상속
프로토콜, 클래스에서 가능하고 열겨형, 구조체는 상속이 불가능하다.
다중상속은 불가능, 단일 상속만 가능하다.
final은 자식한테 상속했을 때, 재정의를 할 수 없게 만들어준다.
재정의가 가능한 타입 메서드 = class
하지만 class도 앞에 final이 붙으면 상속이 불가능하다. static과 똑같은 동작을 한다.
상속 받은 자식이 부모의 변수를 바꾸려면 override를 적으면 된다.
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 키워드를 사용하면 재정의 할 수 없습니다
// 메서드 앞의 `static`과 `final class`는 똑같은 역할을 합니다
final class func finalCalssMethod() {
print("type method - final class")
}
}
// Person을 상속받는 Student
class Student: Person {
var major: String = ""
override func selfIntroduce() {
print("저는 \(name)이고, 전공은 \(major)입니다")
}
override class func classMethod() {
print("overriden type method - class")
}
// static을 사용한 타입 메서드는 재정의 할 수 없습니다
// override static func typeMethod() { }
// final 키워드를 사용한 메서드, 프로퍼티는 재정의 할 수 없습니다
// override func sayHello() { }
// override class func finalClassMethod() { }
}
주의: 저장 프로퍼티는 override를 할 수 없다!! 함수와 class 타입 메서드만 가능
인스턴스의 생성과 소멸
그동안 클래스를 만들었을 때, 프토퍼티의 값을 다 넣었던 이유는 인스턴스를 만들 때, 프로퍼티의 값들이 있어야 초기화가 정상적으로 이루어지기 때문이다. 그런데 초기값을 설정 안 해줄 수 있다.
class Soldier {
var name: String
var hp: Int
var mp: Int
init(name: String, hp: Int, mp: Int) {
self.name = name
self.hp = hp
self.mp = mp
}
}
let para: Soldier = Soldier(name: "attacker", hp: 100, mp: 50)
print("\(para.name), \(para.hp), \(para.mp)")
//attacker, 100, 50
프로퍼티의 초기화가 꼭 필요 없을 때
class Soldier {
var name: String
var hp: Int
var mp: Int
var trasformAble: Bool
var needMoney : Int?
init(name: String, hp: Int, mp: Int, transformAble: Bool, needMoney: Int) {
self.name = name
self.hp = hp
self.mp = mp
self.trasformAble = transformAble
self.needMoney = needMoney
}
init(name: String, hp: Int, mp: Int, transformAble: Bool) {
self.name = name
self.hp = hp
self.mp = mp
self.trasformAble = transformAble
}
}
let para: Soldier = Soldier(name: "attacker", hp: 100, mp: 50, transformAble: true, needMoney: 6000)
print("\(para.name), \(para.hp), \(para.mp), \(para.trasformAble), \(para.needMoney)")
//attacker, 100, 50, true, Optional(6000)
옵셔널을 ! 로 밖에 못벗기나...? 의문
'IOS > swift' 카테고리의 다른 글
[swift] 기초 문법 9일차 (0) | 2022.09.16 |
---|---|
[swift] 기초 문법 7일차(프로퍼티) (0) | 2022.09.14 |
[swift] 기초 문법 6일차(클로저) (0) | 2022.09.13 |
[swift] 기초 문법 5일차 (0) | 2022.09.12 |
[swift] 기초 문법 4일차 (0) | 2022.09.11 |
Comments