프로그래밍에서 변수와 상수는 정의된 위치에 따라 사용할 수 있고, 생존할 수 있는 일정 영역을 부여받는다. 이를 변수의 생존 범위, 또는 스코프(Scope)라고 한다.
영역을 기준으로 변수를 구분해 보면 크게 전역변수와 지역변수로 나눌 수 있다. 전역변수는 글로벌(Global) 변수라고도 하는데, 프로그램의 최상위 레벨에서 작성된 변수를 의미한다. 이 변수는 프로그램 내 모든 위치에서 참조가 가능하며, 특별한 일이 없으면 프로그램이 종료되기 전까지는 삭제되지 않는다.
반면, 로컬(Local) 변수라고도 불리는 지역변수의 경우 특정 범위 내에서만 참조하고 사용할 수 있는 변수를 뜻한다. 조건문이나 함수 구문 등 특정 실행 블록 내부에서 선언된 변수는 모두 지역변수이며 선언된 블록 범위 안에서만 이 변수를 참조할 수 있다. 지역변수는 선언된 블록에서 실행되면서 생겨났다가 실행블록이 끝나면 제거된다. 이를 변수의 생명주기(Life Cycle)라고 한다.
do {
do {
var ccnt = 3
ccnt += 1
print(ccnt) // 결과값 : 4
}
ccnt += 1
print(ccnt) // 오류발생
}
do 블록은 단순히 실행 블록을 구분하는 역할을한다. 이 예제를 살펴보면 두 번째 do 블록에서 변수 ccnt가 선언되고 연산이 이루어져 값을 출력하는 것을 확인할 수 있다. 여기서 주의할 점은 변수 ccnt는 지역변수이기 때문에 두 번째 do블록에서 생성되었으므로 이 블록을 나가게되면 사라지게된다. 그러므로 첫 번째 do 블록에선 오류가 발생하게 되는 것이다.
do {
var ccnt = 0
do {
ccnt = 3
print(ccnt) // 값 : 3
}
ccnt += 1
print(ccnt) // 값 : 4
}
위 예제는 오류없이 실행이 가능하다. 왜냐하면 변수 ccnt가 더 넓은 범위의 블록 즉 첫 번째 do 블록에서 선언되었기 때문에 두 번째 do 블록에서도 사라지지 않고 사용이 가능하기 때문이다.
이 때 또 주의할점이 하나 있는데 바로 변수 선언 뒤에 초기화 과정을 생략하면 안 된다는 것이다. 변수가 생성된 블록이 아닌 다른 블록에서(두 번째 do블록)에서 사용하려면 반드시 초기화가 필요하기 때문이다. 선언된 블록보다 하위 블록에서 변수를 사용하는 것이 단순히 하나의 코드 내에서 변수를 사용하는 것으로 보일 수도 있으나, 자세히 살펴보면 하나의 블록에서 다른 블록으로 참조에 의한 전달 과정이 일어나는 것이다. 이를 위해 변수의 주소값이 필요한데 만약 변수가 초기화되어 있지 않으면 메모리를 할당받지 못해 주소값이 존재하지 않아 오류가 발생하게된다.
함수는 실행 블록을 가지고있는 객체이기 때문에 do 구문에서 설명한 변수의 범위가 그대로 적용된다. 함수 내에서 선언한 변수는 함수의 실행 블록 안에서만 존재하므로 이 변수에 직접 접근할 수 있는 조건 또한 함수의 실행 블록 내로 제한된다.
전역변수는 이와 반대이다. 전역변수는 최상위 블록에서 선언된 변수이므로 그보다 하위 블록인 함수 내부에서도 얼마든지 접근이 가능하다. 다음 예제는 전역 변수로 선언된 값을 함수 내부에서 접근하는 예이다.
var count = 30
func foo() -> Int {
count += 1
return count
}
foo() // 31
보시는 것과 같이 전역변수 count는 foo 함수 내에서도 참조가 잘 이루어지는 것을 볼 수 있다.
이번엔 전역변수와 지역변수가 겹칠 때엔 어떤 현상이 일어나는지 알아보자.
var count = 30
func foo(count: Int) -> Int {
var count = count
count += 1
return count
}
print(foo(count: count)) // 함수 내부 count 값 : 31
print(count) // 함수 외부 count 값 : 30
이 예제를 보면 알 수 있듯 스위프트에서 함수의 외부와 내부에 각각 같은 이름의 변수가 존재하면 내부에서 선언된 변수는 외부와 상관없이 새롭게 생성된다. 만약 그렇지 않았다면 외부 변수의 값도 같이 31로 변경되었을 것이다. 내부 영역에 정의된 count 변수는 지역변수(Local Variable)로서, 외부에서 정의된 전역변수 count와는 엄연히 다른 객체이다.
또한, 외부와 내부에서 같은 이름의 변수가 선언되면 변수 사용의 우선순위에 따라 외부변수가 아닌 내부변수를 사용하게 된다. 이는 블록내에서 적용되는 변수 우선순위의 규칙과 관련된다. 그 우선순위는 다음과 같다.
1순위 함수 내부에서 정의된 변수
2순위 함수 외부에서 정의된 변수
3순위 전역변수
출처 : 꼼꼼한 재은씨의 Swift 문법편
'Swift > 문법' 카테고리의 다른 글
스위프트(Swift) - 함수(Function) Ⅶ. 함수의 중첩 (0) | 2022.05.23 |
---|---|
스위프트(Swift) - 함수(Function) Ⅵ. 일급 함수의 특성 (0) | 2022.05.19 |
스위프트(Swift) - 함수(Function) Ⅳ. InOut 매개변수 (0) | 2022.05.17 |
스위프트(Swift) - 함수(Function) Ⅲ. 가변인자, 기본값, 수정 (0) | 2022.05.16 |
스위프트(Swift) - 함수(Function) Ⅱ. 내부 매개변수, 외부 매개변수 (0) | 2022.05.13 |