You are currently viewing [Swift] 블록(Block)과 스코프(Scope)
swift

[Swift] 블록(Block)과 스코프(Scope)

중괄호가 만드는 세상: 블록과 스코프

프로그램을 작성하다 보면, 필연적으로 중괄호({ })를 사용하게 됩니다. 이 중괄호 한 쌍이 만들어지면, 두 가지가 함께 생성됩니다: 바로 코드 블록(block)스코프(scope)입니다.

  • 블록(Block): 중괄호 { } 사이에 있는 코드 덩어리 자체를 의미합니다.
  • 스코프(Scope): 그 블록 안에서 선언된 변수나 상수가 살아 숨 쉬고 접근할 수 있는 유효 범위 또는 영역을 의미합니다.

스코프의 규칙: 안에서는 밖을 볼 수 있지만, 밖에서는 안을 볼 수 없다

스코프의 가장 중요한 규칙은 마치 **’단방향 유리창’**과 같습니다. 안쪽 스코프에서는 바깥쪽 스코프에 있는 것을 볼 수 있지만, 바깥쪽에서는 안쪽 스코프에 있는 것을 볼 수 없습니다.

1. 안쪽 스코프는 바깥쪽 스코프의 변수에 접근할 수 있습니다.

아래 코드에서 중괄호 바깥 영역을 전역 스코프(Global Scope)라고 합니다.

Swift
// 🌎 전역 스코프 (Global Scope)
var name = "Paul"

if true { // 🏠 내부 스코프 시작
    // 전역 스코프의 'name'에 접근하고 변경할 수 있습니다.
    print(name) // "Paul" 출력
    name = "Chris"
} // 🏠 내부 스코프 끝

print(name) // 변경된 값인 "Chris"가 출력됩니다.

2. 바깥쪽 스코프는 안쪽 스코프의 변수에 접근할 수 없습니다.

age 변수는 중괄호 안, 즉 내부 스코프에서 선언되었습니다. 따라서 중괄호가 끝나는 순간 age 변수의 생명도 다하며, 밖에서는 더 이상 존재하지 않는 변수가 됩니다.

Swift
// 🌎 전역 스코프

if true { // 🏠 내부 스코프 시작
    // 'age'는 이 중괄호 안에서만 유효합니다.
    var age = 2
    print(age) // 2 출력
} // 🏠 내부 스코프 끝

// print(age) // 🚨 오류 발생! 'age'를 찾을 수 없습니다. (Cannot find 'age' in scope)

이 규칙은 스코프가 여러 겹으로 중첩되어도 동일하게 적용됩니다.

Swift
// 🌎 전역 스코프
var level = 1

if true { // 🏠 스코프 A 시작
    var score = 100
    
    if true { // 🚪 스코프 B 시작 (A의 내부 스코프)
        // 스코프 A의 'score'와 전역 스코프의 'level'에 모두 접근 가능합니다.
        print(score) // 100 출력
        level = 2
    } // 🚪 스코프 B 끝
} // 🏠 스코프 A 끝

참고: 여기서 사용된 if true는 단순히 중괄호를 만들어 스코프를 설명하기 위한 예시일 뿐입니다. 앞으로 배우게 될 함수(functions), 클래스(classes), 구조체(structs) 등 다양한 상황에서 중괄호와 스코프가 생성됩니다.


코드의 지도: 들여쓰기 (Indentation)

제가 작성하는 코드에서 들여쓰기(indentation)를 사용하는 것을 보셨을 겁니다. 들여쓰기는 코드가 어떤 스코프에 속해 있는지를 시각적으로 명확하게 보여주는 매우 중요한 관례(convention)입니다.

어떤 코드가 중괄호 안, 즉 특정 스코프 내부에 위치하면, 그 코드를 오른쪽으로 밀어서 작성합니다. 들여쓰기 간격은 개발자마다 선호도가 다르지만(예: 스페이스 2칸), 이 강의에서는 Swift에서 가장 널리 사용되는 4칸(스페이스 4번)을 사용하겠습니다.

Swift
// 들여쓰기 없음 (전역 스코프)
var globalVar = "Global"

if true {
    // 4칸 들여쓰기 (첫 번째 레벨 스코프)
    var levelOneVar = "Level 1"
    
    if true {
        // 8칸 들여쓰기 (두 번째 레벨 스코프)
        var levelTwoVar = "Level 2"
        print(globalVar)     // 접근 가능
        print(levelOneVar)   // 접근 가능
    }
    
    // print(levelTwoVar) // 🚨 오류! 밖에서는 안을 볼 수 없음
}

특히 여러 View를 중첩해서 만드는 SwiftUI에서는 들여쓰기를 제대로 지키지 않으면 코드가 순식간에 엉망이 되어 알아보기 힘들어집니다. 지금부터 코드를 작성할 때 항상 올바른 들여쓰기를 하는 습관을 들이는 것이 매우 중요합니다.