수줌이 2021. 2. 10. 13:13

⭐ 상속 

  • Swift의 상속은 클래스, 프로토콜 등에서 가능

  • 열거형, 구조체는 상속이 불가능 → 값 타입이기 때문

  • Swift는 다중상속을 지원하지 않음

 

1. 문법

class 이름: 상속받을 클래스 이름 {
	/* 구현부 */
}

 

2. 사용

  • final 키워드를 사용하면 재정의(override)를 방지할 수 있습니다.

  • static 키워드를 사용해 타입 메서드를 만들면 재정의가 불가능 합니다.

  • 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 finalClassMethod() {
		print("type method - final class")
	}
}

class Student: Person {
	// var name: String = "" //error 저장프로퍼티는 재정의 불가. 그냥 사용할 것!
	var major: String = ""

	override func selfIntroduce() {
		print("저는 \(name)이고, 전공은 \(major)입니다") // 상속받아서 selfIntroduce() 재정의
        	super.selfIntroduce() // 부모 클래스의 selfIntroduce() 호출
	}
			
	// class 메서드 재정의 가능
	override class func classMethod() {
		print("overriden type method - class")
	}

	// static을 사용한 타입 메서드는 재정의 할 수 없다
	// override static func typeMethod() {    }
			
	// final 키워드를 사용한 메서드, 프로퍼티는 재정의 할 수 없습니다
	// override func sayHello() {     }
	// override class func finalClassMethod() {    }

}

// 구동 확인
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 - final class

Person.finalClassMethod()
// type method - final class

Student.classMethod()
// overriden type method - class

Student.typeMethod()
// type method - static

Student.finalClassMethod()
// type method - final class

 

이 글은 Boostcourse에서 배운 내용을 정리하여 작성하였습니다.