다형성 (Polymorphism) in Swift

버들비·2020년 7월 26일
0

컴퓨터 과학

목록 보기
1/1

프로그래밍 언어의 요소가 다양한 형태를 가질 수 있는 것. 반댓말은 monomorphism이다.

monomorphic한 시스템의 경우, 함수는 각각 한가지 의미로 식별되는 이름과 결합되어 있어 다른 동작을 구현하기 위해선 다른 이름을 써야한다.

polymorphic한 시스템의 경우 범용적인 메소드 이름을 정의하여 형태에 따라 적절한 변환 방식을 정의해 둘 수 있다.

polymorphism 개념이 어떻게 적용되는지는 다음 예제로 확인할 수 있다.
사각형의 면적을 계산하는 함수와 삼각형의 면적을 계산하는 함수를 생각해 보자.

class Rectangle {
	var areaValue: Double = 0.0
    func calculateRectangleAreaValue(valueA: Double, valueB: Double) {
        areaValue = valueA * valueB
        print(areaValue)
    }
}

class Triangle {
    var areaValue: Double = 0.0
    func calculateTriangleAreaValue(valueA: Double, valueB: Double) {
        areaValue = (valueA * valueB) / 2
        print(areaValue)
    }
}

var rectangle: Rectangle = Rectangle()
rectangle.calculateRectangleAreaValue(valueA: 3.0, valueB: 5.0) // 15.0

var triangle: Triangle = Triangle()
triangle.calculateTriangleAreaValue(valueA: 3.0, valueB: 5.0) // 7.5

사각형의 넓이를 계산하는 방법과 삼각형의 넓이를 계산하는 방법은 크게 다르지 않다. 그런데도 이렇게 따로 클래스를 정의하고, 메소드를 정의하는 건 비효율적이고 아름답지 않다.

클래스의 상속을 이용하면 다음과 같이 표현할 수 있다.

class Rectangle {
	var areaValue: Double = 0.0
    func calculateAreaValue(valueA: Double, valueB: Double) {
        areaValue = valueA * valueB
        print(areaValue)
    }
}

class Triangle {
    var areaValue: Double = 0.0
    func calculateAreaValue(valueA: Double, valueB: Double) {
        areaValue = (valueA * valueB) / 2
        print(areaValue)
    }
}


var rectangle: Rectangle = Rectangle()
rectangle.calculateAreaValue(valueA: 3.0, valueB: 5.0) // 15.0

var triangle: Triangle = Triangle()
triangle.calculateAreaValue(valueA: 3.0, valueB: 5.0) // 7.5

같은 이름의 calculateAreaValue 함수가 다른 방식으로 작동하는걸 확인할 수 있다.

0개의 댓글