처음 프로그래밍에 대해서 배울 때 전역 변수, 지역 변수를 접했을 때 사용하기 편한 전역변수만 사용하고 싶은데, 선생님 아니면 선배들은 그러면 안 된다는 소리를 자주 듣곤 했습니다.
교재에서는 이것을 "스파게티 코드??"라고 말하긴 하는데 직접 와닿진 않았습니다.
그래서 이번에 그 이유에 대해서 한번 찾아보았습니다.
Global VS Local
프로그래밍을 배우다 보면 변수를 선언하는 위치에 따라 전역변수, 지역변수로 나뉘게 됩니다.
이렇게 영역을 나누는 이유는 크게 4가지로 나눌 수 있습니다.
1. 변수의 범위 제한
전역변수는 프로그램 전체에서 접근이 가능하여 어디서든 사용이 가능하고 지역 변수의 경우 생성된 지역 내부에서만 접근이 가능하게 합니다. 이렇게 범위를 제한함으로써, 프로그램을 작성함에서 있어 예상치 못한 잘못된 변수에 접근에 대한 오류를 방지할 수 있습니다.
2. 메모리 관리
클래스를 예를 들어보았을때, 객체 내부에 저장 프로퍼티가 메모리가 해지되는 경우는 해당 객체가 메모리 해지가 되는 순간입니다. 반면에 전역 변수는 프로그램이 실행하는 동안에는 계속 메모리에 남아있게 될 것입니다.
3. 이름 충돌 방지
같은 이름을 일지라도 지역마다 다르게 동일한 이름의 변수들을 다르게 허용하기 때문에 이름의 중복을 허용합니다.
4. 코드의 가독성, 독립성
지역 변수는 해당 지역내에서만 사용하는 변수이기 때문에 가독성이 증가하게 될 것이고 블록 간 영향을 주지 못하기 때문에 블록 간의 독립성을 유지할 수 있게 됩니다.
Nested Function
위에와 같은 이유로 특정 지역만을 위한 변수 혹은 함수를 지역적으로 관리가 필요합니다.
스위프트에서는 함수 내부에서 지역적으로 또 다른 함수가 존재합니다. 이것을 중첩 함수(nested function)이라고 일컫습니다.
// outer function
func greetMessage() {
// inner function
func displayName() {
print("Good Morning Abraham!")
}
// calling inner function
displayName()
}
// calling outer function
greetMessage()
이 처럼 greetMessage 함수 내부에 displayName라는 중첩 함수이 존재할 수 있습니다.
함수 내부에서 중첩 함수를 정의할 수 있고 함수 호출이 가능합니다.
func chooseStepFunction(backward: Bool) -> (Int) -> Int {
func stepForward(input: Int) -> Int { return input + 1 }
func stepBackward(input: Int) -> Int { return input - 1 }
return backward ? stepBackward : stepForward
}
var currentValue = -4
let moveNearerToZero = chooseStepFunction(backward: currentValue > 0)
// moveNearerToZero now refers to the nested stepForward() function
while currentValue != 0 {
print("\(currentValue)... ")
currentValue = moveNearerToZero(currentValue)
}
print("zero!")
// -4...
// -3...
// -2...
// -1...
// zero!
또한 중첩 함수를 둘러싼 함수(enclosing function)의 반환값으로도 사용이 가능합니다.
chooseStepFunction() 함수를 보면 bool 형태의 값을 입력으로 받아 참이냐 거짓이냐에 따라 각각 다른 중첩함수를 반환합니다.
let moveNearerToZero = chooseStepFunction(backward: currentValue > 0)
이 코드는 둘러싼 함수에 bool 형태인 (current > 0)를 전달했습니다. 그렇게 된다면 moveNearerToZero에 반환된 함수가 인가되게 됩니다.
while currentValue != 0 {
print("\(currentValue)... ")
currentValue = moveNearerToZero(currentValue)
}
currentValue 값이 0 아니면 계속해서 밑에 코드를 반복합니다.
중첩 함수가 인가된 moveNearerToZero에 중첩함수의 인자 currentValue를 전달해 주고 다시 currentValue에 결과값을 인가해줍니다.
currentValue에는 -4가 인가가 되었고, currentValue > 0에 따라 4번 모두 거짓 -> 4번 stepForward를 호출
결국 currentValue가 0이 되면서 프로그램은 종료가 됩니다.
이렇게 중첩함수가 왜 필요한지 어떻게 사용하는지 알아 보았습니다.
reference
https://docs.swift.org/swift-book/documentation/the-swift-programming-language/functions
Documentation
docs.swift.org
https://www.programiz.com/swift-programming/nested-functions
Nested Functions in Swift (With Examples)
In Swift, a function can exist inside the body of another function. This is called a nested function. Before you learn about nested functions make sure to know about Swift functions. Syntax of Nested Function Here's how we create nested functions in swift.
www.programiz.com
'Swift🐤' 카테고리의 다른 글
Swift) 클래스 내부 메소드(method) 종류 (0) | 2023.10.10 |
---|---|
Swift) 열거형(enum) (1) | 2023.10.09 |
Swift) Property Observers(프로퍼티 옵져버) (0) | 2023.09.04 |
Swift) collection types(and tuple) (0) | 2023.09.04 |
Swift) ARC(Automatic Reference Counting) (0) | 2023.09.01 |