[ios_Swift] Functions

이시영·2023년 8월 7일

함수는 함수를 사용하는 방법을 알아보자
함수란 특정 기능을 사용하기 쉽게 만들어둔 것으로 swift를 배우며 많이 사용되는 'print'등도 함수며 swift standard libtrary에서 제공하는 여러 함수들 중 하나이다.

swift의 기본함수를 호출하는 방법과 예시는 다음과 같다.

'Function name' ('parameter')

pirnt("Hello")

우리는 필요에 따라 함수들을 만들어 사용할 수도 있는데 swift 문법에서 함수는 아래와 같은 형식으로 구성된다.


func name (parameter){
	statement
}

함수문법을 만드는걸 함수를 '선언하다' 라고 표현하며 파라메터 다음에 나오는 대괄호를 함수 바디(function body)라고 한다. 함수를 만들때 주의해야 할 부분이 있는데 이름을 잘 지어야 한다. 이름 형식은 low carmelcase 쓰는게 좋다.
또한 만약 리턴이 없다면 아래쪽 예시처럼 화살표와 리턴타입을 생략할 수 있다.

함수를 선언했다고 함수바디에 있는 코드가 실행되는건 아니며 함수바디의 코드를 실행하기 위해선 호출해줘야 한다. 호출하는 방법은 아래와 같다.

func helloSwift (){
	print("Hello World")
}

helloSwift()
//"Hello World"

위의 'helloSwift()' 처럼 함수를 호출하는 코드를 Call-site 또는 Caller라고 부른다.

리턴값이 있는 함수의 구조를 좀 더 살펴보자면 아래와 같다.

func name (parameter) -> returnType{
	statement
    return expression
} 

화살표(->)의 경우 화살표 앞뒤 한 칸씩을 반드시 띄워주어야한다.
리턴 타입은 리턴형 이라고도 하는데 리턴하는 값의 자료형(Type) 이다.
함수 리턴(return)과 표현식(expression)이 합쳐진 retutn expression을 리턴문이라고 하며 이는 두가지 역할을 가지고 있다.
호출하면 실행중인 함수를 끝내고 표현식(expression)을 평가한 후 결과를 리턴한다.
리턴문에서 표현식을 생략할 수도 있는데 이때는 함수를 끝내는 역할만 하고 표현식을 리턴하지 않는다.

리턴값이 있는 함수의 예를 들어보면

func add() -> Int {
	return 1+1
}
add()
// 2

위의 식에서 리턴값(2)은 함수를 호출하는 부분인 add() 즉 Call-site로 들어간다.
위 식에서 return 에 부여된 1+1 이 리턴에 부여된 표현식(expression)이며 return은 이를 평가하여 도출된 값(2)을 그 아래 함수호출부 ('add()')에 대입하는 것이다.
이렇게 함수가 도출한 결과는 아래처럼 특정 값에 저장하는 것도 가능하다.

func add() -> Int {
	return 1+1
}

let a = add()

즉 타입은 returnType으로 추론된다. (위 예시에서는 Int) 함수 호출식은 표현식(expression)이며 함수가 return 하는 값은 표현식(expression)의 결과가 된다.

또한 위의 예시처럼 리턴타입이 선언되어있고 함수바디안에 문장이 리턴문 하나 뿐일때는 'return'을 생략할 수 있다.
이를 Implicit Return 이라고 한다.
예를 들면 아래와 같다.

func add() -> Int {
	1+1
}
add()
// 2


Parameters

이번엔 함수의 파라메터에 대해 살펴보자

func name (parameter) -> returnType{
	statement
    return expression
} 

파라메터는 위에서 설명한것 처럼 함수이름 다음에 위치하며

(Name : Type, Name : Type)

위와같이 파라메터 이름과 타입으로 구성되어있다.
이를 함수문법에 적용한 예는 다음과 같다.

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

파라메터는 함수 바디에서 사용되는 임시상수이다. 때문에 값을 바꿀수 없으며 아래와 같이 값을 변경하려 한다면 오류가 발생한다.

func num (a : Int, b : Int) -> Int{
	a = 2
    b = 4
    return a+ b
}
// error

함수에 파라미터 있으며 호출하는 방법도 파라미터가 없는 함수와는 달라진다.

FunctionsName (ParameterName : expression)

이를 예를 들면
func num (a : Int, b : Int) -> Int{
    return a + b
}

num (a : 4, b : 8)

위의 코드는 함수를 호출하는 부분에서 파라미터 'a' 에 4를, 'b'에 8을 대입시키는 코드이다.

여기서 함수 num에 선언된 파라미터 'a'와 'b'를 Formal Parameter라고 부르며 아래 함수를 호출하는 부분에서 실제로 값을 전달하는 부분의 'a'와 'b'를 Actual Parameter 또는 Argument 라고 한다.

즉 함수선언(아래 num)에서 사용된 Argument는 함수실행의 Parameter에 적용되어 함수바디에서(계산에) 사용된다.


파라메터에 기본값을 저장할 수 도 있는데 코드는 아래와 같다.

(Name : Type = Value)

이렇게 값을 저장하면 함수를 호출할때 이 파라메터를 생략할 수 있다.

func greeting (say : String = "Hello"){
	print("\(say), Swift")
}

greeting(say)
// Hello, Swift

위와같이 함수호출시 파라메터를 생략하면 기본값이 적용된다.



Argument Label

Argument label은 함수 이름의 가독성을 높이기 위해 사용된다.
아래의 사용예시를 보면

(Name : Type)

(Label Name : Type)

위의 예시에서 함수선언식의 이름(Name부분)을 Parameter Name라고 하는데 이와 동시에 Argument Label 이다.
이 부분을 아래쪽 예시와 같이 선언할 수도 있는데 여기서 Label 부분이 Argument Label 이며 Name 은 Parameter Name 이다.
즉 하나만 쓰면 Parameter Name인 동시에 Argument Label인 것이다.

Argument Label은 쉽게 파라메터로 전달되는 값인 Argument의 앞에 오는 이름을 의미한다.
즉 함수를 호출하며 파라메터를 전달할 때는 Argument Label을 써야한다.

사용예시를 보면

func greeting (name : String = "Tomas"){
	print("Hello, \(name)")
}

func greeting (to name : String = "Tomas"){
	print("Hello, \(name)")
}

위와 같이 파라메터 이름 앞에 붙여준 'to' 가 Argument Label 이다.
같은 범위 안에 같은 이름의 함수가 오면 오류가 발생하지만 위의 예시에서는 두번째 함수(greeting)에서 Argument Label를 사용했기 때문에 다른 함수로 취급된다. 첫번째 함수는 greeting name, 두번째 함수는 greeting to 읽으며 범위안에 같은 이름의 함수가 하나뿐이면 Argument Label을 생략할 수 있다.

Argument Label 은 함수를 호출할 때 사용되는 이름이며 함수바디 에서 파라미터에 접근할 때 사용되는 이름은 아니다. 때문에 아래와 같이 사용하면 오류가 발생한다.

func greeting (to name : String = "Tomas"){
	print("Hello, \(to)")
}
// error

아래와 같이 함수 호출시 사용해주면된다.

func greeting (to name : String = "Tomas"){
	print("Hello, \(name)")
}

greeting(to : "John")
// Hello John

greeting(name : "John")
// error

Argument Label이 있는경우에는 함수호출시에도 반드시 Argument Label을 사용해주어야한다.

여기서 Argument Label은 생략할 수도 있는데 와일트 카드 패턴을 사용해주면된다.

func greeting (_ name : String = "Tomas"){
	print("Hello, \(name)")
}

greeting("John")
// Hello John

함수 선언식에서 Argument Label 을 생략했다면 함수호출시에도 Argument Label을 생략하고 바로 값을 입력할 수 있다.

함수이름은 보통 함수의 역할을 설명하는 동사로 시작하며 필요에 따라 명사가 포함되기도 한다. Argument Label 은 주로 전치사를 많이 쓰며 Parameter Name은 주로 명사를 많이 사용한다. 이 셋이 함쳐졌을때 간단한 문장으로 읽어지면 좋은 이름이라고 한다.

0개의 댓글