문(Statement)과 블록(Block)
목차
문(Statement)
문(Statement)는 쉽게 말하면 C#의 한 문장입니다. 소스 코드 편집기에서 보면 한줄이고 ; 세미콜론이 문의 끝에 있습니다. 컴퓨터를 모르는 사람도 직관적으로 이해할 수 있습니다. 그 정도는 일반인도 이해할 수 있기 때문에 여기서는 약간 깊은 설명을 하겠습니다.
컴퓨터 프로그래밍에서 문(Statement)은 동작(Action)의 단위입니다. C#과 같은 고수준 언어(high level language)의 코드를 쪼개다 보면 CPU의 명령어 세트(instruction set)에 까지 나눌 수 있습니다. 어셈블리어의 니모닉은 명령어 세트의 기계어에 1대1 대응이 되는데 외관상 봤을 때는 고수준 언어의 문과 비슷하게 보입니다. 한 줄에 쓸 수 있느냐는 중요한 문제지만 코드 한 줄이라는 기준은 컴파일러가 알아듣지 못하고 이것을 정의하는 것은 C# 문법의 규칙입니다.
C# 하나의 문에는 여러개의 어셈블리어 명령이 포함될 수 있습니다. 예를 들어 int a = x + 5; 는 메모리 공간 a를 확보하고 x의 메모리에서 가져온 값에 5를 더해서 a 에 할당합니다. 각각의 단계는 어셈블리어로 작성될 수 있습니다. 사실 .NET 플랫폼에서 C#의 컴파일러가 하는 일은 MSIL 이라는 중간 언어를 만드는 일이지만 런타임의 본질을 보면 그렇습니다. (C# 컴파일러는 소스코드를 바로 바이너리 파일로 만들지 않기 때문에 C++ 보다 성능이 낮습니다)
그렇다면 문이라는 것은 여러개의 명령어 집합이 C# 규칙에 따라 모인 것이라고 볼 수 있는데 얼마가 모여야 문인가? 라는 의문이 생길 수 있습니다. 또 문이 여러개 모인 블록이라는 것도 있으니 문의 최대 길이와 블록과의 관계도 의문이 생깁니다. 이러한 생각을 하지 않고도 C# 프로그래밍을 잘 할 수 있습니다만 쪼금 더 파고들어 개념을 잡아보자는 차원으로 접근할 수도 있습니다.
해답은 별로 어렵지 않습니다. 첫째는 C# 컴파일러의 문법에 따라 정의 됩니다. 이것은 기계적으로 지켜야 합니다. 두번째는 코드의 가독성을 확보해야 합니다. 컴파일러 규칙을 잘 지켜도 사람이 읽을 수 없는 문은 생산성이 떨어집니다.
문에는 함수를 표현식과 함수 등을 사용할 수 있습니다. 보통은 function(매개변수1, 매개변수2…) 이런 식으로 사용하지요. 그런데 함수나 표현식을 매개변수에 추가하는 것에는 제한이 없습니다. 극단적으로 function1(funtcion2(function3(매개변수))) 처럼 하나의 문에 함수를 여러개 사용하는 것도 가능합니다. 컴파일러의 다른 제한이 없다면 수십개 수백개의 함수를 체인으로 물려서(메소드 체이닝) 하나의 문을 만들 수도 있습니다. 하나의 문이지만 사실상 수십가지의 처리를 할 수 있는 것 입니다. 하지만 가독성 적인 부분은 어떨까요? 메소드 체이닝을 한 만큼 복잡해집니다. 단 한개의 메소드의 예외로도 전체 문장에 영향을 미칠 수 있습니다.
이렇듯 문은 변수를 정의하는 간단한 것 부터 수십개의 메소드를 체인하는 것 까지 범위가 넓습니다. 문(Statement)이 잘 이해가 안된다면 이런 특성을 이해하기 때문입니다. 문의 한계가 어디까지냐는 컴파일러 규칙과 사용자의 가독성 측면, 즉 유지보수 관점에서 볼 수 있습니다. 메소드 체이닝으로 한 줄에 쓸 수 있는 코드를 여러줄에 걸쳐 작성하는 프로그래머도 있습니다. 어느 것이 맞느냐는 사용자 관점에서 평가를 할 필요가 있습니다. 대체로 라이브러리와 프레임워크를 사용할 때는 문이 많이 줄어드는데 응용 프로그래머에게는 가리워진 부분들입니다. 실제로는 그 안에 여러가지 문이 있는데 인스턴스를 생성하거나 메소드 한 줄만으로 동작하도록 설계되어 있는 것 입니다.
앞서 이야기한 것 처럼 문은 쉽게 말하면 그냥 소스 코드의 한 줄입니다. 하지만 그 안에서 의미하는 것은 좀 다릅니다. 때로 하나의 문을 붙들고 하루 종일 고민할 수 있는 것은 정의하기가 힘들기 때문입니다. 많은 프로그래밍 교재에서 이 개념을 그냥 짧게만 설명하고 가는 것은 쉬워서 그런게 아니라 깊이 들어가면 초보자의 학습에 방해가 되서 그렇습니다. 하지만 프로그래밍을 하면 할 수록 한 언어의 문이 많은 것을 담고 있다는 것을 배울 수 있습니다.
블록(Block)
블록은 문(statement)이 모인 것 입니다. 중괄호({ } – curly bracket)로 영역을 표시합니다. 여러개의 문을 사용할 수 있다는 것은 더 복잡한 기능을 처리할 수 있다는 것 입니다. 또 가독성 면에서도 훨씬 유리하겠지요.
그리고 문을 사용하는 문법들이 많이 있습니다. for, while 루프 if 분기 class 등 여러가지가 있습니다. C#에서 블록은 특정 조건에 사용하는 규칙입니다. 그것들은 블록을 사용하는 해당 주제에서 다룹니다.
참고문서
문 – C# 프로그래밍 가이드 | Microsoft Docs