중첩 코드 블록과 범위

이번 수업에서 다루는 내용은 앞선 강의에서 이미 언급했지만, 메모리 저장 방식을 통해 다시 한번 개념을 탄탄히 다져보겠습니다.

본 튜토리얼은 foxdevelop.com에서 제공됩니다. 재게시할 때 출처를 명시해 주세요.

메서드 본문 안에 다른 코드 블록을 중첩할 수 있습니다.

class Program
{
    static void Main()
    {
        int age = 19;
        {
            int one = 23;
        }
    }
}
Code language: C# (cs)

코드 블록 개수에는 제한이 없으며 순서대로 배치하거나 여러 단계로 중첩할 수 있고 계층 깊이 제약도 없습니다.

class Program
{
    static void Main()
    {
        int age = 19;
        {
            int one = 23;
            {
                int two = 45;
                {
                    int three = 56;
                }
            }
        }
    }
}Code language: C# (cs)

주의할 점은 하위 중첩 블록 위에 적힌 int xxxx = xxx; 구문은 해당 블록과 병렬 문장이라는 것입니다.

예를 들어 int age = 19;와 아래 중첩 코드 블록은 병렬한 두 문장이므로 전체를 메서드 본문으로 착각하지 마십시오.


생명 주기

예시를 살펴보겠습니다

    static void Main()
    {
        int a = 10;
        {
            int b = 20;
        }
    }Code language: C# (cs)

이 예시에는 지역 변수가 두 개 존재합니다. 바깥쪽 변수 a는 Main 함수의 외부 범위에 속하고, b는 하위 중첩 코드 블록 내에 선언됩니다.

단계별 실행 과정을 따라가며 스택 메모리에 데이터가 저장되는 방식을 관찰해 보겠습니다.

1단계: int a = 10;만 실행됩니다. 스택에 a 공간이 할당되고 값은 10으로 설정됩니다.

2단계: 내부 블록으로 진입해 int b = 20;을 실행합니다. 스택에 b가 추가되며 스택 순서는 위부터 b, a가 됩니다.

3단계: 내부 코드 블록 실행이 마무리되면 b가 스택에서 제거되고 스택에는 a만 남습니다.

4단계: Main 메서드 실행이 완료되면 a가 스택에서 제거되고 프로그램의 모든 변수가 소멸되며 실행이 종료됩니다.

정리

중첩 블록 안에서 선언한 변수는 선언 지점부터 소속된 코드 블록이 끝날 때까지 유효합니다.

중첩 블록 실행이 완료되면 블록 내 모든 지역 변수는 스택에서 꺼내져 소멸합니다.

메서드 본문 자체도 하나의 큰 코드 블록이라고 생각할 수 있습니다.


범위(스코프)

최초 선언된 변수의 범위가 유지되는 동안 아무리 깊게 중첩해도 동일한 이름의 지역 변수를 다시 선언할 수 없습니다.

예시를 보겠습니다

    static void Main()
    {
        int a = 10;
        {
            int a = 20;
        }
    }Code language: C# (cs)

위 예시에서 하위 중첩 블록 안 변수 a가 바깥 변수 a와 이름이 같아 오류가 발생하고 컴파일 자체가 진행되지 않습니다.

원인은 다음과 같습니다. int a = 10;의 범위는 자신을 감싼 중괄호 내 전체입니다. 이 범위 안에는 동명 변수를 선언할 수 없습니다. int a = 20;이 중첩 블록 안에 있더라도 외부 변수 a의 범위 안에 포함되므로 이름 중복으로 인식됩니다. 컴파일러가 중복 선언을 감지하고 붉은 물결 오류로 표시합니다.

두 번째 변수 a의 자료형을 바꿔도 허용되지 않습니다.

같은 범위 안 변수 이름은 유일해야 하며 변수의 타입은 상관없습니다.

그림처럼 바깥 변수 a의 범위는 노란색 영역이고 안쪽 변수 a의 범위는 녹색 영역입니다. 바깥 범위가 안쪽 영역을 완전히 포함하므로 충돌이 발생합니다.

해결 방법은 안쪽 변수 a의 이름을 다른 것으로 변경하는 것입니다.

다른 예시를 살펴보겠습니다

이렇게 작성하면 이름 충돌이 일어날까요?

class Program
{
    static void Main()
    {
        int a = 10;

        {
            double b = 20;
        }

        {
            double b = 30;
        }

    }
}Code language: C# (cs)

정답은 충돌하지 않는다입니다. 변수 b가 두 개 있지만 각자의 범위가 겹치지 않기 때문에 오류가 발생하지 않습니다. 위쪽 b는 자신의 코드 블록에만 해당하고 아래쪽 b도 자기 블록에 국한되므로 충돌이 없어 컴파일이 정상 진행됩니다. 그림을 참고하십시오.

그림에는 두 변수 b의 범위를 색으로 구분해 표시했습니다. 이제 독자 여러분도 이해했을 것입니다.

중첩 코드 블록과 범위

Previous:

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다