티스토리 뷰

반응형

전역 변수와 지역 변수를 알아봅시다.

 

바로 예문을 통해 이해해 봅시다.

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는 지역 변수이므로 참조하지 못합니다. 한 클래스에 변수명이 동일하고, 전역 변수와 지역 변수로 동시에 존재할 경우, 메인 함수에서 해당 변수를 불러올 때는 지역 변수가 불러옵니다.

 

변수를 선언 시 항상 접근 범위를 지역 변수 -> 전역 변수 순으로 범위를 작게 만드는 것이 좋습니다. 범위를 처음부터 전역 변수처럼 만들어 놓으면, 쓰이지 않아야 할 곳에서도 변수 접근이 가능해지므로 보안상 좋지 않습니다.

반응형
댓글