C#은 .NET Framework 기반에서 동작하는 프로그램을 개발할 때 사용하는 프로그래밍 언어입니다. C# 언어는 표현력이 뛰어나면서도 단순하고 배우기 쉽게 되어 있습니다. 이미 C나 C++, Java에 익숙한 사용자라면 쉽게 사용할 수 있으며 높은 생산성을 발휘할 것입니다.
C# 언어를 이용하면 .NET Framework 기반에서 동작하는 다양한 범위의 프로그램을 개발할 수 있습니다. 일반적인 Windows 클라이언트 응용 프로그램에서 XML Web Services와 분산 구성 요소, 클라이언트/서버 응용 프로그램이나 데이터베이스 응용 프로그램 등 다양한 형태의 응용 프로그램을 제작할 수 있습니다.
이처럼 C#언어를 사용하면 .NET Framework 기반에서 동작하는 다양한 프로그램을 개발할 때 효과적입니다. 이 책에서는 C#언어에 대해서 다루고 있으며 이를 이용하여 다양한 종류(예: Windows 클라이언트 응용)의 프로그램을 개발하는 방법에 대해서는 다루지 않습니다.
[그림 1] .NET 프레임워크에서 동작하는 다양한 프로그램
1. 1 .NET Framework 구조
.NET Framework를 구성하는 핵심 요소는 CLR(공용 언어 런타임)입니다. CLR은 코드들을 관리하는 주요 역할을 담당합니다. 이와 같은 코드를 관리 코드라고 하며 CLR에 의해 관리되는 코드들은 형식이 안전함을 보장받게 됩니다. CLR에서는 형식 안전성 이외에도 메모리 관리, 쓰레드 실행 및 코드 실행과 기타 시스템 서비스 등을 관리합니다.
그리고, .NET Framework에서는 CTS(공용 형식 시스템)을 통해 견고한 코드를 보장하기 위해 형식에 대해 약속하고 있습니다. CTS는 관리되는 모든 형식은 자기 기술적이며 이 때문에 명확하게 개체들을 사용할 수 있습니다.
또한, CLS(공용 언어 사양)를 제시를 함으로써 자신이 만든 라이브러리를 다른 언어를 사용하는 개발자가 사용할 수 있게 점검해 줍니다. .NET 프레임워크에서 동작 가능한 프로그램을 작성할 때에는 C#언어를 비롯하여 Managed C++, Visual Basic.NET을 비롯하여 다양한 언어로 개발이 가능하며 CLS를 따른다면 교차 언어 개발도 가능합니다.
C# 소스파일을 컴파일하면 C# 컴파일러에 의해 .NET 어셈블리(.NET 프레임워크에서 동작 가능한 이진 파일)가 작성됩니다. 그리고 이를 실행하면 .NET 프레임워크의 핵심 역할을 담당하는 CLR에 의해 .NET 어셈블리를 로드하고 Jitter(Just In Time Compiler)에 의해 MSIL(.NET 어셈블리내에 코드를 MSIL이라 부름)코드를 실제 운영체제에서 동작 가능한 기계어 명령으로 변환하여 가동됩니다. 그리고 CLR은 참조하고 있는 다른 .NET 어셈블리를 로딩하는 작업과 .NET 공통 클래스 라이브러리를 사용하는 부분도 담당합니다.
[그림 2] .NET Framework에서 C# 프로그램 동작 구조
1. 2 Hello, World!
이제 C#언어로 간단하면서도 유명한 "Hello World!" 프로그램을 작성해 봅시다. 편의상 이 책에서는 Microsoft Visual Studio 2010로 작성하는 방법을 소개하겠습니다. 파일 => 새로 만들기 => 프로젝트를 선택하시고 새 프로젝트 창에서 Visaul C# => 콘솔 응용 프로그램을 선택한 후에 프로젝트명을 입력하세요. 참고로, 단축키는 Ctrl+Shift+N 입니다.
[그림 3] 프로젝트 생성
콘솔 응용 프로그램 템플릿 프로젝트를 생성하시면 하나의 프로그램 소스 파일이 자동으로 만들어집니다. 프로그램 진입점인 Main 메서드 내부에 "Hello, World!"를 콘솔 화면에 출력하는 구문을 추가해 봅시다.
class Program { static void Main(string[] args) { Console.WriteLine("Hello, World!"); } } |
드디어 그 유명한 "Hello, World!" 프로그램이 완성되었네요. 정상적으로 동작하는지 확인하기 위해 실행을 시켜 봅시다. 실행은 Ctrl + F5 혹은 F5(디버그 모드로 실행)로 할 수 있습니다.
▶ 실행 결과
Hello, World |
1. 3 Hello, World! 프로그램 설명
다음은 Hello, World! 프로그램의 소스 코드입니다. 여기에서는 이들에 대한 설명을 통해 C#의 소스 구성을 간략하게 살펴보겠습니다.
▶ Program.cs
/*Hello, World! 프로그램: 콘솔 화면에 "Hello, World!"를 출력*/ using System; namespace HelloWorld { /// <summary> /// 진입점 메서드를 포함하고 있는 클래스 /// </summary> class Program { /// <summary> /// 진입점 메서드 /// </summary> /// <param name="args">진입점 전달 인자</param> static void Main(string[] args) { Console.WriteLine("Hello, World!"); } } } |
1.3.1 주석
주석은 실제 수행되는 코드가 아니라 개발자가 코드를 이해하기 쉽게 작성하는 것입니다. C#에서도 C언어나 C++처럼 한 줄 주석에는 //를 사용하고 특정 영역을 주석으로 만들 때는 영역의 시작에 /*를 영역의 끝에 */를 사용합니다. Microsoft Visual Studio 2010에서는 주석을 만들거나 해제하기 쉽게 [그림4]처럼 툴바에 버튼을 제공하고 있습니다.
[그림 4] 주석 처리와 해제를 용이하게 하는 버튼
사용자가 정의하는 형식이나 형식 내 멤버에 대한 주석은 /// 를 사용하면 편집 창에서 이를 사용할 때 향상된 인텔리센스를 통해 주석의 내용을 확인할 수 있어 개발이 쉬워집니다.
[그림5] 향상된 인텔리센스
메뉴 => 프로젝트 => 속성 => 빌드 탭을 선택하신 후에 XML 문서 파일 체크박스를 선택하시면 빌드 시에 출력 폴더에 xml문서가 작성이 됩니다. 특히 라이브러리를 만들 때 이처럼 프로젝트를 설정하면 사용하는 곳에서도 향상된 인텔리센스의 도움을 받을 수 있습니다. 이 부분은 10장 .NET 어셈블리에서 다시 한 번 언급하겠습니다.
[그림 6] XML 문서 파일 출력 설정
▶ HelloWorld.XML
<?xml version="1.0"?> <doc> <assembly> <name>HelloWorld</name> </assembly> <members> <member name="T:HelloWorld.Program"> <summary> 진입점 메서드를 포함하고 있는 클래스 </summary> </member> <member name="M:HelloWorld.Program.Main(System.String[])"> <summary> 진입점 메서드 </summary> <param name="args">진입점 전달 인자</param> </member> </members> </doc> |
1.3.2 namespace
C#에서는 namespace는 형식 이름 사이에 충돌을 막기 위해 제공하고 있습니다. 만약, 참조한 두 개의 .NET 어셈블리에 같은 이름의 클래스가 정의되어 있다면 이름 충돌이 발생하여 어느 클래스를 사용하려는 것인지 개발도구는 판단할 수 없게 됩니다. C#에서는 이러한 이름 충돌을 막기 위해 namespace 문법을 제공하고 있습니다.
Console은 .NET Framework에서 제공하는 공용 클래스 라이브러리에서 System 이름 공간에 정의된 클래스입니다. 이를 사용하기 위해 using 구문을 사용하였습니다.
using System;
Microsoft Visual Studio 2010에서는 소스 코드에서 사용해야 하는 namespace를 쉽게 추가하거나 사용하지 않는 namespace를 제거하는 컨텍스트 메뉴(오른쪽 마우스를 클릭했을 때 뜨는 메뉴)를 제공하고 있습니다. 만약, 사용하는 형식이 어떠한 이름 공간에 있는지 정확히 모르고 해당 형식에 대한 using 구문이 없다면 사용하는 코드에서 컨텍스트 메뉴를 통해 추가하거나 단축키(Shift+F10 혹은 Shift+Alt+F10)를 이용하십시오.
[그림 7] 컨텍스트 메뉴를 통한 using 구문 추가 및 제거
1.3.3 class
C#으로 작성한 응용 프로그램은 최소한 하나 이상의 클래스를 가지고 있어야 합니다.
클래스는 C# 언어에서 사용자 정의 형식을 만드는 방법의 하나이며 가장 강력하고 일반적으로 사용됩니다. 이 외에도 사용자 정의 형식을 만들기 위해 구조체와 열거형을 제공하고 있습니다. 클래스와 구조체는 여러 멤버들을 하나의 패키지로 캡슐화하는 주요한 도구이며 열거형은 변수가 가질 수 있는 값의 종류를 정의할 수 있습니다. 이 책은 대부분 이들에 대한 설명으로 이루어진다고 볼 수 있습니다.
1.3.4 Main
Main은 프로그램의 진입점으로써 정적 메서드입니다. 여러분은 목적에 따라 Main 메서드를 다음 중 한 가지 형태로 정의할 수 있습니다.
static void Main();
static int Main();
static int Main(string[] args);
static void Main(string[] args);
만약, Main 정적 메서드가 두 개 이상의 클래스에 정의되어 있을 때는 컴파일러 옵션을 통해 시작 개체를 지정해 주어야 합니다. 시작 개체를 설정하는 방법은 메뉴 => 프로젝트 => 속성 => 응용 프로그램 탭을 선택한 후에 시작 개체 콤보 박스에서 원하는 항목을 선택하시면 됩니다.
1.3.5 Console.WriteLine
Console은 .NET Framework에서 제공하는 클래스 라이브러리에서 제공되는 클래스 중의 하나이며 System namespace에 정의되어 있습니다. Console 클래스는 표준 출력, 표준 입력 및 오류 스트림을 나타내며 콘솔 응용 프로그램에서 입출력 작업을 위해 자주 사용됩니다. 그중에 WriteLine은 정적 멤버 메소드로 표준 출력에 입력 인자로 전달된 문자열과 개행을 출력하는 역할을 담당합니다.
'언어 자료구조 알고리즘 > Escort C#' 카테고리의 다른 글
[C#] 5.1 캡슐화 대상(멤버) - 멤버 필드 (0) | 2016.05.02 |
---|---|
[C#] 5. 캡슐화 (0) | 2016.05.02 |
[C#] 4. 값(value) 형식 (0) | 2016.04.01 |
[C#] 3.4 string (0) | 2016.04.01 |
[C#] 3.3 배열 (0) | 2016.04.01 |
[C#] 3.2 Boxing 과 UnBoxing (0) | 2016.04.01 |
[C#] 3. 형식 개요, 3.1 object (0) | 2016.04.01 |
[C#] 2.2.2 식과 문 (0) | 2016.04.01 |
[C#] 2.2 해야 할 일에 관한 문법 사항, 2.2.1 연산자 (0) | 2016.04.01 |
[C#] 2. C# 구성 요소, 2.1 데이터에 관한 문법 사항 (1) | 2016.04.01 |