함수의 매개변수를 알아보자

2022. 6. 6. 21:15swift

매개변수란?

- 함수를 정의할 때 외부로부터 받아들이는 전달 값의 이름을 의미한다.

함수를 호출할 때 인수로 전달된 값을 함수 내부에서 사용할 수 있게 해주는 변수입니다. (위와 같은말이다)

- 대부분의 함수는 하나 이상의 매개변수를 가지며, 매개변수가 없는 함수도 존재합니다.

 

기본값을 받는 매개변수

- 함수에서는 매개변수마다 기본값을 지정해줄 수 있어 매개변수가 전달되지 않으면 기본값을 사용한다.

- 매개변수에 기본값을 설정하며 전달 값을 넘겨주지 않아도 기본값에 의해 동작할 수 있도록 만들 수 있다.

 

func echo (message:String, newline:Bool = true) {

    if newline == true {

        print(message, true)

    } else {

       print(message, false)

    }

 

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

-함수 내부에서 인자값을 받는 용도로 사용되는 매개변수는 내부 매개변수다.

반대로 함수를 호출할 때 사용하는 매개변수 이름을 외부 매개변수라고 한다.

 

var first = ""

var second = ""

func add(first x: Int, second y: Int) -> Int {

    //      first외부)x내부) 외부)내부)자료형 리턴형

    //    함수를 정의할 때는 내부 매개변수명을 사용한다.

    return(x + y)   //return(first+secod)는 오류다. (외부를 쓰면안된다.)

}

함수를 호출 할 때 에는 외부 매개변수를 사용해야한다.

add(first: 10, second: 20)     add(x:10, y:20) -오류다. (내부명을썼다.)

 

추가적으로 첫번째 외부 매개변수명만 생략하는경우 (ios 앱개발에 자주나온다고함)

func add(_ x:Int, with y: Int) -> Int {

    return(x + y)

}

print(add(10, with: 20))

// 첫번째는 생략해서 곧바로 "10"입력 두번째는 with선언해서 "with+20"

 

매개변수의 생명주기

-스코프(Scope): 변수가 생존할 수 있는 범위이다.

범위를 기준으로, 전역(Global) 변수와 지역(Local)변수로 나뉜다.

전역 변수는 프로그램 내 모든 위치에서 참조가 가능하고, 프로그램이 종료되기 전까지 특별한경우 제외하고 삭제되지 않는다.

 

로컬 변수는 특정 범위 내에서만 참조하거나 사용할 수 있다. 조건절, 함수 구문 등 특정 실행 블록 내부에서 선언된

변수는 모두 지역변수이다. 그 블록이 끝나면 제거된다. 이를 변수의 생명주기 라고 한다.

 

컴파일러가 변수를 찾는 순서

1.함수 내부에서 정의된 변수를 찾음.

2.함수 외부에서 정의된 변수를 찾음.

3.글로벌 범위에서 정의된 변수를 찾음.

4.import된 라이브러리 범위

 

InOut 매개변수

-함수 내부는 함수 외부에 영향을 미칠 수 없다.

 

var cnt = 30
func autoIncrement(value : Int-> Int {
    var value = value
    value += 1
    return value
}
print(autoIncrement(value: cnt)) // 31
print(cnt) // 30

inout 키워드로 함수 외부에 영향을 미칠 수 있다. 값 자체를 전달하는 것이 아니라, 값이 저장된 메모리 주소를 전달한다는 의미다. 인자값에는 주소 추출 연산자 &를 붙여주어야 정상적으로 전달이 가능하다.

& 연산자는 C언어와 유사하고, inout은 포인터 개념과 유사하다.

매개변수 뒤에 클론(:)과 'inout'  키워드를 붙인다.

func foo(paramCount:inout Int-> Int {
    paramCount += 1
    return paramCount
}
var count = 30
print(foo(paramCount: &count))  // 31
print(count)    // 31
이처럼 주소를 전달하는 것을 프로그래밍 용어로 "참조에 의한 전달"이라고 한다.
기존처럼 값을 복사하여 전달하는 것을 "값에의한 전달"이라고 한다.

값에 의한 전달과 참조에 의한 전달

값에 의한 전달 : 인자 값의 수정이 발생하더라도 원본 데이터에는 영향을 미치지 않는다.
 
참조에 의한 전달 : 외부 인자값 원본에도 영향을 미친다. 스위프트에서 inout 키워드를 사용한다. 예외적으로 클래스(Class)로 구현된 인스턴스는 inout 키워드를 사용하지 않아도 항상 참조에 의해 전달된다. 따라서 함수 내부에서 값이 수정되면 원본 객체에도 영향을 미치므로 주의해야 한다. inout 키워드를 붙인 매개변수에 상수, 리터럴 상수를 넣어서는 안된다.

 

'swift' 카테고리의 다른 글

변수, 상수에 대하여  (0) 2022.06.13
테이블 뷰에 관하여  (0) 2022.06.13
딕셔너리를 알아보자  (0) 2022.06.06
함수  (0) 2022.06.02
변수에 대해서  (0) 2022.06.02