조앤의 기술블로그

[Swift] Inheritance and Polymorphism(상속과 다형성) 본문

Study/Swift

[Swift] Inheritance and Polymorphism(상속과 다형성)

쬬앤 2020. 2. 24. 15:18

스위프트 언어의 상속과 다형성에 대해 알아보겠습니다. 

<Inheritance(상속)>

객체지향 프로그래밍에서 상속은 코드의 중복 문제를 해결하기 위해 도입된 개념입니다. 

 

가장 상위에 있는 클래스를 Base Class, Root Class라고 합니다. 

상속을 이루고 있는 것을 클래스 계층(Class Hierachy)에 속한다고 합니다. 

 

class ClassName: SuperClassName {
}

클래스를 상속하는 방법입니다.

 

class Figure {
	var name = "Unknown"
    
    init(name: String) {
    	self.name = name
    }
    
    func draw() {
    	print("draw \(name)")
    }
}

Root class인 Figure 입니다.

class Circle: Figure {
	var radius = 0.0
}

let c = Circle(name: "Circle")
c.radius
c.name
c.draw()

Figure 클래스를 상속하는 Circle 클래스입니다. 

Figure 클래스의 속성인 name, draw()에 접근할 수 있습니다. 

 

[final class]

final class ClassName: SuperClassName {
}

class 를 선언할 때 앞에 final 키워드를 붙이면 상속을 금지할 수 있습니다. 

 

<Overriding>

다형성에 관하여 Overriding(오버라이딩, 재정의)에 대해 알아보겠습니다. 

class Figure {
	var name = "Unknown"
    
    init(name: String) {
    	self.name = name
    }
    
    func draw() {
    	print("draw \(name)")
    }
}

class Circle: Figure {
	var radius = 0.0
    
    var diameter: Double {
    	return radius * 2
    }
    
    override func draw() {
    	super.draw()
        print("⚫️")
    }
}
let c = Circle(name: "Circle")
c.draw()

draw() 를 상속받을 때 앞에 override 키워드를 붙여 재정의하였습니다. 

super 키워드를 붙여 상위 구현을 기반으로 함수를 재정의한 모습입니다. 

class Oval: Circle {
	override var diameter: Double {
    	get {
        	return super.diameter
        }
        set {
        	super.radius = newValue / 2
        }
    }
    
    override var radius: Double {
    	willSet {
        	print(newValue)
        }
        didSet {
        	print(oldValue)
        }
    }
}

속성을 오버라이딩할 때는 메소드와는 규칙이 조금 다릅니다. 

계산 속성을 추가하거나, 속성감시자를 추가해야 합니다. 

 

읽기 전용 속성은 읽기와 쓰기 전용 속성으로 오버라이딩 가능하지만,

읽기와 쓰기 전용 속성은 읽기 전용으로 오버라이딩 할 수 없습니다. 

 

그리고 get, set 블록에서 super 대신 self를 쓰면 동일 속성에 반복적인 접근을 하여 재귀호출이 발생할 수 있으므로 주의해야 합니다. 

 

[오버라이딩 금지하는 법]

메소드의 상속은 허용하되, 오버라이딩을 금지하려면 함수 선언 앞에 final 키워드를 붙이면 됩니다. 

final func draw() {
}

 

 

<Overloading>

오버로딩은 하나의 형식에서 동일한 이름을 가진 다수의 멤버를 사용할 때 이를 구분하는 것을 의미합니다.

 

오버로딩 규칙은 다음과 같습니다.

1. 함수 이름이 동일하면 파라미터 수로 식별
2. 함수 이름, 파라미터 수가 동일하면 파라미터 자료형으로 식별
3. 함수이름, 파라미터가 동일하면 Argument Label로 식별
4. 함수 이름, 파라미터, Argument Label이 동일하면 리턴형으로 식별

 

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

[Swift] Initializers #1  (0) 2020.02.26
[Swift] Type Casting (타입 캐스팅)  (0) 2020.02.25
[Swift] Method and Subscript  (0) 2020.02.21
[Swift] Property(프로퍼티) #2  (0) 2020.02.20
[Swift] Property(프로퍼티) #1  (0) 2020.02.20