Swift

[Swift] #2. Swift 함수 관련 이것저것 정리

서서리 2022. 4. 7. 23:58
SMALL

- 함수의 기본 형태

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) 타입일까?

 

calculate라는 함수의 매개변수(=파라미터)

 

🫢 초기화 이후 값이 바뀔 수 없는 상수(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의 값도 바뀌는 것이다.

 

num1은 아예 다른 메모리 주소에 저장되고 있음을 확인할 수 있다.

제 글이 도움이 되었다면 좋아요 부탁드립니다! 😊


참고 사이트 :

https://www.inflearn.com/course/%EC%95%84%EC%9D%B4%ED%8F%B0-%EC%95%B1-%EA%B0%9C%EB%B0%9C-%EC%9E%85%EB%AC%B8-2%ED%8E%B8/dashboard

→ 이 강의를 듣고 스스로 정리한 내용입니다!

LIST