[Swift] #2. Swift 함수 관련 이것저것 정리
- 함수의 기본 형태
func 함수이름(파라미터 이름: 파라미터 타입) -> 리턴값 타입 {
함수 내용
}
→ (Return Arrow) : 하이픈과 부등호를 같이 써서 return arrow라고 한다. 오른쪽에 반환되는 데이터 타입을 적어준다.
func hello(name: String) -> String {
return "Hello~ \(name)!"
// return "Hello~ " + name + "!"
}
print(hello(name: "Seori")) // Hello~ Seori!
Function Call : 함수이름(파라미터 이름: 입력값)
print()도 Swift 내의 함수! → 문자열, 숫자, 변수 모두 파라미터로 올 수 있다.
- 함수의 여러가지 형태
1. 리턴값이 없는 함수
⇒ return arrow랑 타입 모두 지워주거나 → Void를 써 주면 된다.
2. 리턴값을 여러 개 반환하는 함수
⇒ 튜플(tuple)을 반환값으로 사용한다. → 2개 이상 가능!
// 입력값이 없고 반환값이 여러 개인 (튜플 형태로 반환하는) 함수이다.
func myInfo() -> (name: String, age: Int) {
return ("서리", 22)
}
let info = myInfo()
print(info.name) // name값인 String 타입의 "서리"만 출력.
print(info.age) // age값인 Int 타입의 22만 출력.
print(info) // 튜플 형태로 출력 -> ("서리", 22)
- 튜플: 관련된 값을 임시로 그룹지을 때 유용하게 사용할 수 있다.
3. 입력값(파라미터)가 없는 함수
⇒ 빈 괄호()로 두면 된다.
4. 파라미터의 갯수 제한이 없는 함수
⇒ 가변 매개변수(Variadic Parameters) 사용!
- ...을 사용하면 가변 매개변수로 받아올 수 있다.
- 함수마다 가변 매개변수는 하나만 가질 수 있다.
// Int형 가변 매개변수 numbers.
func addNumbers(numbers: Int...) -> Int {
var sum = 0
for num in numbers {
sum += num
}
return sum
}
addNumbers(numbers: 1, 2, 3, 4, 5) // comma(,)로 구분해서 여러 개 넣어준다.
→ 가변 매개변수는 함수 내부에서 array 형태로 쓰이게 된다. ⇒ numbers는 [Int] 타입.
- 함수 파라미터의 기본값 설정하는 방법
→ 파라미터로 입력값이 들어오지 않아도 설정된 기본값으로 함수가 돌아갈 수 있다.
// num2의 기본값을 100으로 설정.
func addTwoNumbers(num1: Int, num2: Int = 100) -> Int {
let sum = num1 + num2
return sum
}
addTwoNumbers(num1: 5) // 5 + 100(기본값) = 105
addTwoNumbers(num1: 2, num2: 3) // 5
→ 이처럼 num2의 기본값을 설정해두면 파라미터를 1개만 받는 함수도 쓸 수 있다.
- Argument Label
: 파라미터에 대한 설명(기능, 역할)을 자세히 적은 것.
- 파라미터 이름이 길면 구현부가 지저분해지니까 주로 argument label을 자세히 길게 적고 파라미터 이름은 간략하게 작성한다.
- 생략 가능 → 언더스코어(_) 사용하면 된다.
// _를 통해 Argument Label 생략한 경우.
func calculate(_ num1: Int, _ num2: Int) -> Int {
return num1 * num2
}
// Argument Label 생략하지 않고 사용한 경우.
func calculate(devideFirstNumber num1: Int, bySecondNumber num2: Int) -> Int {
return num1 / num2
}
calculate(10, 5) // 10 * 5 = 50
calculate(devideFirstNumber: 10, bySecondNumber: 5) // 10 / 5 = 2
→ 함수가 argument label이나 파라미터 이름으로 구분 가능하면 함수의 이름이 같아도 쓸 수 있다!
- 변수와 상수의 Scope
: 변수와 상수를 사용할 수 있는 유효한 범위.
func addTwoNumbers(num1: Int, num2: Int = 100) -> Int {
let sum = num1 + num2
return sum
}
→ 위의 코드에서 상수 sum의 scope는 { }로 둘러싸인 부분, 함수의 바디 부분이다. 함수의 바디 밖에서는 sum을 사용할 수 없다. 함수가 호출될 때 상수 sum이 생성되고 return을 하고 나면 소멸된다.
→ 생성~소멸에서 sum은 초기화 이후 값이 바뀌지 않으므로 상수로 선언한 것이다.
* scope가 다르면 변수/상수의 이름이 같더라도 에러가 발생하지 않음! *
- inout 키워드
🤔 함수의 매개변수들은 변수(var) 타입일까, 상수(let) 타입일까?
🫢 초기화 이후 값이 바뀔 수 없는 상수(let) 타입으로 선언된다!
그렇기 때문에 함수 내에서 매개변수의 값을 바꾸면 에러가 발생한다.
그렇다면, 매개변수의 값을 바꾸는 방법은 아예 없는 걸까?
⇒ inout 키워드를 사용하면 값을 변경할 수 있다!
func multiple(num1: inout Int, num2: Int) -> Int {
num2 = 5
return num1 * num2
}
var two = 2
var three = 3
multiple(num1: two, num2: &three) // 2 * 5 = 10
1. 변경하고자 하는 매개변수의 콜론(:)과 타입 사이에 inout을 넣어준다.
2. 함수를 호출할 때 그 매개변수의 자리에 &변수의 형태로 값을 전달한다.
⇒ 밑에서 볼 Call by reference. 참조에 의한 값 전달 방식!
⇒ two는 Call by value 방식이라서 two의 값 2가 복사돼서 전달된 거지만, 그와 달리 three는 변수 three 자체가 넘어가는 것이다. 그래서 num2 = 5로 변경할 때 three 변수가 변경되는 거라 가능한 것.
→ var three 자체가 num2로 넘어온 거라서 num2도 var 타입으로 나온다.
- 값/참조에 의한 전달
1. 값에 의한 전달(Call by value) : 값이 복사되어 넘어간다.
⇒ 변수 two의 메모리 주소와 매개변수 num1의 메모리 주소가 다르다.
⇒ 둘의 메모리 주소는 다르지만 그저 같은 값(2)을 가지고 있는 것.
2. 참조에 의한 전달(Call by reference) : 변수 자체가 넘어간다.
⇒ 변수 three의 값이 저장된 메모리 주소를 보낸다는 뜻.
⇒ 매개변수 num2도 변수 three와 같은 메모리 주소를 가리키게 된다.
→ 그래서 함수 안에서 매개변수 num2로 그 메모리 주소의 값을 바꾸면 같은 곳을 가리키고 있는 변수 three의 값도 바뀌는 것이다.
제 글이 도움이 되었다면 좋아요 부탁드립니다! 😊
참고 사이트 :
→ 이 강의를 듣고 스스로 정리한 내용입니다!