[Swift] 5. 함수

Hoojeong Kim·2021년 9월 8일
0

Swift Base

목록 보기
7/22
post-thumbnail

함수란?

함수란 하나의 특별한 작업을 수행하기 위해 독립적으로 설계된 코드의 집합이라고 할 수 있다.

함수를 사용하면 반복적인 프로그래밍을 피할 수 있다.
특정한 목적을 수행하기 위해 함수를 호출하여 시간과 비용을 절감 및 유지 보수에 용이하다.

함수와 메서드

지난 학기에 프로젝트 수업을 듣다가 교수님께서 함수와 메서드의 차이가 뭐냐고 질문하신 적이 있다. 책에서도 그렇고 수업 중에도 함수와 메서드라는 용어는 혼용되어 사용된다. 당연히 같은 줄 알았는데 질문하셔서 순간적으로 당황했던 기억이 있다.

함수와 메서드는 한 마디로 '동일'하다고 말할 수 있다. 다만, 상황이나 위치에 따라 다른 용어로 부르는 것 뿐이다. 구조체, 클래스, 열거형 등 특정 타입에 연관되어 사용하는 함수를 메서드, 모듈 전체에서 전역적으로 사용할 수 있는 함수를 그냥 함수 라고 부른다.

함수 정의 및 호출

스위프트의 함수는 자유도가 굉장히 높다고 한다. 기본적으로 함수의 이름과 매개변수(Parameter), 반환 타입(Return type) 등을사용해 함수를 정의한다.

함수를 정의하는 키워드는 func로, 다음과 같이 정의한다.

func 함수 이름 (파라미터 이름: 데이터 타입) -> 반환 타입 {
	실행 코드
    return 반환 값
}

다음은 기본적인 함수 예제 코드이다.
func hello(name: String) -> String {
	return "Hello \(name)"
}

let helloJenny: String = hello(name: "Jenny")
print(helloJenny)
Hello Jenny

함수 내부의 코드가 한 줄이고, 해당 코드의 결과의 타입이 반환 타입과 일치한다면, 다음과 같이 `return` 키워드를 생략하는 것이 가능하다. (반환할 값이 없을 때도 생략!)
func hello(name: String) -> String {
	"Hello " + name
}

let helloAmy: String = hello(name: "Amy")
print(helloAmy)
Hello Amy

매개변수

스위프트의 함수는 매개변수를 어떻게 정의하는지에 따라서 모습이 크게 달라질 수 있다.

전달인자 레이블

전달인자 레이블을 사용한 함수는 다음과 같이 정의한다.

func 함수 이름 (전달인자 레이블: 파라미터 이름: 데이터 타입, 
			전달인자 레이블: 파라미터 이름: 데이터 타입) -> 반환 타입 {
	return 반환 값
}

💡 이때 전달인자란 무엇일까?

매개변수와 전달인자는 엄연히 다른 것이다. 매개변수는 정의한 함수 내에서 어떤 이름으로 사용할 것인지를 명시하는 반면, 전달인자는 함수를 호출할 때 어떤 이름으로 값을 보내줄 것인지를 명시하는 것이다.

✔︎ 매개변수 : 함수 내부에서 사용하는 이름
✔︎ 전달인자 : 함수 밖에서 호출할 때 사용하는 이름
✔︎ 전달인자 레이블 : 함수 정의 시, 매개변수와 함께 사용하며 생략 가능


전달인자에 대해 이해했다면, 전달인자 레이블을 사용해 친구에게 메시지를 전달하는 메소드를 만들어보자.
func sendMessage(from myName: String, to name: String) -> String {
	return "Hello, \(name)! I'm \(myName)"
}

sendMessage(from: "Hoojeong", to: "Jenny")
Hello, Jenny! I'm Hoojeong

함수 사용 시 전달인자 레이블을 사용하면 매개변수의 역할을 파악하기 용이해, 코드의 가독성을 높여준다.
만약 전달인자 레이블을 사용하고 싶지 않다면, 와일드 카드를 사용하면 된다.

func sendMessage(_ myName: String, _ name: String) -> String {
	return "Hello, \(name)! I'm \(myName)"
}

💡 와일드 카드는 또 뭔데? ...

스위프트에서는 코드의 양을 줄이기 위해 다양한 패턴을 사용한다. 와일드 카드는 이러한 패턴 중 하나인데, 자세한 설명은 다른 포스팅에서 다루겠다.
아무튼 와일드 카드는 값을 헤체하거나 무시하는 패턴이다. 즉, 와일드 카드가 있다면 그 위치에 들어갈 값은 무시해라! 라는 뜻이다.

✔︎ 와일드 카드 : 와일드 카드 식별자 위치에 오는 모든 것을 무시함


가변 매개변수

매개변수로 몇 개의 값이 들어올지 모를 때, 가변 매개변수를 사용할 수 있다. 가변 매개변수는 0개 이상의 값을 받을 수 있고, 받은 인자 값은 배열처럼 사용할 수 있다.

func sendMessage(myName: String, names: String...) -> String {
	return "Hello, \(names)! I'm \(myName)"
}

sendMessage(myName: "Hoojeong", names: "Jenny", "Amy", "Json")
Hello, ["Jenny", "Amy", "Json"]! I'm Hoojeong
profile
나 애기 개발자 👶🏻

0개의 댓글