swift 문법 정리 - Function 함수 사용하기

swift Function 함수 사용에 대해서 알아 보겠습니다. 프로그래밍에서 함수란 특정 기능을 수행하는 코드 집합이라고 생각하면 됩니다. 함수에는 함수를 호출 할 수 있도록 이름을 정의해 주어야 합니다.

 

함수 정의하기

func functionName(external paramName: paramType) -> returnType {
	//.......... 함수 코드 수행
	return returnValue
}

swift에서 함수를 정의할 때에는 func키워드를 이용합니다. 그리고 functionName 함수의이름은 이름을보고 어떤 동작을 하는 함수있지 판단이 될수 있도록 구체적으로 지어주면 좋습니다. swift의 parameter는 조금 특이한 부분이 있는데요. 외부에서 사용할 매겨변수 이름을 따로 정할 수있습니다. 매개변수를 정의할 때에 외부 매개변수 이름 내부 매개변수이름: 데이터 타입 으로 사용 할 수 있으며 외부 매개 변수는 필수는 아닙니다. 함수의 반환값을 정해줄 때에는 →반환데이터 타입으로 사용합니다. 이제 차근차근 알아봅시다.

 

func printName(){
	print("My name is Minmong")
}

printName()

함수내부에서 print함수를 호출하고 있습니다. 해당 함수는 인자, 반환값 모두 없는 함수입니다. func키워드를 사용한 것 외에는 크게 특이한 부분이 없습니다. 함수 호출은 함수이름을 이용합니다.

출력 : My name is Minmong

 

함수 인자 이름 살펴보기

func totalPrice(price: Int, count: Int){
	print("총 가격은 \(price * count)")
}

totalPrice(price: 100, count: 5);

C에서는 데이터를 먼저 사용하였는데, swift에서는 매개변수이름부터 앞에 오게 됩니다. name: type의 형태가 됩니다. 위에 코드는 price는 매개변수 이름이 되며 Int는 데이터 타입입니다. Count도 같은 방식으로 이름 Int는 데이터 타입이 되겠습니다. swift에서 또 한가지 특이한 점은 함수를 호출 할 때에 변수명을 사용해야 합니다. C와 차이점이 많이 있네요. C에서 해당 함수를 호출 했다면 totalPrice(100, 5) 로되었겠죠. 하지만 swift에서는 함수에 인자값을 넣어서 호출 할 때에 매개변수 이름을 사용해야 하는 포인트가 있습니다.

출력 : 총 가격은 500

 

func totalPrice(cost price: Int, num count: Int){
	print("총 가격은 \(price * count)")
}

totalPrice(cost: 100, num: 5);

처음 설명 한 것 기억하시나요? swift는 함수 외부 매개변수 이름이 있습니다. 앞에서 함수를 호출 할 때에 매개변수명을 사용 한 것을 볼 수 있죠? 외부매개변수 이름을 따로 정의하지 않으면 price를 그대로 사용하면 되지만 지금 처럼 cost, num이라는 외부 매개변수 이름을 정하게 되면 함수를 호출할 때에 해당 이름을 사용해야지 호출할 수 있습니다.

 

 

이렇게 price, 와 count를 사용하여서 함수 호출하려고 하면 에러가 발생하는걸 볼 수 있습니다. 

 

func totalPrice(_ price: Int, _ count: Int){
	print("총 가격은 \(price * count)")
}

totalPrice(100, 5);

swift에서 underscore는 비워둔다는 의미로 사용되어집니다. 이렇게 외부 매개변수 이름을 _로 비워두게 되면 함수 호출시 값만 넣어주어도 호출을 할 수 있게됩니다. 제가 익숙한 함수 호출 방식이네요. swift 함수를 보고 이렇게 호출을 해보니 가독성이 확실히 떨어져 보이네요.

 

func totalPrice(price: Int = 100, count: Int){
	print("총 가격은 \(price * count)")
}

totalPrice(count: 5); // 디폴트 값으로 100을 넣어줘서 price값이 없어도 호출 가능

함수 파라미터의 기본값을 지정 해 줄 수 있습니다. 기본값을 지정하게 되면 함수 호출시 생략이 가능합니다. 생략을 할 경우에는 기본값이 변수에 할당되게 됩니다. totalPrice에 count에만 값을 5로 할당 했지만 price의 기본값이 100이기 때문에 위와 동일하게 결과 출력값은 500이 됩니다.

 

func calculatePrice(price: Int, count: Int)->Int{
	return price * count
}

let totalPrice = calculatePrice(price: 100, count: 5); 
print("총 가격은 \(totalPrice)")

함수의 반환값은 정할 때에는 화살표를 이용합니다. 화살표의 방향에 내가 반환하고자 하는 데이터형으로 정의를 할 수 있습니다. 이번에는 총 가격을 계산하는 함수 입니다. 함수내부에서 price * count 가격과 개수를 곱해서 총 가격을 계산하고 있습니다. 해당 값을 이번에는 바로 출력하는게 아니라 반환해봅시다. totalPrice에는 계산된 500이 반환되어서 값이 할당됩니다.

출력 : 총 가격은 500

 

함수 오버로딩

함수 오버로딩이란 같은 이름을 가진 여러 함수를 정의할 수 있는 기능입니다. swift 에서는 같은 함수이름 이더라도 매개변수 타입이 다르거나 혹은 매개변수 이름이 다를 경우 다른 함수로 본다는 것입니다. swift에서는 함수 호출시 변수를 사용하여서 호출하기 때문에 C++과는 달리 매개변수 이름이 달라도 다른 함수로 보고 있습니다. 외부 매개변수의 이름이 다를경우도 다른 함수로 보고 있습니다. totalPrice라는 하나의 이름으로 여러 함수를 만드는걸 함수 오버로딩이라고 합니다.

 

 

totalPrice를 호출 하려고 하면 위에서 만든 5개의 함수 목록이 나오는걸 볼 수 있습니다. 

 

 

C++에서는 리턴 반환타입은 함수 오버로딩에서 고려되지 않습니다. 하지만 swift에서는 return 타입이 다르지만 함수이름은 같은 함수를 정의할 수 있습니다. 대신 함수를 호출할 때에 타입추론을 사용하지 않고 명시적으로 데이터 타입을 지정해주어야 합니다. sumCost의 데이터 타입을 Int로 하지 않고 호출하게 되면 함수 호출이 모호하다는 에러를 볼 수 있습니다.

Ambiguous use of 'totalPrice(price:count:)'

 

In-out 파라미터

함수내에서 매개변수의 값을 증가하려고 하니 에러가 납니다. input으로 변경할 수 없다고 하네요. 그리고 'input' is a 'let' constant 라고 하며 매개변수 값이 let 상수 인 것을 알려줍니다.  원하는건 num을 +1 시키고 출력하는 것인데요. swift 에서 함수를 그냥 호출 할 경우 파라미터에 값이 그냥 복사가 됩니다. 즉 input은 num의 값인 5를 할당받았을 뿐입니다. 거기에 상수기 때문에 값을 변경 할 수도 없습니다. 따라서 C++의 call-by-reference 같은 방식을 사용 하려면 inout 파라미터를 사용 해야 합니다. 

 

 

매개변수를 선언할 때에 inout 데이터 타입 으로 만들어 주면 됩니다. 그리고 변수를 넘길때에 &(앰퍼샌드)를 사용해서 함수에 넘겨줍니다. 이제 함수 내부에서 inout 매개변수의 값이 변경 되면 함수 호출시 인자값으로 넘겨준 변수의 값도 같이 변하게 됩니다. C++의 레퍼런스와 비슷한 동작 방식이네요. 출력 결과는 6, 6이 됩니다. 함수내부에서 5에 +1이 되어서 6이  출력이 되고 num값도 함수 호출후 6으로 변경이 되었습니다. 따라서 마지막 print(num)의 출력값고 6이 됩니다.

그리드형(광고전용)

이 글을 공유합시다

facebook twitter googleplus kakaoTalk kakaostory naver band

댓글

Designed by JB FACTORY