들어가기 전에
함수는 실행 블록({ })을 가지고 있습니다. 함수의 시작을 알리는 중괄호 시작 기호 ({)에서 함수가 실행되며 중괄호가 끝나는 지점(})에서 함수가 종료되면서 가지고 있는 지역 변수를 삭제합니다. 지역 변수란 블록 내에서만 사용하는 변수입니다. 이와 마찬가지로 블록 내에 또 다른 함수를 정의해 넣었을 때는 지역 함수가 됩니다. 이 지역 함수를 사용하려고 할 때는 항상 선언이 먼저 되어 있어야 합니다. 이 지역 함수도 마찬가지로 블록이 끝나면 같이 삭제됩니다. 이번 절에서는 이러한 함수와 변수의 범위에 대해 알아봅시다.
핵심 키워드
- 지역 변수 (local variable)
- 전역 변수 (global variable)
- 최상위 레벨 함수 (top-level function)
- 지역 함수 (local function)
학습하기
최상위 함수와 지역 함수
코틀린에서는 파일을 만들고 곧바로 main() 함수나 사용자가 직접 함수를 만들 수 있습니다. 이것을 최상위 레벨 함수(top-level function)라고 합니다. 함수에 또 다른 함수가 선언되어 있는 경우엔 지역 함수(local function)라고 합니다.
fun main() {
...
fun secondFunc(a: Int) {
...
}
userFunc(4)
secondFunc(2)
}
fun userFunc(counts: Int) {
...
}
최상위 및 지역 함수의 사용 범위
지역 함수들은 최상위 함수와 다르게 선언 순서에 따라 영향을 받습니다. 아직 선언되지 않은 함수를 사용하려고 하면 'unresolved reference' 오류를 냅니다. 컴파일러 입장에서 함수의 이름을 아직 모르는 것입니다. 반면에 최상위 함수는 메모리에 고정되어 있어 어느 함수 어떤 위치든 사용이 가능합니다.
지역 변수와 전역 변수
보통 우리가 사용할 수 있는 변수는 사용 범위에 따라 지역 변수(local variable), 전역 변수(global variable)로 나뉩니다. 특정 코드 블록 내에 사용할 때 우리는 지역 변수라고 하며 블록을 벗어나면 해당 변수는 프로그램 메모리에서 더 이상 사용되지 않고 삭제됩니다.
전역 변수는 최상위에 있는 변수로 프로그램이 실행되는 동안 삭제되지 않고 메모리에 유지됩니다. 값이 유지되므로 편리하지만 코드가 길어지면 여러 요소가 동시에 접근하는 경우에 잘못된 동작을 유발할 수 있습니다. 자주 사용되지 않는 전역 변수는 메모리 자원 낭비를 불러옵니다. 따라서 전역 변수를 너무 많이 사용하는 것은 좋지 않습니다.
참고자료
생각해보세요.
우리가 어떤 요소를 사용할 때는 사용 범위가 있습니다. 최상위, 전역, 지역이라는 말을 다시 한번 의미를 곰곰히 생각해보고 이러한 범위와 프로그램이 사용하는 메모리와는 무슨 관계가 있을지 댓글로 달아보세요!
comment
전역변수를 사용하면 메모리가 낭비될 수 있는 단점 뿐만 아니라 여러 함수에서 전역 변수의 값을 수정할 수 있기 때문에(var일 경우) 변수의 무결성이 깨질 수 있다. 예제 프로그램처럼 간단한 프로그램에서는 전역변수 사용으로 인한 논리적 오류를 쉽게 발견할 수 있지만 큰 프로그램에서 의도치 않게 전역 변수의 값을 수정하게 된다면 무결성이 깨지면서 논리적 오류를 찾기 어려울 수 있다. 그렇기에 전역변수 사용을 지양하는 것이 좋다.
전역변수는 메모리에 저장돼 해당 패키지 내 어디서든 접근이 가능하다. 하지만 사용빈도 수가 높지 않다면 메모리가 계속 할당 되어 있으므로 지역변수로 선언하는 것이 좋다.
지역변수는 해당 함수 종료 시 메모리에서 삭제된다. 만약 이 변수를 사용하는 함수가 많다면 매번 함수마다 선언 할 필요 없이 전역변수로 선언하는 것이 좋다.
최상위에 계속 많이 만들어 놓으면 메모리가 가득차게되서 다른작업을 하지 못한다...?
최상위 함수와 전역 변수는 특정 패키지 내에서 어디서든 접근이 가능하다. 이들은 프로그램이 실행되는 동안 삭제되지 않고 메모리에 유지되므로 자주 사용되지 않을 시 메모리 자원을 낭비한다.
반면 지역 변수는 특정 코드 블록 내에서만 사용이 가능하며, 스택 메모리를 사용한다. 다만 해당 변수를 다른 곳에서 사용하거나 빈도 수가 높다면 전역 변수로 하는 것이 효과적일 수 있다.
지역 범위에 존재하는 지역 변수, 지역 함수는 스택 메모리에 임시로 쌓이고 전역 범위에서 사용할 수 없습니다. 최상위, 전역 범위에 존재하는 전역 변수, 최상위 함수는 프로그램이 실행되는 동안 메모리에 계속 쌓여 있고 전역 범위에서 사용할 수 있습니다. 따라서 사용 빈도가 적은 전역 변수와 최상위 함수는 메모리 자원을 낭비할 수 있으므로, 지역 변수와 지역 함수로 사용할 필요가 있습니다.