코틀린 전역 변수, 지역 변수 (Global Variables, Local Variables)
전역 변수와 지역 변수를 알아봅시다.
바로 예문을 통해 이해해 봅시다.
var finalReward: Int = 1000
fun main(args: Array<String>){
val round = Round("나도전")
println(round.firstRound())
println(round.secondRound())
println(round.name)
println(finalReward)
}
class Round(var name: String){
fun firstRound():Int{
var firstReward = 0
name = "나도전"
firstReward = 500
finalReward = 1000
fun miniRound(): Int{
var roundBonus: Int = 0
roundBonus = 200
firstReward = 500
finalReward = 1000
return roundBonus
}
return finalReward + firstReward + miniRound()
}
fun secondRound(): Int{
var secondReward: Int = 0
name = "나도전"
secondReward = 800
finalReward = 1000
return finalReward + secondReward
}
}
위의 예문에서 가정을 합니다. 테스트에 참가하는 도전자들이 최종 상금을 획득하고, 첫 라운드에는 미니 라운드가 있다고 가정해 봅니다.
메인 함수 밖에 선언된 finalReward는 전역 변수입니다. 따라서 메인 함수를 포함한, 기타 다른 클래스에서 모두 해당 변수를 참조할 수 있습니다.
name을 받는 Round 클래스는 firstRound, secondRound 함수를 가지고 있습니다. firstRound 함수 내에는 또 miniRound 함수가 존재합니다.
출력값은 다음과 같습니다.
1700
1800
나도전
1000
finalReward는 전역 변수로 첫 번째, 두 번째 라운드에서 참조가 가능한 값입니다.
하지만 firstReward, secondReward는 각 라운드에서만 쓰이는 상금입니다. 메인 함수에서 참조할 수 없습니다.
firstRound 내의 miniRound에서 주는 roundBonus는 미니 라운드에서 주는 상금이므로, 첫 번째 라운드와 두 번째 라운드, 메인 함수에서는 참조가 불가능합니다.
이를 통해 알 수 있듯이, 전역 변수는 모든 함수에서 참조 가능한 변수입니다. 지역 변수는 해당 함수 내에서만 유효하며, 다른 외부 함수에서는 참조하지 못하는 변수입니다.
미니 라운드에서 firstReward, finalReward를 모두 참조 가능한 이유는 미니 라운드 함수 입장에서 두 변수 모두 전역 변수이기 때문입니다.
하지만 firstRound 입장에서 roundBonus는 지역 변수이므로 참조하지 못합니다. 한 클래스에 변수명이 동일하고, 전역 변수와 지역 변수로 동시에 존재할 경우, 메인 함수에서 해당 변수를 불러올 때는 지역 변수가 불러옵니다.
변수를 선언 시 항상 접근 범위를 지역 변수 -> 전역 변수 순으로 범위를 작게 만드는 것이 좋습니다. 범위를 처음부터 전역 변수처럼 만들어 놓으면, 쓰이지 않아야 할 곳에서도 변수 접근이 가능해지므로 보안상 좋지 않습니다.