C# Hello World 예제의 분석 – C# 초급 3

C# Hello World 예제의 분석

비주얼 스튜디오에서 새로운 프로젝트로 생성한 Hello World 예제를 분석해 보며 C# 프로그래밍 구조에 대한 전체적인 아이디어를 잡아보겠습니다. C# 윈도우 콘솔 앱을 생성합니다. 비주얼 스튜디오의 설치는 아래의 링크를 참고합니다.

C# 시작과 개발환경 – Microsoft Visual Studio 설치

NET 6.0 버전으로 생성한 프로젝트는 아래와 같이 심플하게 한 문장으로 이루어져 있습니다. 이것은 가장 최근에 출시한 Visual Studio 2022 또는 .NET 6 SDK 부터 사용할 수 있습니다. (C# 10 컴파일러) 이것은 비주얼 스튜디오의 C# 컴파일러가 프로젝트 형식에 따라 using 지시자 등을 자동으로 추가한 것 입니다.

// See https://aka.ms/new-console-template for more information
Console.WriteLine("Hello, World!");

원래는 기본 형식은 아래와 같습니다. 앞으로는 .NET 6 버전 형식을 사용하는 경우도 많을 것 같습니다. 다만 원래 C#의 형식을 알고는 있어야 하니까 한 줄씩 체크해보겠습니다.

using System;

namespace Smoothie
{
    class Program
    {
        static void Main()
        {
            Console.WriteLine("Hello, World!");
        }
    }
}

첫번째 using System 은 System 네임스페이스를 사용하는 지시자입니다. 예제에 사용된 Console 은 System 네임스페이스에 포함된 type 입니다. 네임스페이스(namespace)는 우리말로 이름 공간으로 직역되는데 이것을 사용하는 근본적인 이유는 이름간의 충돌을 막기 위해서 입니다. 그래서 name(이름) 에 space(공간)을 주는 것 입니다. 간단한 원리지만 생소한 용어라서 초보자는 혼동하기 쉽습니다.

C#은 타입 안정성(type safety)을 중요시하는 언어입니다. 타입이 다르면 이름도 달라야 합니다. 그런데 수천개가 넘는 라이브러리의 이름이 중복된다면 충돌이 일어나게 됩니다. 예를 Console 이란 이름이 서버의 Console 일수도 있고 클라이언트의 Console 일수도 있습니다. 둘다 Console 이라고 객체를 생성하면 컴파일러는 어떤 것이 서버인지 클라이언트인지 알 수 없습니다. 그래서 앞에 네임스페이스를 붙여서 System.Console 을 서버의 Console 이라고 하고 Chrome.Console 을 클라이언트의 Console이라고 하면 이름이 충돌하는 문제가 해결됩니다.

사람으로 따지면 성과 이름의 관계와도 비슷합니다. 예를 들어 이름이 ‘도현’ 인 A와 B가 같은 공간에 있습니다. 여기서 ‘도현’ 이라고 부르면 A인지 B인지 구분이 안갑니다. 그런데 이들의 성이 각각 ‘김’과 ‘강’ 이라면 ‘김도현’ ‘강도현’으로 바로 구분이 갑니다. 같은 이름 사이에 공간이 생기는 것 이지요.

두번째 namespace Smoothie 에도 네임스페이스가 나옵니다. 이것은 사용자의 커스텀 namespace 입니다. 이 안에서 생성하는 변수, 클래스, 인스턴스, 메소드 등 타입은 Smoothie 네임스페이스 안에서 사용가능합니다. 사용방법은 Smoothie.타입 입니다. 물론 여기서 생성한 타입을 다른 앱에서 사용하려면 위에서 처럼 using 지시자를 사용할 수 있습니다.

주의할 점은 using System을 사용하면 System 안에 있는 타입들이 다 들어오게 됩니다. Smoothie라는 네임스페이스 안에서 Console 이란 식별자를 재정의해서 사용할 수는 있으나 그렇게 되면 System.Console 은 우선순위에서 밀려서 사용할 수 없게 됩니다. 이 주제는 간단해 보이지만 변수의 영역(scope)과 객체지향프로그래밍과도 밀접한 관련이 있습니다. 아직 해당 주제를 학습하지 않았다면 조금 이해가 어려울 수도 있습니다.

세번째 class Program 입니다. class 키워드를 사용해서 클래스를 선언합니다. 클래스는 어떤 사물을 추상화 한 것 입니다. 뭐라도 클래스로 만들 수 있습니다… 이것은 해당 주제의 포스팅에서 자세히 다룰 것 입니다. C#은 객체지향 프로그래밍 언어로 프로그램을 클래스 단위로 작성하고 또 클래스 단위로 런타임에 로드하고 관리합니다. 소스 코드에는 보이지 않지만 클래스에는 여러가지 부가적인 정보가 딸려 있습니다. (버전, 메타데이타 등)

객체지향 프로그래밍이란게 클래스가 로드되지 않으면 작동하지 않습니다. 그러므로 올바르게 클래스를 작성해서 사용해야 합니다.

다음 static void Main 함수 입니다. Main 함수는 프로그램의 시작점으로 삼는 특별한 함수입니다. Main 말고 다른 이름으로 시작하지 않습니다. Main 에서 시작한다는 것은 컴파일러와 CLR의 약속입니다. static void 이것은 지금은 그 뜻을 몰라도 됩니다. Main 이 시작하는 최소 규칙같은 것 입니다.

마지막 Console.Writeline() 함수는 명령프롬프트의 표준출력(모니터)에 문자열이나 변수 등 매개변수들을 출력하는 함수입니다. 객체지향 프로그래밍에서는 메소드라고 하지요. System 네임스페이스를 using 하기 때문에 System.Console. 이라고 표기할 필요가 없습니다.

그 아래에는 } 중괄호가 있습니다. 중괄호는 이렇게 { } 시작과 끝이 있습니다. 열었으면 닫아주는게 원칙입니다. 중괄호가 대충 있는 것 같지만 정확한 규칙에 의해서 중첩관계(nested) 를 만들고 있습니다. C# 컴파일러는 괄호를 기준으로(괄호-token) 순서를 체크하여 소스코드를 어셈블리로 컴파일 할 수 있습니다.

들여쓰기를 하지 않아도 컴파일러는 잘 이해합니다. 하지만 프로그래머에게 가독성은 대단히 중요하기 때문에 들여쓰기를 굳이 예쁘게 하는 이유입니다. 들여쓴 상태만 봐도 코드의 구조가 읽히기 때문입니다. 들여쓰기는 IDE에 따라 예쁘게 정렬해주는 플러그인도 있습니다만, 습관이 중요합니다.

요약

C# Hello World 예제를 한 줄 씩 분석해봤습니다. 약간 C++ 기초 플러스(C++ Primer Plus)의 Stephen Prata 스타일 처럼 길게 써놨습니다. 한줄의 소스코드에도 많은 내용이 압축되어 있기 때문에 이것들을 풀어보면 누구나 길게 설명이 가능합니다.

처음에는 다 똑같은 예제로 시작하지만 점점 복잡한 코드를 작성하게 되는데 이런 분석들은 기초를 쌓는데 도움이 됩니다. 여기에 나온 키워드 namespace, class, using, Main 등을 각 주제에서 상세하게 학습한 후에 보게되면 초보때와는 다른 시야로 분석할 수 있으니 참고합니다.

참고문서

https://docs.microsoft.com/ko-kr/dotnet/csharp/

Leave a Comment