본문 바로가기

iOS 관련 공부

함수의 응용, 함수 사용시 주의점

함수의 응용

1) 아규먼트 레이블

// 아큐먼트 레이블을 사용하면

func printName1(first name: String) {
    print("나의 이름은 \(name) 입니다.")
}



printName1(first: "뉴턴")





//아규먼트 레이블 사용 안하면


func someFunction(first: Int, second: Int) {
    print(first + second)
}


someFunction(first: 1, second: 2)




//아규먼트 레이블 사용하는 것의 이점 (일반적으로 함수를 사용할때 더 명확하게 무엇을 요구하는 지 알려줄 수 있다.)

func someFunction1(writeYourFirstNumber a:Int, writeYourSecondNumber b: Int) {
    print(a + b)
}



someFunction1(writeYourFirstNumber: 3, writeYourSecondNumber: 4)

안에서는 간단하게 겉으로는 명확하게 알 수 있음

 

아규먼트 레이블은 파라미터 앞에 한칸 띄고 쓰면 된다.

 

 

2) 아규먼트 레이블을 생략해서 사용하는 것도 가능 (와일드카드 패턴)

func addPrintFunction(_ firstNum: Int, _ secondNum: Int) {
    print(firstNum + secondNum)
}



addPrintFunction(1, 2)

너무나도 명확한 경우에 생략해서 사용

 

 

3) 가변파라미터 - 함수의 파라미터에 정해지지 않은, 여러개의 값을 넣는 것도 가능(Variadic Parameters)

/**=============================================================
 - 1) 하나의 파라미터로 2개이상의 아규먼트를 전달할 수 있다.
 - 2) 아규먼트는 배열형태로 전달된다.
 - 3) 가변 파라미터는 개별함수마다 하나씩만 선언할 수있다.(선언 순서는 상관없음)
 - 4) 가변 파라미터는 기본값을 가질 수 없다.
===============================================================**/

func arithmeticAverage(_ numbers: Double...) -> Double {
    
    var total = 0.0
    
    for n in numbers {
        total += n
    }
    
    return total / Double(numbers.count)
}



//arithmeticAverage(5, 6, 7, 8, 9)



arithmeticAverage(1.5, 2.5, 3.5, 4.5)

정해지지 않은 여러개의 파라미터를 받을 때

 

 

4) 함수의 파라미터에 기본값(디폴트) 정하는 것도 가능

func numFunction(num1: Int, num2: Int = 5) -> Int {
    var result = num1 + num2
    return result
}




numFunction(num1: 3)
numFunction(num1: 3, num2: 7)

숫자를 주지 않으면 기본값으로 사용

 

 

 

아규먼트값이 항상 필요한 것이 아닐 수도 있다.

실제 애플이 미리 만들어 놓은 함수에는 기본값이 들어 있는 경우가 꽤 있다.

print(items: Any..., separator: String, terminator: String)

생략해서 print()로 많이 사용

 

 

 

함수 사용시 주의점

return 키워드의 정확한 이해

 

return 키워드의 역할

  1) 리턴타입이 있는 함수의 경우(아웃풋이 있는 경우):

      리턴 키워드 다음의 표현식을 평가한 다음에 그 결과를 리턴하면서 함수를 벗어남

  2) 리턴타입이 없는 함수의 경우(아웃풋이 없는 경우):

      함수의 실행을 중지하고 함수를 벗어남 ⭐️

// 리턴 타입이 있는 경우

func addFunction(num1: Int, num2: Int) -> Int {
    var result = num1 + num2
    return result
}



addFunction(num1: 3, num2: 4)     // 7




// 리턴 타입이 있는 경우

func valuationFunction(num: Int) -> Int {
    
    if num >= 5 {
        return num
    }

    return 0
}



valuationFunction(num: 3)     // 0

valuationFunction(num: 5)     // 5




// 리턴 타입이 없는 경우

func numberPrint(n num: Int) {
    
    if num >= 5 {
        print("숫자가 5이상입니다.")
        return
    }
    
    print("숫자가 5미만입니다.")
}


numberPrint(n: 7)    // 숫자가 5이상입니다.

numberPrint(n: 4)    // 숫자가 5미만입니다.

// 만약 return이 없다면 조건에 부합하더라도 두 print 문 전부 출력.
// numberPrint(n: 7)  // 숫자가 5 이상입니다.
                      // 숫자가 5 미만입니다.

리턴 타입이 없는 경우

return을 적어주지 않으면 if문에 부합하는 조건 이어도 밑에 있는 print("숫자가 5미만입니다.") 여기까지 진행이 됨.

 

 

함수의 중첩 사용 - 중첩된 함수(Nested Functions)

 

함수 안에 함수를 작성할 수도 있다.

(함수 안에 있는 함수는 밖에서 사용이 불가능)

 

함수를 제한적으로 사용하고 싶을 때, 사용

func chooseStepFunction(backward: Bool, value: Int) -> Int {
    
    func stepForward(input: Int) -> Int {
        return input + 1
    }
    
    func stepBackward(input: Int) -> Int {
        return input - 1
    }
    
    
    if backward {
        return stepBackward(input: value)
    } else {
        return stepForward(input: value)
    }
    
}



// ChooseStepFunction(backward: true, value:3)   // 2


var value = 7

//case1
chooseStepFunction(backward: true, value: value)  // 6


//case2
chooseStepFunction(backward: false, value: value)  // 8

 

 

 

주의점 정리

구분 주의할 점
1) 파라미터의 이해 파라미터는 변수가 아닌 상수(let)이고, 함수 내부적으로만 쓰이므로 값의 변경이 불가능
(변경을 하려면 새로운 변수를 선언해야 함)
2) Scope(범위) 함수 내에서 선언한 변수는 함수 내에서 밖에 사용하지 못함 (외부 변수는 함수 내에서 접근 가능)
3) return 키워드 1) 리턴타입이 있는 함수:
리턴 키워드 다음의 표현식을 평가한 다음, 그 결과를 리턴하면서(함수 실행을 중지하고) 함수를 벗어남
2) 리턴타입이 없는 함수:
함수의 실행을 중지하고 함수를 벗어남
4) 함수의 실행문
(return 타입을 가지고 있는)
리턴 타입이 있는 함수를 호출하는 경우, 함수를 호출하는 것은 자체로 표현식(결과는 함수가 리턴하는 값)이라는 것을 인지하고 사용할 필요가 있음 
예시) nameString() == "스티브"
5) 함수의 중첩 사용 함수 내부에서 함수를 작성하여 사용하는 것도 가능
(다만, 외부에서 내부 함수는 접근불가능)

'iOS 관련 공부' 카테고리의 다른 글

옵셔널(Optional)  (0) 2025.01.03
inout 파라미터, guard문, @discardableResult  (0) 2024.12.31
함수의 형태  (0) 2024.12.24
제어전송문  (1) 2024.12.18
튜플  (0) 2024.12.12