내부 매개변수명, 외부 매개변수명
- 외부 매개변수 : 함수 외부에서 함수나 인자값을 구분하기 위해 사용하는 변수
- 인자값에 대한 레이블, 함수의 식별자 일부로 사용
- 내부 매개변수 : 입력된 인자값을 함수 내부에서 참조하기 위해 사용하는 변수
- 함수 범위 내에서는 내부 매개 변수를 일반 변수처럼 사용하여 인자값을 얼마든지 참조할 수 있음
- 별도로 외부 매개변수를 나누지 않을 경우 일반 매개변수가 인자 레이블 역할까지 겸하지만, 외부 매개변수를 명시적으로 정의하면 이때부터는 외부 매개변수가 인자 레이블이 됨
→ 함수를 호출하거나 함수 이름을 식별할 때 모두 외부 매개변수를 사용해야 함
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
}
[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 |
댓글 영역