연습 - 코드 블록 및 변수 범위
- 11분
코드 블록은 실행 경로를 정의하는 하나 이상의 C# 문입니다. 코드 블록 외부의 문은 런타임에서 코드 블록이 실행되는 시기, 여부, 빈도에 영향을 미칩니다. 코드 블록의 경계는 일반적으로 물결선 중괄호({})로 정의됩니다.
코드 블록은 실행 경로에 미치는 영향 외에도 변수의 범위에 영향을 줄 수 있습니다. 이 연습 중에 검사하는 코드 샘플은 코드 블록과 변수 범위 간의 관계를 이해하는 데 도움이 됩니다.
코드 블록은 변수 선언의 범위에 영향을 미칩니다.
변수 범위는 애플리케이션의 다른 코드에 대한 변수의 가시성을 나타냅니다. 로컬로 범위가 지정된 변수는 해당 변수가 정의된 코드 블록 내에서만 액세스할 수 있습니다. 코드 블록 외부에서 변수에 액세스하려고 시도하면 컴파일러 오류가 발생합니다.
이 단원의 나머지 부분에서는 코드 블록과 변수 범위 간의 관계를 살펴봅니다.
코딩 환경 준비
이 모듈에는 데모 코드를 빌드하고 실행하는 프로세스를 안내하는 실습 활동이 포함되어 있습니다. Visual Studio Code를 개발 환경으로 사용하여 이러한 활동을 완료하는 것이 좋습니다. 이러한 활동에 Visual Studio Code를 사용하면 전 세계 전문가가 사용하는 개발자 환경에서 코드를 더 편안하게 작성하고 실행하는 데 도움이 됩니다.
Visual Studio Code를 엽니다.
Windows 시작 메뉴(또는 다른 OS의 해당 리소스)를 사용하여 Visual Studio Code를 열 수 있습니다.
Visual Studio Code의 파일 메뉴에서 폴더 열기를 선택합니다.
폴더 열기 대화 상자에서 Windows 바탕 화면 폴더로 이동합니다.
코드 프로젝트를 유지하는 다른 폴더 위치가 있는 경우 해당 폴더 위치를 대신 사용할 수 있습니다. 이 학습에서는 쉽게 기억하고 찾을 수 있는 위치를 사용하는 것이 중요합니다.
폴더 열기 대화 상자에서 폴더 선택을 선택합니다.
작성자를 신뢰하는지 묻는 보안 대화 상자가 표시되면 예를 선택합니다.
Visual Studio Code 터미널 메뉴에서 새 터미널을 선택합니다.
터미널 패널의 명령 프롬프트에 현재 폴더의 폴더 경로가 표시됩니다. 예를 들면 다음과 같습니다.
C:\Users\someuser\Desktop>참고
샌드박스 또는 호스트된 환경이 아닌 자체 PC에서 작업하고 이 C# 시리즈에서 다른 Microsoft Learn 모듈을 완료한 경우 이미 코드 샘플용 프로젝트 폴더를 만들었을 수 있습니다. 이 경우 TestProject 폴더에 콘솔 앱을 만드는 데 사용되는 다음 단계를 건너뛸 수 있습니다.
터미널 명령 프롬프트에서 지정된 폴더에 새 콘솔 애플리케이션을 만들려면 다음 프롬프트를 입력합니다.
dotnet new console -o ./CsharpProjects/TestProject이 .NET CLI 명령은 .NET 프로그램 템플릿을 사용하여 지정된 폴더 위치에 새 C# 콘솔 애플리케이션 프로젝트를 만듭니다. 이 명령은 CsharpProjects 및 TestProject 폴더를 만들고
.csproj파일의 이름으로 TestProject를 사용합니다.파일이 이미 있다는 메시지가 표시되면 다음 단계를 계속 진행합니다. 기존 프로젝트 파일을 다시 사용합니다.
탐색기 보기에서 CsharpProjects 폴더를 확장합니다 .
TestProject 폴더와 두 개의 파일, 즉 Program.cs C# 프로그램 파일과 TestProject.csproj라는 C# 프로젝트 파일이 표시됩니다.
Visual Studio Code의 파일 메뉴에서 폴더 열기를 선택합니다.
폴더 열기 대화 상자에서 CsharpProjects 폴더를 선택한 다음 폴더 선택을 선택합니다.
탐색기 보기에서 TestProject 폴더를 확장한 다음 , Program.cs 선택합니다.
기존 코드 줄을 삭제합니다.
이 모듈 중에 이 C# 콘솔 프로젝트를 사용하여 코드 샘플을 만들고, 빌드하고, 실행합니다.
터미널 패널을 닫습니다.
코드 블록 내에서 변수 만들기
먼저 코드 블록 내에서 변수가 초기화되는 경우를 살펴보겠습니다.
Visual Studio Code가 열려 있고 편집기 패널에 Program.cs가 표시되는지 확인합니다.
참고
Program.cs는 비어 있어야 합니다. 그렇지 않은 경우 모든 코드 줄을 선택하고 삭제합니다.
Visual Studio Code 편집기에 다음 코드를 입력합니다.
bool flag = true; if (flag) { int value = 10; Console.WriteLine($"Inside the code block: {value}"); }Visual Studio Code 파일 메뉴에서 저장을 선택합니다.
코드를 빌드하거나 실행하기 전에 Program.cs 파일을 저장해야 합니다.
탐색기 패널에서 TestProject 폴더 위치에서 터미널을 열려면 TestProject를 마우스 오른쪽 단추로 클릭한 다음 통합 터미널에서 열기를 선택합니다.
터미널 패널이 열립니다. 터미널에는 터미널이 TestProject 폴더 위치에 열려 있음을 보여 주는 명령 프롬프트가 포함되어야 합니다.
터미널 명령 프롬프트에서 코드를 실행하려면 dotnet run을 입력한 다음, Enter 키를 누릅니다.
참고
“실행할 프로젝트를 찾을 수 없습니다.”라는 메시지가 표시되면 터미널 명령 프롬프트에 예상 TestProject 폴더 위치가 표시되는지 확인합니다. 예:
C:\Users\someuser\Desktop\csharpprojects\TestProject>다음 출력이 표시됩니다.
Inside the code block: 10
이것은 예상되는 출력입니다. 그러나 if 문 코드 블록 외부에 있는 value 변수에 액세스하려면 어떻게 해야 할까요?
변수가 선언된 코드 블록 외부에서 변수에 액세스 시도
Visual Studio Code 편집기에서
if문 코드 블록 아래에 새 코드 줄을 만듭니다.작성한 빈 코드 줄에 다음 코드 줄을 추가합니다.
Console.WriteLine($"Outside the code block: {value}");업데이트된 코드가 다음과 같은지 확인합니다.
bool flag = true; if (flag) { int value = 10; Console.WriteLine($"Inside the code block: {value}"); } Console.WriteLine($"Outside the code block: {value}");코드 파일을 저장한 다음 Visual Studio Code를 사용하여 코드를 실행합니다.
터미널 명령 프롬프트에서
dotnet run을 입력하여 코드를 실행합니다.애플리케이션을 실행하려고 하면 컴파일 오류가 발생합니다.
Program.cs(7,46): error CS0103: The name 'value' does not exist in the current context
메시지의 Program.cs(7,46) 부분은 오류가 Program.cs 파일의 7번째 줄, 46열과 관련되어 있음을 알려 줍니다.
이 오류는 코드 블록 내부에 선언된 변수는 해당 코드 블록 내에서만 액세스(볼 수 있음) 가능하기 때문에 발생합니다. 변수는 선언된 코드 블록 외부에서 액세스할 수 없으므로 코드의 7번째 줄에서는 value에 액세스할 수 없습니다.
메서드 코드 블록에 선언된 변수를 지역 변수라고 합니다. 변수 범위를 토론하는 문서를 검토할 때 지역 변수라는 용어가 사용되는 것을 볼 수 있습니다.
코드 블록 위로 변수 선언 이동
코드 블록 내부와 외부 모두에서 변수에 액세스하려면 코드 블록 외부의 코드에서 변수를 "볼" 수 있도록 코드 블록 앞에 변수를 선언해야 합니다.
다음과 같이 Visual Studio Code 편집기에서 코드를 업데이트합니다.
bool flag = true; int value; if (flag) { Console.WriteLine($"Inside the code block: {value}"); } value = 10; Console.WriteLine($"Outside the code block: {value}");업데이트를 검토해 보세요.
이제
value가if코드 블록 외부에서 선언되지만 초기화되지 않는다는 점에 유의해야 합니다.Visual Studio Code를 사용하여 업데이트를 저장한 다음 코드를 실행합니다.
여전히 컴파일 오류가 발생합니다.
이번에는 애플리케이션을 실행하려고 시도할 때 다음과 같은 컴파일 오류가 발생합니다.
Program.cs(6,49): error CS0165: Use of unassigned local variable 'value'이 오류는 코드 블록 내부의 6번째 줄과 관련이 있는데,
value가 초기화되지 않기 때문입니다(값이 할당되지 않음).value = 10;코드 줄이if문 코드 블록 위에 있으면 애플리케이션이 올바르게 컴파일되고 모든 것이 잘 될 것입니다. 그러나value가 초기화되지 않았기 때문에 코드 블록 내부에서 액세스할 수 없습니다.변수에 액세스하기 전에 변수가 초기화되도록 하면 이 문제가 해결됩니다.
변수 선언의 일부로 변수 초기화
변수 선언의 일부로
value를 초기화하려면 다음과 같이 코드를 업데이트합니다.bool flag = true; int value = 0; if (flag) { Console.WriteLine($"Inside the code block: {value}"); } value = 10; Console.WriteLine($"Outside the code block: {value}");이 코드는 변수 선언의 일부로
value를 초기화하여 "할당되지 않은 지역 변수" 컴파일 오류를 해결합니다.Visual Studio Code를 사용하여 코드를 저장하고 실행합니다.
이제 애플리케이션을 실행할 때 다음과 같은 출력이 표시됩니다.
Inside the code block: 0 Outside the code block: 10
컴파일러의 코드 해석 방식 검사
런타임 오류를 방지할 수 있도록 C# 컴파일러는 Visual Studio Code 편집기와 빌드 프로세스 중에 코드를 분석합니다. 하지만 컴파일러가 항상 사용자의 코드를 사용자와 같은 방식으로 해석하지 않을 수도 있습니다.
동일한 용도로 사용되는 것 같은 다음 두 코드 샘플을 고려합니다.
// Code sample 1
bool flag = true;
int value;
if (flag)
{
value = 10;
Console.WriteLine($"Inside the code block: {value}");
}
Console.WriteLine($"Outside the code block: {value}");
// Code sample 2
int value;
if (true)
{
value = 10;
Console.WriteLine($"Inside the code block: {value}");
}
Console.WriteLine($"Outside the code block: {value}");
두 샘플은 항상 같은 결과를 생성해야 한다고 생각할 수도 있지만, C# 컴파일러는 두 코드 샘플을 다르게 해석합니다.
첫 번째 코드 샘플의 경우 컴파일러는 flag를 true 또는 false 값이 할당될 수 있는 부울 변수로 해석합니다. 컴파일러는 flag가 false인 경우 두 번째 Console.WriteLine()이 실행될 때 value가 초기화되지 않는다고 결론을 내립니다. 기본적으로 컴파일러는 다음 두 가지 코드 실행 경로가 가능하다고 간주합니다.
// path when flag = true
int value;
value = 10;
Console.WriteLine($"Inside the code block: {value}");
Console.WriteLine($"Outside the code block: {value}");
그리고
// path when flag = false
int value;
Console.WriteLine($"Outside the code block: {value}");
컴파일러는 두 번째 경로(코드 샘플 1)가 가능하다고 간주하므로 빌드 프로세스 중에 오류 메시지를 생성합니다. 또한, Visual Studio Code의 코드 편집기는 value(코드 블록 아래) 아래에 빨간색 물결선을 표시하여 이 문제에 대해 경고합니다.
두 번째 코드 샘플의 경우 컴파일러는 if 문 코드 블록의 콘텐츠가 항상 실행될 것이라고 결론을 내립니다(true는 항상 true임). 컴파일러는 두 번째 코드 샘플을 다음과 같이 단일 실행 경로로 해석하기 때문에 빌드 오류를 생성하지 않습니다.
int value;
value = 10;
Console.WriteLine($"Inside the code block: {value}");
Console.WriteLine($"Outside the code block: {value}");
요약
코드 블록에 대해 기억해야 하는 몇 가지 중요한 사항은 다음과 같습니다.
- 코드 블록 내부에 변수를 선언하면 해당 코드 블록 내에서만 변수의 표시 여부가 적용되고 코드 블록 외부에서는 변수에 액세스할 수 없습니다.
- 변수가 코드 블록 내부와 외부 모두에서 표시되도록 하려면 코드 블록 앞(코드 블록 외부와 위)에서 변수를 선언해야 합니다.
- 모든 잠재적인 코드 실행 경로에서 코드가 변수에 액세스하기 전에 변수가 초기화되어야 합니다.