본문 바로가기
Apple/Swift

[Swift] 거듭제곱하기

by 어멘드 2022. 1. 15.
반응형

 거의 PS용 문법들만 포스팅하게 되는 것 같은데..ㅎㅎ 오늘은 거듭제곱이다. 반복문으로 구현해도 되지만 메소드로 만들어져 있다! 사용법 요약부터 하면

let resultOfPow = pow(3.0, 2.0)	// 9.0
				// Int로 형변환 하려면 Float형으로 호출해야 함

var sum = 0
sum += Int(resultOfPow)		// Int형과 더하려면 형변환 필요

 


 스위프트의 거듭제곱 메소드는 pow이다.

 종류가 이렇게 많은데, 호출 시에 파라미터를 다 _로 생략하게 되어있으니까 자료형에 맞춰서 알아서 맞는 것으로 호출되겠지..? 하는 생각을 하며 일단 시작

 

 

 pow(x,y)에서 x가 밑이고 y가 지수이다.

 알고리즘 문제에서는 거의 밑과 지수 모두 정수일 때이니까 정수^정수를 해보자. 이렇게 잘 구해진다.

pow(3, 2) 	// 3^2 = 9
pow(5, 3)	// 5^3 = 125

 


 근데 문제가 있다...

 주로 거듭제곱한 값을 단독으로 사용할 일은 거의 없고 다른 정수와 더해주거나 하는데, 리턴 타입이 Int가 아니라는 점이다.

 이렇게 pow(3,2)를 Int형 sum 변수에 더해주려고 하니 Cannot convert value of type 'Decimal' to expected argument type 'Int'라는 에러가 떠버린다.

 

 

 그래서 Int형으로 형변환을 해줬다.

 와아 새로운 에러가 또 떴다. Ambiguous use of 'pow' 

 pow 종류가 타입에 따라서 여러 개가 있었는데, 그중 어떤 것을 사용한 것인지 Ambiguous 하다는 말이다.

 그냥 pow만 해줬을 때는 이런 에러가 안 뜨다가 갑자기 이런 에러가 뜨는 이유는 Int의 init의 파라미터로 들어갔기 때문이다.

 

 

 Int.init(_:)을 쓰려면 pow의 리턴 타입을 알아야 함 -> pow의 리턴 타입이 뭔지 애매함

 이렇게 된 것이다..! 

 pow만 단독으로 써줬을 때는 리턴 타입을 아무거나로(Decimal로) 알아서 정해줬는데, 이게 init의 파라미터로 들어가면 그렇게 할 수가 없다.

 Int의 init 중에서 Decimal 타입을 받는 건 없기 때문에 만약 Decimal이면 Int형으로 바꾸는 게 불가능하고, Float, Float80, CGFloat이면 가능하니까 뭘로 정하느냐에 따라서 결과가 달라지는 것이다.

 


 pow의 리턴 타입을 명확하게 해 주면 해결이 되는데, 리턴 타입을 명확하게 해주는 방법은 호출할 때 파라미터 타입을 명확하게 해주는 것이다.

 호출할 때는 이렇게 소수점을 붙여서 3과 2가 각각 Decimal, Int 타입이 아니라는 것을 알려주자.

pow(3.0, 2.0)

 

 이제 다시 Int형으로 형변환을 시도해보면.. 잘된다!

var sum = 0
sum += Int(pow(3.0, 2.0))
print(sum)  // 9

 

반응형

댓글