[C# 기초강좌] 5. C#응용프로그램의 기본 골격

Posted in SW개발 // Posted at 2023. 11. 1. 08:33
728x90
이 글은 제가 과거에 운영했던 사이트인 http://dotnet.mkexdev.net 의 글을 옮겨온 것입니다. 원본 글은 2010년에 작성되었습니다.

그 전에 운영했었던 사이트(mkex.pe.kr)은 흔적도 없이 사라 졌습니다. 그속의 글들도 모두... 그래서 이 사이트도 사라지기 전에 옮기고 싶은 글을 조금씩 이 블로그로 이동시키려 합니다.
(원본글) http://dotnet.mkexdev.net/Article/Content.aspx?parentCategoryID=1&categoryID=5&ID=669

이 글은 닷넷 기초 지식을 전파하기 위해 2010경에 작성되었으며, 당시 윤성우의 프로그래밍 스터디그룹 네이버 카페에도 필진으로 참여하여 연재했던 글이기도 합니다. 현재 시점에서 조금 달라진 부분이 있을 수 있으나 기본 원리와 언어 기초에 해당하는 부분은 크게 변하지 않았을 것으로 생각하며 이런 부분들을 감안해서 봐 주시기 바랍니다.

 

“static void Main(string[] args)”

안녕하세요. 박종명입니다. 닷넷 다섯 번째 강좌를 진행하도록 하겠습니다.
이번 주제는 닷넷의 대표적인 프로그래밍 언어인 C#의 기본 구조에 대해 알아봅니다.

Visual C#은 마이크로소프트가 닷넷 출시와 함께 탄생시킨 프로그래밍 언어입니다. 닷넷을 위한 몇 가지 언어가 존재하지만 특별한 이유가 없는 한 C#으로 시작하기를 권장합니다


HelloWorld 프로젝트를 통해 C# 응용프로그램의 기본 골격과 Visual Studio의 기본 구조에 대해 알아 보도록
하겠습니다. 

이전에 설치한 Visual Studio 2008 Express Edition(이하 VS)을 실행하여 새 콘솔 응용프로그램을 생성합니다

파일 -> 새 프로젝트를 실행하여 HelloWorld 라는 콘솔 응용프로그램을 만듭니다

VS를 통해 생성된 프로젝트에는 Main 메서드를 포함한 클래스 및 어셈블리 참조가 자동으로 설정됩니다

아래 코드는 기본 제공되는 코드에 콘솔에 출력하는 코드가 추가된 모습입니다

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace HelloWorld
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("안녕하세요"); //콘솔창에 문자열 출력
        }
    }
}

 

 

Main 메서드

우선 Main 메서드에 대해 살펴보겠습니다

: 오직 하나의 진입점만 허용

Main 메서드는 응용프로그램의 진입점 역할을 하는 함수로써 닷넷 런타임에 의해 호출되는 함수입니다. 하나의 응용프로그램에는 하나의 Main 메서드만 가능합니다. (Main 메서드가 두 개 이상 존재한다면 /main:<type> 컴파일 옵션을 이용하여 진짜(?) Main을 지정해 줘야 합니다)

 

: 대문자 ‘M’

Main 메서드의 앞 글자 M은 반드시 대문자이어야 합니다. C# 프로그램은 기본적으로 대/소문자를 구분합니다. 소문자로 main 을 정의하면 진입점을 찾지 못합니다.

>> vs java:: Java 에서는 main 함수가 소문자이어야 합니다

: static 정의

Main 메서드는 객체가 생성되기 전에 호출되어야 하는 특징이 있으므로 static로 정의되어야 합니다. (static 은 다음에 따로 다루도록 합니다)

: void 혹은 int 반환

코드에서는 Main 메서드가 void 반환을 취하고 있습니다. 즉 반환 값이 없는 형태입니다.  일반적으로 C#응용프로그램에서는 void 반환을 사용합니다만, 경우에 따라서는 int형을 반환할 수도 있습니다.

만일 스크립트나 다른 프로그램으로 실행파일을 호출 할 경우 int 값을 반환함으로써 프로그램의 상태정보를 전달할 수 있습니다

아래 코드는 닷넷 실행파일인 ‘HelloWorld.exe’를 배치파일로 실행하고 Main의 반환 값을 조사하는 스크립트 입니다 이렇듯 Main을 통해 자신의 상태를 전달하고 싶을 경우 Main 함수에 int 반환을 사용하게 됩니다

rem test.bat

@echo off

HelloWorld

@if "%ERRORLEVEL%" == "0" goto good


:fail
    echo Execution Failed
    echo return value = %ERRORLEVEL%
    goto end

:good
    echo Execution Succeded
    echo return value = %ERRORLEVEL%
    goto end

:end

 

참고로 Main 메서드에 void , int 이외의 반환형식은 지원하지 않습니다

 

 

: 매개변수(string 배열)

응용프로그램이 시작될 때 특정 값을 입력 받고 싶을 경우에는 string 배열로 받을 수 있습니다 (매개변수가 없을 경우 생략 가능합니다)

 아래 코드는 매개변수로 전달된 값을 출력하는 샘플입니다

static void Main(string[] args)
{
    for (int i = 0; i < args.Length; i++)
    {
        Console.WriteLine(args[i]);
    }
}

 

참고로 닷넷은 C++과는 달리 매개변수 string 배열의 첫 번째 요소가 실행파일 이름이 아닙니다.  즉 배열의 첫 번째 요소(args[0]) 부터 매개변수를 가르키게 됩니다

 

VS를 통해 매개변수를 전달하려면프로젝트 속성 -> 디버그 -> 명령줄 인수 에 전달할 매개변수를 입력하면 됩니다

 

네임스페이스

네임스페이스(namespace)는 프로그래밍 요소를 논리적으로 구분하게 하는 키워드 입니다.

HelloWorld 프로젝트에서는 굳이 네임스페이스를 지정하지 않아도 상관없으나 프로그램 크기가 커지고 협업 시 외부 어셈블리가 빈번히 사용되는 환경에서는 거의 필수에 가깝게 됩니다.

논리적으로 프로그램 구성요소를 그룹화 시킴으로써 이름 충돌을 방지하고 의미 있는 이름을 부여함으로써 어셈블리의 구성을 보다 직관적으로 관리할 수 있게 됩니다 (네임스페이스에 대해서는 다음에 따로 다루도록 합니다)

 

참조

어셈블리 참조

VS를 통해 프로젝트를 생성하면 우측의 솔루션 탐색기에 참조 항목이 자동 설정됩니다

참조는 말 그대로 외부에 정의된 어셈블리를 참조하는 것입니다. 

이렇게 참조함으로써 외부 어셈블리의 기능을 이용할 수 있게 되는 것으로 실제로는 외부 어셈블리의 메타데이터를 참조하는 것입니다 (명령줄로 빌드 할 경우 /reference 옵션에 해당합니다)

샘플의 코드 중 콘솔 창에 출력하는 아래의 코드는 mscorlib.dll에 정의된 System 네임스페이스 하위의 Console 클래스를 이용한 것입니다

Console.WriteLine("안녕하세요");

(참고로 mscorlib.dll은 참조목록에 없는데 어떻게 된 것일까요? mscorlib.dll의 닷넷 핵심 어셈블리로 자동으로
참조가 
 되는 특수한 어셈블리입니다)

기본적으로 몇 개의 어셈블리가 참조되어 있습니다만 HelloWorld에서는 모두 필요한 것은 아닙니다.
다만 VS 입장에서 보편적으로 사용되는 어셈블리를 기본 참조해 두도록 되어 있습니다.

실제로 이 프로젝트에서 참조된 모든 어셈블리를 지워도 실행에 아무 지장이 없습니다

 

using 지시문

using 지시문은 참조한 어셈블리의 네임스페이스를 한번만 지정하여 코드에서 매번 네임스페이스를 지정 (이를 정규화된 이름이라 합니다)하지 않아도 되도록 하는 편리성을 제공합니다

예를 들어 샘플에서 Console 클래스는 System 네임스페이스에 정의되어 있으므로 전체 이름은

System.Console.WriteLine("안녕하세요");

로 되어야 하지만 using System 으로 네임스페이스를 지정했으므로 바로 클래스 명 접근이 가능하게 됩니다.

using 지시문의 또 하나의 기능은 네임스페이스에 별칭을 부여할 수 있다는 것입니다

 

별칭을 주기 위해서는,

using MKEX = System

와 같이 System 네임스페이스에 대한 별칭을 MKEX로 선언하여 이후 System 네임스페이스의 모든 클래스를 MKEX 별칭으로 접근 할 수 있게 합니다

이러한 별칭을 줌으로써 얻게 되는 장점은 네임스페이스가 길 경우 단축되고 의미 있는 별칭으로 관리할 수 있어 편리함 간결함을 얻을 수 있다는 것입니다

>> vs java::

네임스페이스와 using 지시문은 자바의 패키지(package) import 키워드와 비교할 수 있습니다. 다만 java에서는 동일한 소스파일에서 여러 개의 패키지를 사용할 수 없지만 닷넷에서는 하나의 파일에 여러 개의 네임스페이스를 정의할 수 있는 등의 일부 차이점은 존재합니다

 

기본 클래스

Main 메서드를 포함하는 기본 클래스(최상위 공용클래스)의 이름은 정하기 나름입니다. VS가 자동으로 정해준 이름은 Program 이라는 클래스 입니다. 이때 이 클래스가 정의된 파일 이름 역시 정하기 나름입니다. VS에서는 기본적으로 클래스명과 같은

Program.cs 라고 명명했지만 이름을 변경해도 무관합니다

>> vs java:: 자바에서는 이와 같은 기본 클래스 이름이 파일 이름과 일치해야 합니다

 

이상으로 C# 응용프로그램의 기본적인 구조에 대해 살펴보았습니다.
네임스페이스, 어셈블리 참조, static 키워드 등은 그 자체만으로도 하나의 주제가 되지만 이 글에서는 자세히 다루지 않았습니다.

 이 글은 기본 골격 설명에 충실하기로 하고 기회가 된다면 세세하게 살펴보도록 하겠습니다. 
(기회란 니즈(needs) 겠죠? 자바 문법과 유사하여 굳이 다룰 필요가 있을 까 합니다만…)

그리고 자바와 비교하는 부분을 중간중간에 추가했습니다. 혹여 틀린 부분이 있으면 바로 지적 바랍니다.

그럼 즐거운 한 주 되세요~~~

 

'SW개발' 카테고리의 다른 글

[C# 기초강좌] 7. 박싱과 언박싱  (0) 2023.11.02
[C# 기초강좌] 6. C# 자료형  (0) 2023.11.01
[C# 기초강좌] 4. 명령줄 빌드  (0) 2023.11.01
[C# 기초강좌] 2. 닷넷의 실행구조  (0) 2023.11.01
SBCS, MBCS, WBCS  (0) 2023.10.31