본문 바로가기
iOS

[iOS 앱 개발] Swift 메소드/생성자 오버로딩(Overloading)

by Dokon Jang 2022. 9. 23.
반응형

OOP 프로그래밍에서 메소드를 오버로딩 하는 것은 매우 효율적으로 프로그래밍 할 수 있는 방법입니다.
Swift를 스터디하면서 메소드의 파라미터의 이름을 지정하여 메소드를 호출하는 것에 익숙하지 않습니다.
자바, C# 등에서는 파리미터의 순서에 따라 메소드를 호출 하기 때문에 이것에 익숙한 것 때문에 Swift의 메소드에서 파라미터 이름을 지정하는 것에 불편을 느끼곤 했습니다.

자바에서 아래와 같이 코드를 작성하면 동일 메소드에 동일 타입의 파라미터이기 때문에 컴파일 오류가 발생합니다.
(참고, 파리미터의 갯수는 같지만, 파라미터의 타입이 다르면 컴파일 오류가 발생하지 않습니다.)

public class Test{

	public void hello(String name){
	...
	}
	
	public void hello(string nickName){
	...
	}
}

 

Swift에서는 메소드의 파라미터가 동일해서 파라미터 이름으로 오버로딩을 할 수 있다는 것을 알게되었습니다.
아래의 코드를 보면 동일한 메소드명과 동일 타입의 파라미터로 메소드를 선언 할 수 있습니다.
물론 아래와 같은 오버로딩은 생성자에서도 함께 적용됩니다.

func hello(_ name : String){
    print("Hello \(name)")
}

func hello(name : String){
    print("Hello \(name)")
}

func hello(nickName : String){
    print("Hello \(nickName)")
}

hello("충무공 이순신")
hello(name:"이순신")
hello(nickName:"충무공")

 

오버로딩을 활용해서 동일 파라미터 갯수와 타입으로 원(Circle) 클래스의 생성자(init)를 선언해해보겠습니다.
원을 정의 하는 방법은 여러가지가 있는데 아래의 4가지 방법으로 클래스의 생성자를 선언합니다.

(1) 중심점과 반지름
(2) 중심점과 지름
(3) 중심점과 다른 한점
(4) 서로다른 두점

※ (1)과 (2), (3)과 (4)로 동일 파라미터로 오버로딩하였습니다.

class Circle{
    
    var centerX : Double // 원의 X 중심점
    var centerY : Double // 원으 Y 중시점
    var radius : Double  // 반지름

    // (1) 중심점과 반지름
    init (centerX : Double, centerY : Double, radius : Double){
        self.centerX = centerX
        self.centerY = centerY
        self.radius = radius
    }

    // (2) 중심점과 지름
    init (centerX : Double, centerY : Double, diameter : Double){
        self.centerX = centerX
        self.centerY = centerY
        self.radius = diameter / 2 // 반지름
    }

    // (3) 중심점과 다른 한점
    init (centerX : Double, centerY : Double, x : Double, y : Double){
        self.centerX = centerX
        self.centerY = centerY
        self.radius = sqrt(pow(centerX - x, 2) + pow(centerY - y, 2))
    }

    // (4) 서로다른 두점
    init (x1 : Double, y1 : Double, x2 : Double, y2 : Double){
        self.centerX = x1 + (x2 - x1) / 2
        self.centerY = y1 + (y2 - y1) / 2
        self.radius = sqrt(pow(x1 - x2, 2) + pow(y1 - y2, 2))
    }
}

자바나 C#으로 구현 할 때보다 더 유연하게 메소드와 생성자를 오버로딩하여 사용 할 수 있어 좋은 것 같습니다.

Swift를 스터티하면서 생소하기는 좋은 점이 많아 보이네요.^^

반응형

댓글