🐦 Swift

[Swift] 함수

dev_zoe 2023. 3. 15. 13:27
반응형

본 포스팅은 '스위프트 프로그래밍 (3판) - 야곰 저' 도서와 앨런 Swift 문법 마스터스쿨 강의를 통해 공부하며 정리하는 포스팅입니다.

혹시 틀린 부분이 있거나 질문이 있으시다면 언제든지 댓글 달아주시면 정말 감사하겠습니다 :)


0. 함수를 사용하는 이유

  • 반복되는 동작을 단순화하여 코드 재사용
  • 코드를 논리적 단위로 구분하여 모듈화
  • 코드길이가 긴 것을 단순화

1. 함수

- Swift에서 함수는 일급 객체이다. (그 자체로 반환 값, 인자로 사용 가능)

func 함수 이름(매개변수1: 자료형, 매개변수 2: 자료형...) -> 반환타입 {
	실행 구문
    return 반환값
}

- 매개변수 = 파라미터 = 인자 : 함수의 정의에서 입력값으로 사용되는 변수

- 인수 = 아규먼트 : 함수의 호출에 사용되는 실제 값

 

1) 매개변수 이름과 전달인자 레이블(아규먼트 레이블)

- 매개변수의 이름 앞에 전달인자 레이블을 붙일 수 있고, 이를 통해 매개변수의 역할을 명확하게 할 수 있음

func sayHello(from myName:String, to name:String) -> String {
	return "Hello \(name)! I'm \(myName)"
}
//myName, name: 매개변수(=파라미터) 이름
//from, to : 전달인자 레이블

print(sayHello(from: "yuri", to: "Jenny")
//"yuri", "Jenny" : 인수(=아규먼트)

- 전달인자 레이블 사용 시, 함수 내부에서는 전달인자 레이블을 사용할 수 없으며 외부에서는 매개변수 이름을 사용할 수 없다.

- 전달인자 레이블이 변경되면, 함수 자체가 달라지므로 함수 중복 정의(오버로드)가 가능함

 

2) 와일드 카드 식별자 사용

- 위 예시와 같이 일일이 전달인자 레이블이나 매개변수 이름을 지정하기가 귀찮다면, 와일드 카드 식별자(_ )를 앞에 붙여서 생략할 수 있다.

func sayHello(_ myName:String, _ name:String) -> String {
	return "Hello \(name)! I'm \(myName)"
}
// _ : 와일드카드 식별자

print(sayHello("yuri", "yulzzang")) //Hello yulzzang! I'm yuri

 

3) 매개변수 기본값 사용

- 매개변수가 들어오지 않을 경우 사용할 기본값을 지정할 수 있다.

func sayHello(_name: String, times: Int = 3) -> String {
	var result: String = ""
    
    for _ in 0..<times {
    	result += "Hello \(name)!" + " "
    }
    
    return result
}

print(sayHello("yuri")) // Hello yuri! Hello yuri! Hello yuri!
print(sayHello("yuri", times: 2)) // Hello yuri! Hello yuri!

 

4) 가변 매개변수

- 매개변수로 몇 개의 값이 들어오는지 모를 때 사용하며, 0개 이상의 값을 받아올 수 있음

- 가변 매개변수로 사용할 매개변수의 타입 뒤에 ... 를 붙이면 됨

- 가변 매개변수로 들어온 인자값은 배열처럼 사용할 수 있음

- 함수마다 가변 매개변수는 1개만 사용가능

func sayHelloToFriends(me: String, friends names: String...) -> String {
	var result: String = ""
    
    for friend in names { //함수 내부에서는 전달인자 레이블 사용 불가
    	result += "Hello \(friend!)" + " "
    }
    
    result += "I'm " + me + "!"
    return result
}

print(sayHelloToFriends(me: "yuri", friends: "yujeong", "jeonga", "sugil")
//Hello yujeong! Hello jeonga! Hello sugil! I'm yuri!

 

5) 입출력 매개변수

- Swift의 함수는 보통 함수의 전달인자로 값이 전달될때, 해당 값을 복사하여 전달하지만, 원래 값을 변경하기 위해서는 함수에 입출력 매개변수를 지정하고 참조를 전달하면 된다.

- 매개변수의 자료형 앞에 'inout' 키워드를 붙이고, 전달될 변수나 상수앞에는 앰퍼샌드(&)를 붙여서 참조하게 한다.

- 입출력 매개변수는 가변 매개변수가 될 수 없으며, 기본값을 가질 수 없다.

var numbers = [1, 2, 3]

func nonReference(_ arr: [Int]) {
	var copiedArr = arr
    copiedArr[1] = 1
}

func reference(_arr: inout [Int){
	arr[1] = 1
}

nonReference(numbers)
print(numbers) //1, 2, 3

reference(&numbers)
print(numbers) //1, 1, 3

 

6) 반환값을 무시할 수 있는 함수 

- 가끔씩 함수의 반환값이 반드시 필요하지 않은 경우도 있는데, 이럴때 @discardableResult 를 사용하면 경고를 없앨 수 있음

@discardableResult func discardResult(_ something: String) -> String {
	print(something)
    return something
}

disracdResult("hello") //hello //경고창 X

 

2. 함수 사용 시 주의사항

- 파라미터는 변수가 아닌 상수이므로, 함수 내부적으로 값이 불가능하다. 값의 변경을 원한다면 새로운 변수에 값을 복사해서 사용해야 한다.

- 함수 내에서 선언한 변수 혹은 함수는, 함수 밖에서 사용이 불가능하다.

- 리턴타입이 있는 함수는 특정 값을 리턴하면서 함수를 그 자리에서 바로 중지하며, 리턴타입이 없는 함수는 함수를 그 자리에서 중지한다.

 

반응형