다형성
- 하나의 객체(인스턴스)가 여러가지 타입의 형태로 표현될 수 있음을 의미.
- 클래스의 상속으로 수직적으로 구현될 수 있음
- 값 타입의 경우 프로토콜의 채택으로 구현될 수 있음.
class Person {
var id = 0
var name = "이름"
var email = "abc@gmail.com"
func walk() {
print("사람이 걷는다")
}
}
class Student: Person {
// id
// name
// email
var studentId = 1
override func walk() { //재정의 메서드, walk() -1
print("학생이 걷는다") //원래는 사람이 걷는다인데 "학생이 걷는다"로 수정함
}
func study() { //재정의 메서드, study() -1
print("학생이 공부한다.") //원래 아무것도 없었지만, "학생이 공부한다"로 재정의 아래 유형들도 모두 같다.
}
}
class Undergraduate: Student {
// id
// name
// email
// studentId
var major = "전공"
override func walk() { // 재정의 메서드. walk() - 2
print("대학생이 걷는다.")
}
override func study() { // 재정의 메서드. study() - 1
print("대학생이 공부한다.")
}
func party() {
print("대학생이 파티를 한다.")
}
}
let person1 = Person()
person1.walk()
let student1 = Student()
//let student1: Person = Student()
student1.walk()
student1.study()
let undergraduate1 = Undergraduate()
//let undergraduate1: Person = Undergraduate()
undergraduate1.walk()
undergraduate1.study()
undergraduate1.party()
let people: [Person] = [Person(), Student(), Undergraduate()]
//반복문
for person in people {
person.walk()
}
// 한개씩
people[0].walk() //Person 타입으로 인식 (Person 인스턴스)
people[1].walk() //Person 타입으로 인식 (Student 인스턴스)
people[2].walk() //Person 타입으로 인식 (Undergraduate 인스턴스)
protocol Personprotocol { func walk() }
protocol Studentprotocol: Personprotocol { func study() }
protocol Undergraduateprotocol: Studentprotocol { func drink() }
struct Person: Personprotocol {
func walk() {
print("사람이 걷는다")
}
}
struct Student: Studentprotocol {
func walk() {
print("학생이 걷는다")
}
func study() {
print("학생이 공부를 한다")
}
}
struct Undergraduate: Undergraduateprotocol {
func walk() {
print("대학생이 걷는다")
}
func study() {
print("대학생이 공부를 한다")
}
func drink() {
print("대학생이 술을 마신다.")
}
}
let person1: Personprotocol = Person()
person1.walk()
let student1: Personprotocol = Student()
student1.walk()
// student1.study() --> 에러
let undergraduate1: Personprotocol = Undergraduate()
undergraduate1.walk()
// undergraduate1.study() --> 에러
// undergraduate1.party() --> 에러
// 사람이 걷는다
// 학생이 걷는다
// 대학생이 걷는다
3개의 모두 다른 타입이 하나의 Studentprotocol 타입이 되고있다.