2. 기본 구문

2.1 namespace using

2.1.1 namespace

Java를 해보았다면 패키지(package)라는 개념에 익숙해져 있을 것이다. C#의 네임스페이스(namespace)는 이와 유사하다고 보면 쉽게 이해할 수 있을 것이다. 네임스페이스(namespace)를 이용하는 주된 목적은 네임스페이스를 이용하여 클래스를 묶어 손쉽게 관리하기 위한 목적과 네임스페이스 범위로 코드를 구성하여 사용자가 클래스 및 메서드 이름의 범위를 쉽게 제어하는데 있다.

실제 C#에서 많은 클래스들은 그들의 성격에 따라 네임스페이스(namespace)로 묶어서 관리된다. C#.NET 의 시스템 네임스페이스는 System으로 시작하며 수많은 클래스들을 포함하고 있다. 대표적인 예로 앞서 예제에서 이용된 Console클래스를 비롯하여 Int, Boolean, String과 같은 형식 선언들이 모두 System 네임스페이스로 묶여 있다.

네임스페이스는 .으로 구분되어 관리 될 수 있다.

네임스페이스의 선언은 namespace 키워드를 이용하여 선언한다.

namespace MyNamespace1.MyNamespace2

{

    class Program

    {

static void Main(string[] args)

        {

        }

    }

}

 

이 예제는 .을 기준으로 네임스페이스를 2단계로 구성하였다. 이는 아래 소스와 동일하다.

namespace MyNamespace1

{

namespace MyNamespace2

{

        class Program

        {

static void Main(string[] args)

            {

            }

        }

    }

}

 

네임스페이스는 DLL과 같은 라이브러리를 제작하여 이용할 때, 사용자 라이브러리의 기능을 명시적으로 표현해줄 수 있는 이름으로 이용되곤 한다.

* 네임스페이스를 지정하지 않고 소스코드를 작성하면 기본 네임스페이스가 자동으로 만들어진다.

* :: 연산자는 네임스페이스 별칭 한정자 연산자로 식별자 조회를 위해 이용된다.

 

2.1.2 using

C#으로 프로그램을 작성할 때 매번 빠지지 않고 나오는 키워드가 using이라는 키워드이다. using의 용도는 다음과 같다.

1) 개체 이용의 편의성

C#으로 구현된 코드들은 최상위에 using 키워드를 통해 네임스페이스를 지정하고 있는 것을 볼 수 있을 것이다. 이와 같이 이용하는 이유는 개발할 때 한정된 네임스페이스를 이용하면 네임스페이스에 대한 전체 이름을 참조하지 않고도, 선언된 네임스페이스 내부에 있는 개체들에 접근하는 것이 가능하기 때문이다. 이는 불필요한 코드 타이핑을 줄일 수 있다. 또한, 지시자를 통해 선언하고 시작함으로써 코드가 명시적으로 어떠한 네임스페이스들을 참조하여 만들어져 있는지 확인하기 쉬워진다. 실제 지시자 using을 사용하는데 있어, 주의하여야 할 것은 using C C++ include 구문처럼 헤더파일이나 라이브러리 파일을 가르는 것이 아니라 네임스페이스(namespace)이름을 나타낸다는 것이다.

앞서 사용된 예제를 다시 보면,

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

using System;

using System.Collections.Generic;

using System.Text;

 

namespace ConsoleApplication1

{

    class Program

    {

        static void Main(string[] args)

        {

            Console.WriteLine("Hello, C#.");

Console.Read();

        }

    }

}

 

1번째 라인에 using System; 구문을 통해 선언해 놓았기 때문에 11번째 라인은 System.Console.WriteLine("Hello, C#."); 대신에 Console.WriteLine("Hello, C#."); 처럼 사용할 수 있게 된다. 12번째 라인 역시 System 네임스페이스에 속한 Console클래스의 Read 메서드를 Console.Read();와 같이 사용할 수 있게 된다.

 

이외에 using은 네임스페이스의 별칭을 지정하는데 이용될 수도 있다. 다시 이전의 소스를 수정해 보자. 앞의 소스와 1번째 라인과 11, 12번째 라인을 비교해보자.

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

using MyClass = System.Console;

using System.Collections.Generic;

using System.Text;

 

namespace ConsoleApplication1

{

    class Program

    {

        static void Main(string[] args)

        {

MyClass.WriteLine("Hello, C#");

            MyClass.Read();

        }

    }

}

 

의 소스와 비교해보면 1번째 라인은 using System;  using MyClass = System.Console; 로 바뀌었다는 것을 알 수 있다. 현 소스의 1번째 라인의 의미는 System 네임스페이스의 Console 클래스에 대한 별칭을 MyClass로 주겠다는 것을 의미한다. 이렇게 이용함으로써 긴 이름이나 복잡한 이름에 대한 별칭을 쉽게 지정할 수 있고 11, 12번째 라인에서 이용한 것처럼 별칭을 이용해 메서드를 호출할 수 있게 된다.

별칭에 대한 대상은 네임스페이스나 형식 클래스가 될 수 있으며, 적절한 별칭의 사용은 코드를 읽기 쉽게 만드는데 기여할 수 있다.

 

2) 범위 한정

using의 중요한 기능 중 하나는 범위 제한에 있다. .NET Garbage Collector에 의해 제어되는데, Garbage Collector가 수행되는 시기가 객체의 사용이 끝나는 시점과 맞물리지 않는다. 이와 같은 문제는 제한된 리소스를 이용하는 경우 문제점가 발생할 수 있다. 데이터베이스 서버에 연결되어 작업되는 시스템이 있을 때, 데이터베이스 서버는 클라이언트 연결 수에 대한 제한을 가진다. 이 경우 빠른 연결해제가 이루어지지 않으면, 다른 클라이언트에서 연결 초과로 인해 데이터베이스 서버 연결에 실패하는 경우가 발생할 수 있다. 이와 같은 경우 객체의 사용과 해제를 명시적으로 하기 위해 Garbage Collector을 강제로 수행하거나 객체의 범위를 한정시켜 해당 리소스를 해제할 시기를 지정하는 방법을 이용하여야 한다. using은 이 경우 명시적인 리소스 해제 시기를 한정해줄 수 있게 된다. 아래 예제를 보자.

 

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

using System;

using System.Collections.Generic;

using System.Text;

 

namespace Second

{

    class Program

    {

        static void Main(string[] args)

        {

            using (SomeClass _some1 = new SomeClass())

            {

            }

            Console.WriteLine("Some1 Dispose");

           

            SomeClass _some2 = new SomeClass();

            using (_some2)

            {

            }

            Console.WriteLine("Some2 Dispose");

           

            Console.Read();

        }

    }

 

    class SomeClass : System.IDisposable

    {

        public void Dispose()

        {

            Console.WriteLine("test");

        }

    }

}

 

11~13번째 라인은 using을 통해 SomeClass 개체를 이용하고 있다. 이 경우 using으로 묶여있는 SomeClass는 중괄호로 묶여있는 범위 안에서만 이용되며, 이 범위를 벗어나는 순간 Dispose 메서드가 자동으로 호출되게 된다. 16~19번째 라인은 동일한 역할을 하는 코드를 다른 방법으로 표현한 예이다.

 

* 이 경우 using문에 사용되는 개체는 Dispose 메서드 호출을 통해 개체의 리소스를 해제할 수있도록 하기 위해, IDisposable 인터페이스가 구현되어야 한다.



/* 출처 */
inobae의 놀이터
http://blog.naver.com/inobae

1. 시작하기

간단한 응용 프로그램을 만들어 보자. [파일] 메뉴에서 [새로 만들기] 메뉴의 [프로젝트] 메뉴를 선택하면 다음과 같은 화면이 나타난다. [콘솔 응용 프로그램]을 선택 한 후 확인 버튼을 눌러보자.

 

확인 버튼을 누르면 다음과 같이 기본 코드가 생성되며, 11, 12번째 라인과 같이 타이핑을 한 후 실행을 해보자.

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

using System;

using System.Collections.Generic;

using System.Text;

 

namespace ConsoleApplication1

{

    class Program

    {

        static void Main(string[] args)

        {

            System.Console.WriteLine("Hello, C#.");

System.Console.Read();

        }

    }

}

 

아래와 같이 출력되는 것을 볼 수 있을 것이다.

Hello, C#.

 

자 이제 소스에 대해 살펴 보기로 하자.

1~3번째 라인을 보면 using로 시작하는 구문을 볼 수 있을 것이다. C#에서 using 키워드 크게 2가지의 역할로 요약할 수 있다. 첫 번째는 별칭의 형태로 이용하기 위한 단순 지시자의 용도가 그 하나이고 두 번째는 범위 한정을 위해 이용된다. 여기에 사용된 using은 단순 지시자의 용도로서 참조된 라이브러리의 네임스페이스(namespace)를 명시함으로써 이후 사용할 때 전체 한정을 벗어나 사용할 수 있게 된다. 네임스페이스(namespace) using은 이후 다시 설명하게 될 것이니 여기서는 이 정도로만 알고 넘어가기로 하겠다.

5번째 라인은 현재 응용프로그램의 네임스페이스(namespace)를 지정하고 있는 구문이다. namespace라는 키워드를 이용하여 적고 있다는 것 정도만 보고 넘어가자.

7번째 라인부터 class가 시작된다. C#은 클래스로부터 프로그램이 시작되어서 클래스로 끝이 나게 된다. 프로그램의 진입점은 Main 메서드를 가진 클래스가 된다. 9번째 라인을 보면 Main 메서드가 선언되어 있는 것을 볼 수 있을 것이다. 실제 프로그램이 9번째 라인부터 시작한다고 보면 된다.

11번째 라인은 콘솔에 출력을 해주기 위한 구문이다. System.Console.WriteLine("Hello, C#.");를 보면 System 네임스페이스에 Console클래스에 WriteLine 메서드를 이용해서 Hello, C#.이라는 텍스트를 출력하고 있다.

12번째 라인은 콘솔 입력을 받기 위해 입력 대기하라는 구문이다.

11, 12번째 라인을 살펴보면 System.Console까지 공통적으로 사용되고 있는 것을 볼 수 있다. 11, 12번째 라인 모두 System 네임스페이스의 Console클래스를 이용하고 있다는 뜻으로 실제 1번째 라인을 보면 using 키워드를 이용해 using System;와 같이 선언해 놓음으로서 System을 생략하고 다음과 같이 11, 12번째 라인을 고쳐도 문제없이 실행되는 것을 볼 수 있을 것이다.

Console.WriteLine("Hello, C#.");

Console.Read();

 

/* 출처 */
inobae의 놀이터
http://blog.naver.com/inobae

제 1장 .NET Framework


1. 닷넷 프레임워크

  1.1 닷넷 프레임워크에 대한 소개

  많은 사람들이 .NET에 대해 얘기하지만 .NET은 프로그래밍 언어가 아니다. 비록 .NET이라는 환경을 위한 다양한 언어들 (C#.NET, VB.NET, VC.NET, 등)을 제공하지만, 엄격히 말해 .NET을 프로그래밍 언어라고 볼 수는 없다. 여기서 얘기하고자 하는 .NET은 공통된 환경(CLR, Common Language Runtime)과 공통된 라이브러리(FCL, Framework Class Libraries)를 제공하는 사용자 플랫폼이라고 보면 될 것이다. 이를 위해 CLI(Common Language Infrastructure)에서 실행 코드와 실행 환경에 대한 명세를 제공한다. 서로 다른 언어들과 플랫폼에서 상호 호환성을 유지하기 위해서는 각각의 언어들이 플랫폼과 는 독립적으로 동일한 형태의 형을 지원해야 한다. 이를 .NET Framework에서는 CTS(Common Type System)라는 형태로 지원하고 있다. 자바의 JVM(Java Virtual Machine)과 비슷하다고 보면 된다. CTS은 다양한 형태의 형들에 대한 지원을 지원한다. CTS는 다양한 언어들의 컴파일러에 의해 공유되며, 공통된 형을 통해 다양한 언어들에 대한 통합, 형 안전성, 실행코드들의 성능을 향상 시킨다.

  CLI는 CTS에 정의된 형들에 대한 참조를 위해 메타 데이터를 사용한다. Metadata는 프로그램 언어에 독립적으로 저장된다. 그런 이유로, 메타데이터는 컴파일러나 디버그와 같은 툴과 VES(Virtual Execution System)사이에 교환 메커니즘을 제공한다. VES는 메타데이터와 수행가능한 관리 코드들에 대한 수행과 로딩을 담당하며, CLI기반의 언어들과 VES와 메타데이터들을 이용해서 통신이 가능하다.


  1.2 닷넷 프레임워크의 장단점

 


2. 닷넷 프레임워크 3.0

  닷넷 프레임워크 3.0은 .NET Framework 2.0에 WPF(Windows Presentation Foundation), WCF(Windows Communication Foundation), WF(Windows Workflow Foundation), CardSpace의 4가지 기술이 결합 확장된 형태라고 보면 된다. 닷넷 프레임워크 3.0를 이용하기 위해서는 각각의 프레임워크 SDK와 Visual Studio .NET 2005의 확장 플러그인 형식으로 제공되는 파일을 다운받아 이용할 수 있다. 여기서는  WPF, WCF, WF, CardSpace에 대한 각각의 소개는 다음으로 미루기로 하겠다.


3. C#에 대한 소개

  C#은 ECMA-334와 ISO/IEC 23270에 의해 표준화 되어 있으며, Microsoft의 C# 컴파일러는 이 표준에 따라 작성되었으며, 닷넷 프레임워크 하에서 돌아간다. C#은 C, C++, Java, Delpi와 같은 기존 프로그래밍 언어들에 영향을 받아 디자인 되었다. 현재는 닷넷 프레임워크 3.0이 릴리즈 되어 기존의 1.1에 비해 많은 API와 개선된 성능을 제공하고 있다. 닷넷 프레임워크 3.0은 기존의 닷넷 프레임워크 2.0 기반에 소개된 몇가지 구성요소들이 추가되어 있는 형태로서 닷넷 프레임워크 2.0을 그대로 이용하고 있다.

  C#의 장점은 닷넷 프레임워크의 장점을 그대로 가진다. 또한, 기존의 시스템들과의 통합된 개발이 가능하게 확장되어 있다.


4. Visual Studio .NET 2005

  4.1 Visual Studio .NET 2005 소개

  2005년 영문판을 정식 출시하면서 그 모습을 드러냈다. 한글판은 2006년 3월 출시 되었다. Visual Studio .NET은 개발자들이 .NET Framework하에서 돌아가는 프로그램을 개발하기 위한 통합 개발환경이다. 2005 버전에서는 다음과 같은 형태의 제품군들이 있다.

[표 1)] Microsoft VS .NET 2005 제품군 특징(MSDN 사이트 참조)

형태

Express

Edition

Visual

Studio

Standard

Edition

Visual

Studio

Professional

Edition

Visual

Studio

Tools For

Office

Visual

Studio

Team

System

IntelliSense

Yes

Yes

Yes

Yes

Yes

Code editor

Yes

Yes

Yes

Yes

Yes

Code snippets

Yes

Yes

Yes

Yes

Yes

언어 지원

VB, VC#,

VC++, VJ#

과 같은 단일 언어 지원

All

All

VB와 VC#

All

Office

개바 지원

No

No

No

Office 제품군

개발 지원

Office 제품군

개발 지원

사용자 지원

기본 옵션과

메뉴

기본 옵션과

메뉴

Full

Full

Full

윈폼 디자이너

VB, VC#,

VC++, VJ#

Yes

Yes

Yes

Yes

웹폼 디자이너

Visual Web

Developer

Yes

Yes

Yes

Yes

모바일 디바이스

지원

No

Yes

Yes

No

Yes

데이터베이스

디자인 도구

(테이블과

Stored

Procedure

생성/수정)

Local

Local과

Remote

Local과

Remote

Local과

Remote

Local과

Remote

데이터 엑세스

디자이너

Local

Local과

Remote

Local과

Remote

Local과

Remote

Local과

Remote

문서

기본 문서

MSDN

MSDN

MSDN

MSDN

클래스 디자이너 와 객체 테스트

No

Yes

Yes

Yes

Yes

XML 에디터

지원t

No

No

Full XML/

XSLT

Full XML/

XSLT

Full XML/

XSLT

배포 툴

Click Once

Click Once

Yes

Yes

Yes

소스 제어

No

MSCCI 호환

(Visual SourceSafe 별도 판매)

MSCCI 호환

(Visual SourceSafe 별도 판매)

MSCCI 호환

(Visual SourceSafe 별도 판매)

MSCCI 호환

(Visual SourceSafe 포함,

VS Team

Foundation Server 따로 판매)

디버깅

Local

Local

Local/

Remote

Local

Local/

Remote

64비트 컴파일러

지원(Itanium)

No

No

No

No

Yes

64비트 컴파일러 지원(X64)

No

Yes

Yes

Yes

Yes

서버 탐색기

No

No

All

All

All

SQL Server

2005 통합

No

No

Yes

Yes

Yes

Code Profiling

No

No

No

No

Yes

Static Analysis

No

No

No

No

Yes

단위 테스트

No

No

No

No

Yes

프로젝트 관리

No

No

No

No

Yes

Test Case

관리

No

No

No

No

Yes


  Visual Studio 외에도 .NET 개발환경으로서 Sharp Developer이라는 무료 IDE 환경이 존재한다. 여기서는 Visual Studio를 이용한 개발을 소개하며 따로 다른 IDE 환경에 대한 소개는 언급하지 않겠다.



/* 출처 */
inobae의 놀이터
http://blog.naver.com/inobae