[인터뷰질문 016] operator overloading을 주니어 개발자에게 어떻게 설명해 줄 것 인가요?



오버라이딩

이 문제를 이해하기 위해서는 오버라이딩이라는 개념을 알고 있어야 합니다. 오버라이딩은 쉽게 말해 같은 이름의 다른 타입의 함수를 정의하는 것 입니다. 두개의 인자를 받아서 더하는 함수를 정의해 보겠습니다.

func sum(_ a: Int, _ b: Int) -> Int {
    return a + b
}

func sum(_ a: Double, _ b: Double) -> Double {
    return a + b
}

print(sum(3, 2)) // 5
print(sum(4.1, 4.2)) // 8.3

두 숫자의 합을 구하고 싶을 때, 매개별수로 정수와 실수가 들어가야 한다면, 이렇게 한 함수를 오버라이딩해서 사용하는 사람이 편하게 쓸 수 있도록 구현할 수 있습니다.

연산자 오버라이딩

이름에서 알 수 있듯이, 연산자를 오버라이딩 하는 것 입니다. 우리가 알고있는 연산자는 다음과 같습니다. +, -, /, * 등등... 그렇다면, 언제 연산자를 오버라이딩 할까요? 아래 예제를 보면서 생각해 보겠습니다.

struct Point {
    var x = 0.0
    var y = 0.0
}

let p1 = Point(x: 12.3, y: 34.5)
let p2 = Point(x: 67.2, y: 89.6)

두개의 좌표가 있을 때, 좌표의 합을 구하고 싶다면, 어떻게 해야할까요? 쉽게드는 생각은 p1 + p2하면 x는 x끼리 y는 y끼리 더해주었으면 좋겠는데, 실제 돌려보면 binary operator '+' cannot be applied to two 'Point' operands print(p1 + p2)와 같은 에러가 발생합니다. 왜냐하면 +연산자는 좌표를 더하는 것에 대한 처리가 되어있지 않기 때문입니다. 그렇다면? 위에서 봤던 예제처럼 연산자를 오버라이딩 하면 문제를 해결할 수 있을것 같습니다.

struct Point {
    var x = 0.0
    var y = 0.0

     static func +(lhs: Point, rhs: Point) -> (Double, Double) {
        return (lhs.x + rhs.x, lhs.y + rhs.y)
    }
}

let p1 = Point(x: 12.3, y: 34.5)
let p2 = Point(x: 67.2, y: 89.6)

print(p1 + p2) // (79.5, 124.1)

위와 같이 +연산자를 오버라이딩 하면, 좌표계를 입력받아, x는 x끼리 y는 y끼리 더해진 좌표를 구할 수 있습니다.

정리

오버라이딩을 이해하고, 기존에 만들어져 있는 연산자를 오버라이딩 해서 새로운 매개변수를 연산할 수 있는 연산자로 확장해 보았습니다.

댓글

이 블로그의 인기 게시물

[IOS] AppDelegate는 뭐하는 녀석이지?

[git] Github 이슈 라벨(issue labels)

[git] git의 upstream과 origin 헷갈리는 사람 손!