Scope
- 코드의 범위
- 선언된 위치에 따라서 결정
- scope에는 전역 범위(Global Scope)와 지역 범위(Local Scope)가 있다.
- 전역 범위와 지역 범위를 나누는 기준은 { } - Brace를 기준으로 나눈다.
- { } 밖에 있다면 전역 범위
- { } 안에 있다면 지역 범위
1. var sum = 0
2. for i in 0...10 {
3. sum += i
4. }
위 코드에서 1번 위치가 전역 범위(Global Scope)이고 2~4번 위치가 지역 범위(Local Scope)이다.
Scope의 5가지 규칙
- 동일한 스코드에 있는 변수와 상수에 접근 가능하다.
- 동일한 스코프에서는 이전에 선언되어 있는 변수와 상수에 접근 가능하다.
- 로컬 스코프에서는 자신의 상위 스코프에 선언된 변수와 상수에 접근 가능하나 자신의 상위 스코프에 선언되지 않는 경우 접근 불가능하다.
- 상위 스코프에서는 하위 스코프에 접근할 수 없다.
- 서로 다른 스코프에 동일한 이름을 가진 변수와 상수가 존재한다면 가장 인접한 스코프에 있는 변수와 상수를 사용한다.
규칙 1
- 동일한 스코프에 있는 변수와 상수에 접근 가능하다.
1. var sum = 0
2. for i in 0...10 {
3. sum += i
4. }
5. var sum1 = 1
6. print(sum) // 접근 가능
7. print(sum1) // 접근 가능
위 코드에서 sum과 sum1은 같은 전역 범위이므로 접근 가능하다.
규칙 2
- 동일한 스코프에서는 이전에 선언되어있는 변수와 상수만 접근 가능하다.
1. var sum = 0
2. print(sum1) // 6번 라인에 선언되어있음 error!!
3. for i in 0...10 {
4. sum += i
5. }
6. var sum1 = 1
7. print(sum) // 접근 가능
위 코드에서 7번 라인의 sum은 접근 가능하지만 2번 라인의 sum1은 접근하기 전에 선언되어 있지 않기 때문에 접근할 수 없다.
규칙 3
- 로컬 스코프에서는 자신의 상위 스코프에 선언된 변수와 상수에 접근 가능하나 자신의 상위 스코프에 선언되지 않는 경우 접근 불가능하다.
1. var sum = 0
2. //var op = 3 // 주석처리되어 선언되어있는 상태가 아님
3. for i in 0...10 {
4. sum += i
5. print(sum1)
6. print(op) // error!!
7. }
8. var sum1 = 1
위 코드에서 4 ~ 6번 라인 위치에서 sum, sum1은 접근 가능하지만 op는 주석처리(선언되어있지 않음)되어 있기 때문에 접근 불가능하다.
하지만 주석 처리되어있지 않고 정상적으로 선언되어 있다면 4 ~ 6번 라인 위치에서 접근 가능하다.
규칙 4
- 상위 스코프에서는 하위 스코프에 접근할 수 없다.
1. var x = 0
2.
3. if x == 0 {
4. var y = 10
5. }
6. print(y) // error!!
위 코드에서 하위 스코프인 3 ~ 5번 라인 위치에서 선언된 y는 6번 라인에서 접근할 수 없다.
규칙 5
- 서로 다른 스코프에 동일한 이름을 가진 변수와 상수가 존재한다면 가장 인접한 스코프에 있는 변수와 상수를 사용한다.
1. var x = 0
2. var y = 1
3. var z = 2
4.
5. if x == 0 {
6. var y = 4
7. if z == 2 {
8. print(y) // 4 출력
9. }
10.}
위 코드에서 8번 라인의 출력값을 보면 4로 출력된다. 왜냐하면 바로 위의 상위 스코프에 있는 y의 값 4를 사용하기 때문이다.
'Swift > Swift문법' 카테고리의 다른 글
| Swift문법 - Type Inference and Type Annotation (0) | 2022.10.09 |
|---|---|
| Swift문법 - Data Types (0) | 2022.10.02 |
| Swift문법 - Naming Convention (0) | 2022.09.11 |
| Swift문법 - Variables and Constants (0) | 2022.09.11 |
| Swift문법 - First Class Citizen (0) | 2022.09.05 |