상세 컨텐츠

본문 제목

[Day14] Function : 매개변수(3)

Swift&SwiftUI

by (방울)도마토 2024. 5. 1. 22:16

본문

내부 매개변수명, 외부 매개변수명 

- 외부 매개변수 : 함수 외부에서 함수나 인자값을 구분하기 위해 사용하는 변수 

    - 인자값에 대한 레이블, 함수의 식별자 일부로 사용 

- 내부 매개변수 : 입력된 인자값을 함수 내부에서 참조하기 위해 사용하는 변수

    - 함수 범위 내에서는 내부 매개 변수를 일반 변수처럼 사용하여 인자값을 얼마든지 참조할 수 있음 

- 별도로 외부 매개변수를 나누지 않을 경우 일반 매개변수가 인자 레이블 역할까지 겸하지만, 외부 매개변수를 명시적으로 정의하면 이때부터는 외부 매개변수가 인자 레이블이 됨 

→ 함수를 호출하거나 함수 이름을 식별할 때 모두 외부 매개변수를 사용해야 함 

func 함수명(<외부 매개변수명><내부 매개변수명>: <type>, <외부 매개변수명><내부 매개변수명>: <type> ...) {
    // 함수 내용 작성
}

 

// 외부 매개 변수를 사용하지 않은 일반 함수 
func printHello(name: String, msg: String) {
    print("\(name)님, \(msg)")
}
// name, msg를 인자 레이블로 붙여주어야 함 
// 함수명 : printHello(name:msg:)
printHellp(name: "홍길동", msg: "안녕하세요")


// 외부 매개 변수를 사용한 함수 
func printHello(to name: String, welcomeMessage msg: String) {
    print("\(name)님, \(msg)")
}
// 외부 매개 변수인 to, welcomeMessage를 활용하여 호출해야 함 
// 함수명 : printHello(to:welcomeMessage:)
printHellp(to: "홍길동", welcomeMessage: "안녕하세요")


// 외부 매개 변수를 생략한 경우
// _ : 문법은 적용하되 사용하지 않는다, 생략하겠다
func printHello(_ name: String, _ msg: String) {
    print("\(name)님, \(msg)")
}
// 내부 매개변수와 외부 매개변수를 분리하지만 외부 매개변수명을 사용하지 않겠다는 의미
// 함수명 : printHello(_:_:)
printHellp("홍길동", "안녕하세요")


// 일부 외부 매개 변수만 생략한 경우 
func printHello(_ name: String, welcomeMessage msg: String) {
    print("\(name)님, \(msg)")
}
// 내부 매개변수 name의 인자 레이블 생략 가능 
// 함수명 : printHello(_:welcomeMessage:)
printHellp("홍길동", welcomeMessage: "안녕하세요")

 

- to와 welcomeMessage는 외부에서 호출할 때 사용하는 이름 

    - 함수 내부에서 인자값을 받아 사용할 때는 내부 매개변수명인 name, msg가 그대로 사용됨 

 

- 외부 매개변수명은 매개변수명이 내부와 외부에서 바라보는 의미가 달라 외부와 내부로 구분하여 사용할 필요가 있을 때, 혹은 내부 매개변수명을 외부로 공개하기를 원치 않을 때 사용 

- 내부 매개변수명이 너무 길어서 호출과정이 불편할 때 

 

 

가변인자

- 가변적인 개수의 인자값을 입력받아야 할 때 사용

func 함수명(매개변수명: 매개변수 타입...)
// ... : 생략의 의미가 아님!

- 해당 방식으로 정의된 매개변수는 가변인자로 인식

    - 개수를 제한하지 않고 인자값을 입력받으며 입력된 인자값을 배열로 처리 

    - for~in 구문을 사용하면 입력된 모든 인자값을 순서대로 읽어 들일 수 있음 

// 입력된 값들의 평균값을 계산하는 함수
func avg(score: Int...) -> Double {
   var total = 0
   for r in score { // 배열로 입력된 값들을 순회 탐색하면서 점수 합산
       total += r
   }
   return (Double(total) / Double(score.count))
}

// 개수 제한 없이 인자값(score)을 입력받음
// score -> 배열로 처리됨 
print(avg(score: 10, 20, 30, 40)) // 25.0

 

 

 

기본값을 갖는 매개변수

func 함수명(매개변수: type = 기본값) {
    // 함수 실행 내용
}


// 기본값이 지정된 함수 : 줄바꿈
func echo(message: String, newline: Bool = true) {
    if newline == true {
        print(message, true) // 줄바꿈 실행 
    } else {
        print(message, false) // 줄바꿈 실행 X
    }
}

- 특별한 경우가 아니라면 기본적으로 내용이 출력되고 난 후 줄바꿈 처리가 되기를 기대

    - 줄바꿈 여부에 대한 두 번째 인자값(newline)의 경우 매번 같은 값을 넣어주어야 함 

    - newline에 기본값을 할당해주면 일반적인 출력 구문을 원할 때 단순히 출력할 메시지만 입력, 굳이 줄바꿈을 원하지 않을 때는 newline에 false 할당 

echo(message: "안녕하세요") // 줄바꿈을 원하는 상황
echo(message: "안녕하세요", newline: false) // 원하지 않는 상황

// 기본값을 작성한 해당 함수는 두 가지 형식으로 생성됨 
echo(message: String)
echo(message: String, newline: Bool)

 

 

 

매개변수의 수정

- 매개변수에 입력된 인자값을 함수 내에서 수정하려고 하면 오류가 발생 → 정확히는 매개 상수가 맞음 ㅎ

func incrementBy(base: Int) -> Int {
    base += 1
    return base
} // Left side of mutating operator isn't mutable : 'base' is a 'let' constant
// base는 상수로 정의되었으므로 왼쪽 수정 연산자가 값을 변경할 수 없음

 

⇒ 함수에 입력된 인자값은 함수 내부에서 항상 상수로 정의 

 

<참조> 상수로 정의되는 함수의 인자값이지만 내부에서 인자값을 수정하는 방법이 존재!

    → 매개변수와 동일한 이름으로 변수를 정의하고 매개변수의 값 대입 

func incrementBy(base: Int) -> Int {
    var base = base
        // 이후 base 호출은 변수 base를 가리킴
    base += 1
    return base
}

 

 

'Swift&SwiftUI' 카테고리의 다른 글

[Day16] Function: 함수의 중첩과 클로저  (1) 2024.05.16
[Day15] Function: 매개변수(4)  (0) 2024.05.02
[Day12, 13] Function : 함수의 기본 개념(1), (2)  (0) 2024.04.23
[Day11] Optional(2)  (0) 2024.04.22
[Day10] Optional (1)  (0) 2024.04.19

관련글 더보기

댓글 영역