- swift에 대해 공부한 내용을 정리한 글입니다.
- 해당 글은 한빛미디어의 스위프트 프로그래밍 3판을 참고하여 작성했습니다.
함수란 하나의 특별한 작업을 수행하기 위해 독립적으로 설계된 코드의 집합이라고 할 수 있다.
함수를 사용하면 반복적인 프로그래밍을 피할 수 있다.
특정한 목적을 수행하기 위해 함수를 호출하여 시간과 비용을 절감 및 유지 보수에 용이하다.
지난 학기에 프로젝트 수업을 듣다가 교수님께서 함수와 메서드의 차이가 뭐냐고 질문하신 적이 있다. 책에서도 그렇고 수업 중에도 함수와 메서드라는 용어는 혼용되어 사용된다. 당연히 같은 줄 알았는데 질문하셔서 순간적으로 당황했던 기억이 있다.
함수와 메서드는 한 마디로 '동일'하다고 말할 수 있다. 다만, 상황이나 위치에 따라 다른 용어로 부르는 것 뿐이다. 구조체, 클래스, 열거형 등 특정 타입에 연관되어 사용하는 함수를 메서드, 모듈 전체에서 전역적으로 사용할 수 있는 함수를 그냥 함수 라고 부른다.
스위프트의 함수는 자유도가 굉장히 높다고 한다. 기본적으로 함수의 이름과 매개변수(Parameter), 반환 타입(Return type) 등을사용해 함수를 정의한다.
함수를 정의하는 키워드는 func
로, 다음과 같이 정의한다.
func 함수 이름 (파라미터 이름: 데이터 타입) -> 반환 타입 {
실행 코드
return 반환 값
}
func hello(name: String) -> String {
return "Hello \(name)"
}
let helloJenny: String = hello(name: "Jenny")
print(helloJenny)
Hello Jenny
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