시작하세요! C# 6.0 프로그래밍 : 기본 문법부터 실전 예제까지

38
  • date post

    22-Jul-2016
  • Category

    Documents

  • view

    421
  • download

    22

description

정성태 지음 | 프로그래밍 & 프랙티스 시리즈_011 | ISBN: 9791158390075 | 27,000원 | 2015년 08월 4일 발행 | 752쪽

Transcript of 시작하세요! C# 6.0 프로그래밍 : 기본 문법부터 실전 예제까지

Page 1: 시작하세요! C# 6.0 프로그래밍 : 기본 문법부터 실전 예제까지
Page 2: 시작하세요! C# 6.0 프로그래밍 : 기본 문법부터 실전 예제까지

책2.indb 1 2015-07-27 오전 10:41:47

Page 3: 시작하세요! C# 6.0 프로그래밍 : 기본 문법부터 실전 예제까지

서문을 쓰는 오늘(2015년 7월 20일), 정식으로 비주얼 스튜디오 2015와

함께 C# 6.0이 발표됐다. 이번에는 어떤 변화가 있을까? 이에 대한 답을

내리기 전에 우선 C# 5.0 이후 달라진 마이크로소프트의 행보를 살펴볼

필요가 있다. 필자의 첫 번째 책인 『시작하세요! C# 프로그래밍』이 2013

년에 출간됐고 그로부터 겨우 2년 남짓한 시간이 지나는 동안 IT 업계에

는 정말 많은 변화가 있었다. 그리고 그 변화는 마이크로소프트의 정책

에도 적지 않은 영향을 주었다.

그동안 오직 윈도우 운영체제 위주의 폐쇄성을 보이던 마이크로소프트가

다중 플랫폼 지원 및 오픈소스에 참여하면서 새롭게 통합과 개방이라는

방향성을 제시하기 시작한 것이다.

■ 마이크로소프트 클라우드 플랫폼인 Azure의 변화

■ 리눅스(우분투, CoreOS, CentOS, SUSE) 가상 머신 지원

■ 아파치 하둡, HBase, Storm, Spark 지원

■ 톰캣, 제티, 웹로직을 비롯한 자바 WAS 지원

■ 맥/리눅스를 위한 비주얼 스튜디오 코드 에디터 무료 버전 공개

■ 다중 플랫폼에 포팅 가능한 닷넷 오픈소스 프로젝트 진행

■ C# 및 VB.NET 컴파일러를 오픈소스 프로젝트로 진행

■ 닷넷 용 LLVM 기반 컴파일러인 LLILC 오픈소스 프로젝트 진행

■ 리눅스 도커를 Azure와 차기 윈도우 서버 버전에 적용

■ 비주얼 스튜디오에 Git 버전 제어 통합 및 GitHub 연동

■ 크로스 개발 도구 공개

■ Objective-C 프로젝트를 비주얼 스튜디오에서 지원

■ 안드로이드 앱을 윈도우 10 앱으로 포팅 지원

■ 윈도우 10 무료 업그레이드

서·문

4

책2.indb 4 2015-07-27 오전 10:41:49

Page 4: 시작하세요! C# 6.0 프로그래밍 : 기본 문법부터 실전 예제까지

위의 변화를 보면 그것이 단순한 일회성의 보여주기 식 이벤트로 그치지

않을 것임을 쉽게 짐작할 수 있다.

C# 개발자로서 특히 반가운 것은 닷넷의 다중 플랫폼을 위한 오픈소

스화다. 물론 마이크로소프트는 닷넷 프레임워크 초기에도 ‘Shared

Source CLI’라는 이름으로 소스코드를 공개했지만 상용 라이선스가

금지되는 등의 제한이 있었다. 하지만 이번에 GitHub를 통해 공개된

CoreClr1/CoreFX2 프로젝트는 다르다. GitHub 공개 자체만으로도 누

구나 그 프로젝트에 참여해 소스코드를 열람 및 개선할 수 있게 된 것이

다. 심지어 마이크로소프트는 CoreClr과 닷넷 프레임워크의 소스코드를

동기화시키겠다고 밝혔다. 따라서 CoreClr을 바탕으로 포팅된 환경이

그저 그런 수준에서 쓸 수 있는 정도가 아니고 상용 제품의 개발에도 사

용될 수 있는 안정성까지 보장함을 의미한다. 결국 CoreClr/CoreFX가

다른 플랫폼으로 순조롭게 포팅되면3 그동안 C# 언어의 결정적인 단점

이었던 윈도우 제약을 탈피할 수 있게 되어 자연스럽게 C# 프로그램의

대중화에도 그만큼 힘을 실어줄 수 있다.

또 한가지 반가운 소식은 C# 컴파일러를 오픈소스로 공개한 것이다. 코

드명으로 시작된 Roslyn4이라는 이름으로 GitHub에서 찾을 수 있는데

실제로 비주얼 스튜디오 2015와 함께 설치되는 C# 컴파일러는 Roslyn

의 결과물이다. Roslyn이 훌륭한 것은 단순히 컴파일러 수준에서 그치

지 않고 컴파일러의 내부 기능 자체를 라이브러리처럼 사용할 수 있게

만들었다는 점이다. 가령, 여러분들의 C# 프로젝트에서 지역 변수 명으

로 i, j, k를 사용하고 있는 메서드를 찾고 싶다면 기존에는 C# 소스코드

1 https://github.com/dotnet/coreclr

2 https://github.com/dotnet/corefx

3 �현재�ASP.NET�5를�맥과�리눅스에서�구동할�수�있다(http://docs.asp.net/en/latest/getting-started/index.

html).

4 https://github.com/dotnet/roslyn

서·문

5

책2.indb 5 2015-07-27 오전 10:41:49

Page 5: 시작하세요! C# 6.0 프로그래밍 : 기본 문법부터 실전 예제까지

를 해석할 수 있는 별도의 파서를 만들어야 했지만 Roslyn을 이용하게

되면 해석된 결과물을 얻어낼 수 있어 이를 이용해 해당 메서드를 찾는

것이 가능하다. 또는 개발팀이 정한 명명 규칙을 어기는 코드를 찾는다

거나 하는 식의 사용자 정의 정적 코드 분석기를 쉽게 개발할 수 있고 이

를 비주얼 스튜디오의 코드 편집기에 통합하는 것도 가능하다.

이제 처음에 했던 질문의 답을 내보자. C# 6.0의 가장 큰 변화는 언어 자

체에 추가된 신규 문법들이 아니다. C# 6.0부터 소스코드가 공개된 컴파

일러가 제공되어 C# 6.0 소스코드를 분석할 수 있는 라이브러리가 생겼

다는 점과 리눅스 및 맥에서도 콘솔 및 웹 응용 프로그램 형식의 프로그

램을 구동할 수 있게 됐다는 점이다. 그런 변화에 비하면 이 책에서 설명

하고 있는 C# 6.0의 신규 문법은 보너스 정도라고 여길 수 있다.

정리해 보면, C# 언어는 문법적으로도 발전하고 그것을 둘러싼 환경도

발전하고 있는 언어다.

서·문

6

책2.indb 6 2015-07-27 오전 10:41:50

Page 6: 시작하세요! C# 6.0 프로그래밍 : 기본 문법부터 실전 예제까지

01장 들어가면서............................................................................................................................................. 25

1.1 닷넷 프레임워크 ........................................................................................................................... 25

1.1.1 닷넷 호환 언어 .................................................................................................................... 26

1.1.2 공통 중간 언어(CIL: Common Intermediate Language) ........................................ 27

1.1.3 공용 타입 시스템 ................................................................................................................ 28

1.1.4 공용 언어 사양 .................................................................................................................... 29

1.1.5 메타데이터 ............................................................................................................................ 30

1.1.6 어셈블리, 모듈, 매니페스트 ............................................................................................. 31

1.1.7 공용 언어 기반구조 ............................................................................................................ 32

1.1.8 공용 언어 런타임 ................................................................................................................ 33

1.1.9 닷넷 프레임워크 .................................................................................................................. 34

1.1.10 C#과 닷넷 프레임워크의 관계 ....................................................................................... 36

정리 ............................................................................................................................................................. 37

02장

개발 환경 준비 .................................................................................................................................. 39

2.1 기본 예제 ......................................................................................................................................... 40

2.2 편집기 + 명령행 컴파일러 사용 ............................................................................................. 41

2.3 모노 개발 환경 .............................................................................................................................. 43

2.4 비주얼 스튜디오 개발 환경 ...................................................................................................... 46

2.5 닷넷 역컴파일러 ........................................................................................................................... 52

정리 ............................................................................................................................................................. 55

목·차

01C#

PART

7

책2.indb 7 2015-07-27 오전 10:41:50

Page 7: 시작하세요! C# 6.0 프로그래밍 : 기본 문법부터 실전 예제까지

03장

C# 기초 ................................................................................................................................................... 56

3.1 기본 자료형 .................................................................................................................................... 56

3.1.1 정수형 기본 타입 ................................................................................................................ 56

3.1.2 실수형 기본 타입 ................................................................................................................ 59

3.1.3 문자형 기본 타입 ................................................................................................................ 60

3.1.4 불린(boolean)형 기본 타입 .............................................................................................. 63

3.1.5 마치며 .................................................................................................................................... 64

3.2 형변환 ............................................................................................................................................... 65

3.2.1 암시적 변환 .......................................................................................................................... 65

3.2.2 명시적 변환 .......................................................................................................................... 65

3.3 기본 문법 요소 .............................................................................................................................. 66

3.3.1 예약어, 키워드 ..................................................................................................................... 67

3.3.2 식별자 .................................................................................................................................... 67

3.3.3 리터럴 .................................................................................................................................... 68

3.3.4 변수 ........................................................................................................................................ 69

3.3.4.1 2가지 저장소: 스택과 힙 .................................................................................... 70

3.3.4.2 값 형식을 가리키는 변수 ................................................................................... 71

3.3.4.3 참조 형식을 가리키는 변수 ............................................................................... 71

3.3.4.4 기본값 ..................................................................................................................... 74

3.3.5 상수 ........................................................................................................................................ 74

3.3.6 연산자, 문장 부호 ............................................................................................................... 75

3.4 배열 ................................................................................................................................................... 76

3.4.1 다차원 배열 .......................................................................................................................... 80

3.4.2 가변 배열 .............................................................................................................................. 81

3.5 제어문 ............................................................................................................................................... 82

3.5.1 선택문 .................................................................................................................................... 82

목·차

책2.indb 8 2015-07-27 오전 10:41:51

Page 8: 시작하세요! C# 6.0 프로그래밍 : 기본 문법부터 실전 예제까지

3.5.1.1 관계 연산자, 논리 연산자 .................................................................................. 83

3.5.1.2 if 문 .......................................................................................................................... 86

3.5.1.3 switch 문 ................................................................................................................ 89

3.5.2 반복문 .................................................................................................................................... 92

3.5.2.1 증감 연산자, 복합 대입 연산자 ........................................................................ 92

3.5.2.2 for 문 ....................................................................................................................... 95

3.5.2.3 중첩 루프 ............................................................................................................... 98

3.5.2.4 foreach 문 ............................................................................................................. 99

3.5.2.5 while 문 ................................................................................................................100

3.5.3 점프문 ..................................................................................................................................102

3.5.3.1 break 문 ..............................................................................................................102

3.5.3.2 continue 문 .........................................................................................................102

3.5.3.3 goto 문 .................................................................................................................104

정리 ...........................................................................................................................................................106

04장 C# 객체 지향 문법 .........................................................................................................................110

4.1 클래스 .............................................................................................................................................111

4.1.1 필드 ......................................................................................................................................114

4.1.2 메서드 ..................................................................................................................................115

4.1.2.1 중복 코드 제거 ...................................................................................................120

4.1.2.2 코드 추상화 .........................................................................................................121

4.1.3 생성자 ..................................................................................................................................122

4.1.4 소멸자 ..................................................................................................................................126

4.1.5 정적 멤버, 인스턴스 멤버 ...............................................................................................127

4.1.5.1 정적 필드 .............................................................................................................128

4.1.5.2 정적 메서드 .........................................................................................................131

4.1.5.3 정적 생성자 .........................................................................................................134

4.1.6 네임스페이스 ......................................................................................................................137

목·차

책2.indb 9 2015-07-27 오전 10:41:52

Page 9: 시작하세요! C# 6.0 프로그래밍 : 기본 문법부터 실전 예제까지

4.2 캡슐화 .............................................................................................................................................141

4.2.1 접근 제한자 ........................................................................................................................142

4.2.2 정보 은닉 ............................................................................................................................143

4.2.3 프로퍼티 ..............................................................................................................................146

4.3 상속 .................................................................................................................................................148

4.3.1 형변환 ..................................................................................................................................152

4.3.1.1 as, is 연산자 .......................................................................................................155

4.3.2 모든 타입의 조상: System.Object ...............................................................................157

4.3.2.1 ToString ................................................................................................................159

4.3.2.2 GetType ...............................................................................................................160

4.3.2.3 Equals ..................................................................................................................162

4.3.2.4 GetHashCode ....................................................................................................164

4.3.3 모든 배열의 조상: System.Array .................................................................................165

4.3.4 this ........................................................................................................................................168

4.3.4.1 this와 인스턴스/정적 멤버의 관계 ................................................................170

4.3.5 base .....................................................................................................................................172

4.4 다형성 .............................................................................................................................................174

4.4.1 메서드 오버라이드 ............................................................................................................174

4.4.1.1 base를 이용한 메서드 재사용 .......................................................................179

4.4.1.2 object 기본 메서드 확장 ..................................................................................180

4.4.2 오버로드 ..............................................................................................................................183

4.4.2.1 메서드 오버로드 ................................................................................................184

4.4.2.2 연산자 오버로드 ................................................................................................185

4.4.2.3 클래스 간의 형변환 ...........................................................................................188

4.5 C#의 클래스 확장 ......................................................................................................................192

4.5.1 타입 유형 확장 ..................................................................................................................192

4.5.1.1 중첩 클래스 .........................................................................................................192

4.5.1.2 추상 클래스 .........................................................................................................193

4.5.1.3 델리게이트 ..........................................................................................................196

목·차

책2.indb 10 2015-07-27 오전 10:41:53

Page 10: 시작하세요! C# 6.0 프로그래밍 : 기본 문법부터 실전 예제까지

4.5.1.4 인터페이스 ..........................................................................................................213

4.5.1.5 구조체 ...................................................................................................................227

4.5.1.6 열거형 ...................................................................................................................242

4.5.2 멤버 유형 확장 ..................................................................................................................247

4.5.2.1 읽기 전용 필드 ...................................................................................................247

4.5.2.2 상수 .......................................................................................................................249

4.5.2.3 이벤트 ...................................................................................................................251

4.5.2.4 인덱서 ...................................................................................................................259

정리 ...........................................................................................................................................................263

05장

C# 1.0 완성하기 ..............................................................................................................................265

5.1 문법 요소 .......................................................................................................................................266

5.1.1 구문 ......................................................................................................................................266

5.1.1.1 전처리기 지시문 ................................................................................................266

5.1.1.2 지역 변수의 유효 범위 .....................................................................................270

5.1.1.3 리터럴에도 적용되는 타입 ..............................................................................271

5.1.1.4 특성 .......................................................................................................................271

5.1.2 연산자 ..................................................................................................................................280

5.1.2.1 시프트 연산자 .....................................................................................................280

5.1.2.2 비트 논리 연산자 ...............................................................................................282

5.1.2.3 연산자 우선순위 ................................................................................................283

5.1.3 예약어 ..................................................................................................................................284

5.1.3.1 연산 범위 확인: checked, unchecked .......................................................284

5.1.3.2 가변 매개변수: params ....................................................................................286

5.1.3.3 Win32 API 호출: extern ...................................................................................287

5.1.3.4 안전하지 않은 컨텍스트: unsafe ...................................................................289

5.1.3.5 참조 형식의 멤버에 대한 포인터: fixed .......................................................290

5.1.3.6 스택을 이용한 값 형식 배열: stackalloc ......................................................292

정리 ...........................................................................................................................................................293

목·차

책2.indb 11 2015-07-27 오전 10:41:53

Page 11: 시작하세요! C# 6.0 프로그래밍 : 기본 문법부터 실전 예제까지

5.2 프로젝트 구성 ..............................................................................................................................293

5.2.1 다중 소스코드 파일 ..........................................................................................................296

5.2.2 라이브러리 ..........................................................................................................................298

5.2.2.1 csc.exe로 라이브러리 생성 및 사용하기 ....................................................298

5.2.2.2 비주얼 스튜디오에서 라이브러리 생성 및 사용하기 ................................300

5.2.3 응용 프로그램 구성 파일: app.config .........................................................................303

5.2.3.1 supportedRuntime .............................................................................................304

5.2.3.2 appSettings .........................................................................................................308

5.2.4 디버그 빌드와 릴리즈 빌드 ............................................................................................311

5.2.4.1 DEBUG, TRACE 전처리 상수 ........................................................................315

5.2.4.2 Debug 타입과 Trace 타입 ..............................................................................316

5.2.5 플랫폼(x86, x64, AnyCPU) 선택 .................................................................................319

5.2.6 버전 관리 ............................................................................................................................320

5.2.6.1 어셈블리의 버전과 이름 ..................................................................................321

5.2.6.2 공개키 토큰과 어셈블리 서명 ........................................................................322

5.2.6.3 전용 어셈블리, 전역 어셈블리 .......................................................................325

5.3 예외 .................................................................................................................................................329

5.3.1 예외 타입 ............................................................................................................................331

5.3.2 예외 처리기 ........................................................................................................................332

5.3.3 호출 스택 ............................................................................................................................337

5.3.4 예외 발생 ............................................................................................................................339

5.3.5 사용자 정의 예외 타입 ....................................................................................................341

5.3.6 올바른 예외 처리 ..............................................................................................................342

5.4 힙과 스택 .......................................................................................................................................346

5.4.1 스택 ......................................................................................................................................346

5.4.1.1 스택 오버플로 .....................................................................................................349

5.4.1.2 재귀 호출 .............................................................................................................350

5.4.2 힙 ..........................................................................................................................................352

5.4.2.1 박싱 / 언박싱 .....................................................................................................352

목·차

12

책2.indb 12 2015-07-27 오전 10:41:54

Page 12: 시작하세요! C# 6.0 프로그래밍 : 기본 문법부터 실전 예제까지

5.4.2.2 가비지 수집기 .....................................................................................................354

5.4.2.3 전체 가비지 수집 ...............................................................................................359

5.4.2.4 대용량 객체 힙 ...................................................................................................359

5.4.2.5 자원 해제 .............................................................................................................360

5.4.2.6 소멸자 ...................................................................................................................364

정리 ...........................................................................................................................................................370

06장

BCL(Base Class Library) ........................................................................................................372

6.1 시간 .................................................................................................................................................373

6.1.1 System.DateTime .............................................................................................................374

6.1.2 System.TimeSpan ............................................................................................................377

6.1.3 System.Diagnostics.Stopwatch ...................................................................................378

6.2 문자열 처리 ..................................................................................................................................378

6.2.1 System.String ....................................................................................................................378

6.2.2 System.Text.StringBuilder .............................................................................................386

6.2.3 System.Text.Encoding ...................................................................................................388

6.2.4 System.Text.RegularExpressions.Regex .................................................................389

6.3 직렬화/역직렬화 .........................................................................................................................392

6.3.1 System.BitConverter .......................................................................................................393

6.3.2 System.IO.MemoryStream ............................................................................................395

6.3.3 System.IO.StreamWriter / System.IO.StreamReader ...........................................398

6.3.4 System.IO.BinaryWriter / System.IO.BinaryReader ..............................................399

6.3.5 System.Runtime.Serialization.Formatters.Binary.BinaryFormatter ...................401

6.3.6 System.Xml.Serialization.XmlSerializer ......................................................................403

6.3.7 System.Runtime.Serialization.Json.DataContractJsonSerializer .......................405

목·차

13

책2.indb 13 2015-07-27 오전 10:41:55

Page 13: 시작하세요! C# 6.0 프로그래밍 : 기본 문법부터 실전 예제까지

6.4 컬렉션 .............................................................................................................................................407

6.4.1 System.Collections.ArrayList........................................................................................407

6.4.2 System.Collections.Hashtable .....................................................................................410

6.4.3 System.Collections.SortedList .....................................................................................413

6.4.4 System.Collections.Stack ..............................................................................................413

6.4.5 System.Collections.Queue ............................................................................................415

6.5 파일 .................................................................................................................................................416

6.5.1 System.IO.FileStream......................................................................................................416

6.5.2 System.IO.File / System.IO.FileInfo ............................................................................421

6.5.3 System.IO.Directory / System.IO.DirectoryInfo ......................................................423

6.5.4 System.IO.Path .................................................................................................................426

6.6 스레딩 .............................................................................................................................................428

6.6.1 System.Threading.Thread ............................................................................................431

6.6.2 System.Threading.Monitor ............................................................................................439

6.6.3 System.Threading.Interlocked ....................................................................................448

6.6.4 System.Threading.ThreadPool ...................................................................................449

6.6.5 System.Threading.EventWaitHandle .........................................................................451

6.6.6 비동기 호출 ........................................................................................................................455

6.6.7 System.Delegate의 비동기 호출 ..................................................................................459

6.7 네트워크 통신 ..............................................................................................................................462

6.7.1 System.Net.IPAddress ...................................................................................................464

6.7.2 포트 ......................................................................................................................................466

6.7.3 System.Net.IPEndPoint ..................................................................................................468

6.7.4 System.Net.Dns ................................................................................................................468

6.7.5 System.Net.Sockets.Socket .........................................................................................472

6.7.5.1 UDP 소켓 .............................................................................................................475

6.7.5.2 TCP 소켓 .............................................................................................................483

목·차

14

책2.indb 14 2015-07-27 오전 10:41:56

Page 14: 시작하세요! C# 6.0 프로그래밍 : 기본 문법부터 실전 예제까지

6.7.5.3 TCP 서버 개선 – 다중 스레드와 비동기 통신 .........................................487

6.7.5.4 HTTP 통신 ...........................................................................................................492

6.7.6 System.Net.HttpWebRequest.......................................................................................497

6.7.7 System.Net.WebClient ....................................................................................................497

6.8 데이터베이스 ..............................................................................................................................498

6.8.1 마이크로소프트 SQL 서버 ..............................................................................................499

6.8.1.1 실습용 데이터베이스 준비 ..............................................................................504

6.8.1.2 SQL 쿼리 .............................................................................................................510

6.8.2 ADO.NET 데이터 제공자 ................................................................................................517

6.8.2.1 System.Data.SqlClient.SqlConnection ..........................................................518

6.8.2.2 System.Data.SqlClient.SqlCommand ............................................................520

6.8.2.3 System.Data.SqlClient.SqlDataReader .........................................................523

6.8.2.4 System.Data.SqlClient.SqlParameter ............................................................525

6.8.2.5 System.Data.SqlClient.SqlDataAdapter ........................................................528

6.8.3 데이터 컨테이너 ................................................................................................................529

6.8.3.1 일반 닷넷 클래스 ...............................................................................................529

6.8.3.2 System.Data.DataSet ........................................................................................534

6.8.3.3 Typed DataSet ...................................................................................................540

6.8.4 데이터베이스 트랜잭션 ...................................................................................................548

6.9 리플렉션 ........................................................................................................................................551

6.9.1 AppDomain과 Assembly ...............................................................................................556

6.9.2 Type과 리플렉션 ..............................................................................................................558

6.9.3 리플렉션을 이용한 확장 모듈 구현 ..............................................................................563

6.10 기타 ................................................................................................................................................568

6.10.1 윈도우 레지스트리 .........................................................................................................568

6.10.2 BigInteger ........................................................................................................................570

6.10.3 IntPtr ..................................................................................................................................571

목·차

15

책2.indb 15 2015-07-27 오전 10:41:56

Page 15: 시작하세요! C# 6.0 프로그래밍 : 기본 문법부터 실전 예제까지

07장

C# 2.0 ...................................................................................................................................................575

7.1 제네릭 .............................................................................................................................................575

7.1.1 형식 매개변수에 대한 제약 조건 ..................................................................................582

7.1.2 BCL에 적용된 제네릭 ......................................................................................................588

7.2 ?? 연산자 .....................................................................................................................................590

7.3 default 예약어 .............................................................................................................................590

7.4 yield return/break ....................................................................................................................592

7.5 부분(partial) 클래스 ...................................................................................................................597

7.6 nullable 형식 ...............................................................................................................................598

7.7 익명 메서드 ..................................................................................................................................600

7.8 정적 클래스 ..................................................................................................................................602

08장

C# 3.0 ...................................................................................................................................................604

8.1 var 예약어 ....................................................................................................................................604

8.2 자동 구현 속성 ............................................................................................................................606

8.3 객체 초기화 ..................................................................................................................................607

8.4 컬렉션 초기화 ..............................................................................................................................610

8.5 익명 타입 .......................................................................................................................................612

8.6 부분 메서드 ..................................................................................................................................613

8.7 확장 메서드 ..................................................................................................................................615

8.8 람다 식 ...........................................................................................................................................618

목·차

02C#

고급 문법

PART

16

책2.indb 16 2015-07-27 오전 10:41:57

Page 16: 시작하세요! C# 6.0 프로그래밍 : 기본 문법부터 실전 예제까지

8.8.1 코드로서의 람다 식 ..........................................................................................................618

8.8.1.1 람다 식을 위한 전용 델리게이트 ...................................................................620

8.8.1.2 컬렉션과 람다 식 ...............................................................................................622

8.8.2 데이터로서의 람다 식 ......................................................................................................627

8.9 LINQ ................................................................................................................................................630

8.9.1 where, orderby, group by, join ..................................................................................634

8.9.2 표준 쿼리 연산자 ..............................................................................................................641

8.9.3 일관된 데이터 조회 ..........................................................................................................646

09장

C# 4.0 ...................................................................................................................................................649

9.1 선택적 매개변수와 명명된 인자 ...........................................................................................650

9.2 dynamic 예약어 .........................................................................................................................652

9.2.1 리플렉션 개선 ....................................................................................................................655

9.2.2 덕 타이핑 ............................................................................................................................656

9.2.3 동적 언어와의 타입 연동 ................................................................................................657

10장

C# 5.0 ...................................................................................................................................................661

10.1 호출자 정보 ...............................................................................................................................662

10.2 비동기 호출 ...............................................................................................................................663

10.2.1 닷넷 4.5 BCL에 추가된 Async 메서드 ..................................................................668

10.2.2 Task, Task<TResult> 타입 ..........................................................................................671

10.2.3 Async 메서드가 아닌 경우의 비동기 처리 .............................................................674

10.2.4 비동기 호출의 병렬 처리 .............................................................................................675

목·차

17

책2.indb 17 2015-07-27 오전 10:41:57

Page 17: 시작하세요! C# 6.0 프로그래밍 : 기본 문법부터 실전 예제까지

11장

C# 6.0 ...................................................................................................................................................680

11.1 C# 3.0에 소개된 자동 구현 속성의 초기화 구문 추가 .............................................681

11.2 람다 식을 이용한 메서드, 속성 및 인덱서 정의 ..........................................................683

11.3 using static 구문을 이용한 타입명 생략........................................................................685

11.4 null 조건 연산자 ......................................................................................................................689

11.5 문자열 내에 식을 포함 ..........................................................................................................692

11.6 nameof 연산자 ........................................................................................................................694

11.7 Dictionary 타입의 인덱스 초기화 .....................................................................................698

11.8 예외 필터 ...................................................................................................................................699

11.9 catch/finally 블록 내에서 await 사용 가능 ...................................................................706

11.10 컬렉션 초기화 구문에 확장 메서드로 정의한 Add 지원.........................................707

11.11 #pragma의 “CS” 접두사 지원..........................................................................................709

11.12 재정의된 메서드의 선택 정확도를 향상 ........................................................................710

목·차

18

책2.indb 18 2015-07-27 오전 10:41:57

Page 18: 시작하세요! C# 6.0 프로그래밍 : 기본 문법부터 실전 예제까지

A _ 6.0 Language Specification Version 6.0 문서 ............................................716

B _ C# 6.0 연산자와 문장 부호 ...........................................................................................717

C _ C# 6.0 예약어 ........................................................................................................................720

D _ ASCII 코드.................................................................................................................................722

E _ 프로그래밍 기본 지식 .........................................................................................................724

E.1 하드웨어 관련 용어 .........................................................................................................724

E.1.1 중앙 처리 장치(CPU) ...........................................................................................724

E.1.2 레지스터(Register) ...............................................................................................725

E.1.3 x86, x64 .................................................................................................................725

E.1.4 멀티 CPU와 멀티 코어 ........................................................................................725

목·차

http://www.sysnet.pe.kr/2/0/2923 및 출판사의

공식 홈페이지를 통해 내용이 모두 공개돼 있으니 참고하자.

03닷넷 응용 프로그램

PART

04부록

PART

19

책2.indb 19 2015-07-27 오전 10:41:58

Page 19: 시작하세요! C# 6.0 프로그래밍 : 기본 문법부터 실전 예제까지

E.2 운영체제 관련 용어 .........................................................................................................726

E.2.1 도스(DOS) ..............................................................................................................726

E.2.2 윈도우 운영체제....................................................................................................727

E.2.3 멀티 태스킹/ 다중 프로세스 ..............................................................................728

E.2.4 Win32 응용 프로그램 인터페이스(API) ...........................................................729

E.2.5 윈도우 응용 프로그램 ..........................................................................................730

E.2.6 32비트 응용 프로그램 .........................................................................................731

E.2.7 64비트 응용 프로그램 .........................................................................................732

E.2.8 윈도우 이외의 운영체제 .....................................................................................732

E.3 프로그래밍 용어 ...............................................................................................................733

E.3.1 기계어 ......................................................................................................................733

E.3.2 어셈블리어, 소스코드, 컴파일 ...........................................................................734

E.3.3 컴파일러, 링커, 빌드 ...........................................................................................734

E.3.4 인터프리터 언어 ..........................................................................................................735

E.3.5 저급/고급 프로그래밍 언어 ...............................................................................736

E.3.6 네이티브 언어 ........................................................................................................736

E.3.7 프로세스 가상 머신(VM) .....................................................................................736

E.3.8 가상 머신 지원 언어 ............................................................................................738

F _ 참고 자료 ....................................................................................................................................739

목·차

20

책2.indb 20 2015-07-27 오전 10:41:58

Page 20: 시작하세요! C# 6.0 프로그래밍 : 기본 문법부터 실전 예제까지

01C#

책2.indb 21 2015-07-27 오전 10:41:59

Page 21: 시작하세요! C# 6.0 프로그래밍 : 기본 문법부터 실전 예제까지

이 책은 다음과 같은 독자를 대상으로 한다.

1 _ 컴퓨터 관련 학과에 재학 중인 학생

2 _ C# 언어의 발전을 따라가지 못한 경력 개발자

3 _ 다른 언어를 공부한 개발자

전체적으로는 1번 독자를 대상으로 하지만 가능한 한 2번과 3번에 해당하는 독자에게도

도움이 되도록 내용을 구성했다. 각 장의 내용을 요약하면 다음과 같은데, 잠시 읽어보면

서 자신에게 필요할 만한 내용이 있는지 파악해 보자.

1부

C#의 기본 문법을 다룬다. 이미 C# 언어를 배운 경험이 있다면 1부는 건너뛰어도 좋다.

■ 1장: 닷넷 프레임워크 설명

■ 2장: C# 개발 환경 준비

■ 3장: C# 언어의 기본적인 문법

■ 4장: C# 언어의 핵심: 클래스

■ 5장: 3장에서 설명하기에는 빠르고 4장의 클래스와는 무관한 나머지 C# 문법

■ 6장: C# 프로그램에서 자주 사용되는 클래스 설명

이·책·의·구·성

책2.indb 22 2015-07-27 오전 10:41:59

Page 22: 시작하세요! C# 6.0 프로그래밍 : 기본 문법부터 실전 예제까지

2부

C# 2.0, 3.0, 4.0, 5.0, 6.0에 추가된 문법을 차례대로 다룬다. 2부의 내용을 공부하지 않아도 충분히 C# 프로

그램을 만들 수 있다. 하지만 2부의 내용을 학습하고 나면 자신의 생각을 좀 더 자유롭게 프로그램으로 표

현할 수 있다.

■ 7장: C# 2.0에 추가된 문법

■ 8장: C# 3.0에 추가된 문법

■ 9장: C# 4.0에 추가된 문법

■ 10장: C# 5.0에 추가된 문법

■ 11장: C# 6.0에 추가된 문법

3부

C# 언어로 만드는 다양한 응용 프로그램 유형을 설명하며, 이 내용은 책에 포함되지 않고 별도로 “http://

www.sysnet.pe.kr/2/0/2923” 페이지에 PDF로 공개했으니 참고할 수 있다.

■ 12장: 윈도우 폼, WPF, 서비스, 웹 폼, 윈도우 폰 응용 프로그램의 제작 방법

■ 13장: 실습 – PPT를 제어하는 윈도우 폰 응용 프로그램

전산을 전공하지 않은 독자를 위해 부록 “E. 프로그래밍 기본 지식”이라는 절을 별도로

마련했다. 저자의 개인적인 바람으로는 그 정도의 지식은 미리 학습한 상태에서 이 책을

읽어보길 권하지만 꼭 그래야만 하는 것은 아니다. 시간이 허락되거나 이 책을 읽는 과정

에서 코딩이 무료해지면 한번씩 읽어보는 것도 좋겠다.

프로그래밍 언어를 설명할 때는 “닭이 먼저냐, 계란이 먼저냐”하는 식의 난관에 빠지곤 한

다. 즉, A라는 내용을 설명하려면 B라는 내용이 선행돼야 하는데, B를 설명하다 보면 A의

이·책·의·구·성

책2.indb 23 2015-07-27 오전 10:42:00

Page 23: 시작하세요! C# 6.0 프로그래밍 : 기본 문법부터 실전 예제까지

내용이 필요할 때가 있다. 이 책을 읽는 동안에도 그런 경우가 가끔씩 나올 수 있다. 당장

은 눈에 보이지 않는 개념이겠지만 차근차근 한 걸음씩 나아가다 보면 실체가 여러분의

머릿속에도 자리 잡을 것이다.

아울러, 이 책을 공부하면서 궁금한 사항이 있다면 다음의 게시판에 글을 남길 수 있다.

C# 질문/답변

http://www.sysnet.pe.kr/3/0

필자는 직장인이기 때문에 답변은 주로 밤 시간에 달릴 수 있음을 이해해 주길 바란다.

그 밖에 혹시 이 책을 보면서 오탈자 및 잘못된 정보를 발견한다면 역시 위의 게시판을

이용해 공유할 수 있다. 이렇게 취합된 오탈자 정보와 이 책과 관련된 기타 자료들은 다

음의 게시물에 정리된다.

소스코드, 오탈자 정보, 다이어그램 원본 PPT 파일

http://www.sysnet.pe.kr/2/0/2923

위의 게시물에는 책에 사용된 예제의 소스코드 및 다이어그램을 그리기 위해 사용된 원

본 PPT 파일도 함께 공개돼 있으니 관심 있으신 분은 참조할 수 있다.

마지막으로, IT 서적을 구매하기 전 고민되는 사항이 있다면 과연 이 책이 언제까지 유효

할 수 있는가 하는 점이다. C# 언어는 철저하게 하위 호환성이 보장되므로 이 책은 C# 언

어가 살아 있는 한 책의 내용에서 바뀔 점은 거의 없으리라 예상된다. 그럼, 도대체 이 책

의 내용이 어느 정도까지 최신 버전을 다루고 있는지 궁금할 것이다. 이 책을 마무리하는

시점에 마이크로소프트의 비주얼 스튜디오 2015(Visual Studio 2015)가 출시됐으므로 적

어도 이 책의 내용은 비주얼 스튜디오 2015의 시대까지는 최신 서적으로 분류해도 좋다.

이·책·의·구·성

책2.indb 24 2015-07-27 오전 10:42:00

Page 24: 시작하세요! C# 6.0 프로그래밍 : 기본 문법부터 실전 예제까지

1장.�들어가면서25

1장은 닷넷 프레임워크 환경에 대한 전반적인 개요를 다룬다. 개요의 특성상 전체적인 구성을 다루기

때문에 프로그래밍 언어를 처음 배우는 이들에게 1장의 내용은 결코 쉽지 않다. 따라서 다른 개발 언

어를 배워본 적이 없는 독자라면 2장의 개발 환경 구성으로 바로 넘어갈 것을 권장한다. 이후 C# 프로

그래밍에 익숙해졌을 때 1장으로 돌아와서 읽으면 개발 환경에 대해 좀더 폭넓게 이해할 수 있다.

1.1 닷넷 프레임워크

닷넷 프레임워크(.NET Framework)는 2002년에 마이크로소프트에서 발표한 응용 프로그램 개발 환

경으로서 프로세스 가상 머신에 속한다. 일반적인 네이티브 언어로 만들어진 프로그램들이 운영체제

에서 곧바로 실행되는 것과는 달리, 닷넷 프레임워크를 기반으로 만들어진 응용 프로그램은 반드시 닷

넷 프레임워크가 미리 설치된 환경에서만 실행된다.

윈도우 서버 2003부터 운영체제를 설치할 때 기본적으로 1.1 버전이 포함되는 것을 시작으로 윈도우

10에서는 닷넷 프레임워크 4.6이 기본적으로 탑재돼 있다.

클라이언트 운영체제는 윈도우 비스타부터 닷넷 프레임워크 3.0 버전이 설치돼 있다. 물론 상위 버전의 닷

넷 프레임워크는 설치 파일로도 제공되므로 원한다면 인터넷에서 내려받아 직접 설치하는 것도 가능하다.

01들어가면서

책2.indb 25 2015-07-27 오전 10:42:00

Page 25: 시작하세요! C# 6.0 프로그래밍 : 기본 문법부터 실전 예제까지

261부�_�C#

닷넷 프레임워크를 설치하면 가상 머신 역할을 하는 CLR(Common Language Runtime) 구성요소

가 실행될 수 있는 환경이 윈도우 운영체제에 마련된다. CLR은 프로세스(EXE)가 실행되면 메모리에

함께 적재돼 실행된다. 닷넷 프로그램은 외형상 EXE/DLL로 기존의 프로그램과 동일한 구조다. 하지

만 내부적으로는 CLR 구성요소가 로드돼 실행되고, 그 CLR이 EXE/DLL에 함께 저장돼 있는 닷넷 코

드를 실행한다.

이번에는 C# 입장에서 닷넷 프레임워크를 설명해 보자. C# 컴파일러는 소스코드를 기계어가 아닌

IL(Intermediate Language)이라고 하는 중간 언어로 EXE/DLL 파일 내부에 생성한다. 또한 프로그

램이 시작하자마자 CLR을 로드하는 코드를 자동으로 EXE 파일 내부에 추가한다. 따라서 사용자가

C#으로 개발된 애플리케이션을 실행하면 내부적으로 CLR이 먼저 로드된다. 이어서 CLR은 EXE 파일

내에 있는 중간 언어(IL: Intermediate Language) 코드를 로드해서 본격적인 실행 단계에 들어선다.

이 작업이 그림 1.1에 요약돼 있다.

그림 1.1: IL 코드를 실행하는 CLR

C#�소스코드

빌드

실행

CLR�로더

중간�언어(IL�Code)

1.�컴파일러에�의해�삽입된� CLR�로더�코드가�실행되고,

2.��CLR�로드�후�사용자의�� 중간�언어�코드를�실행

EXE�파일

그럼 지금부터 닷넷 프레임워크와 관련된 용어를 좀 더 자세히 알아보자.

1.1.1 닷넷 호환 언어

CLR에 의해 실행되는 중간 언어는 어느 하나의 프로그래밍 언어에 종속된 것은 아니다. 어떤 언어의

컴파일러든 결과물을 중간 언어로 생성해 낸다면 CLR이 그것을 실행할 수 있다. 이처럼 중간 언어로

번역하는 언어를 닷넷 호환 언어(.NET-Compliant Language)라고 하며, C# 언어는 단지 그러한 언

어 중 하나에 불과하다.

닷넷 호환 언어는 IL(중간 언어) 코드의 결과물을 공유하기 때문에 상호 호출이 가능하다. 예를 들어, C#

으로 만든 클래스를 F#에서 사용할 수 있고, 심지어 다른 언어로 만든 클래스까지도 상속받을 수 있다.

책2.indb 26 2015-07-27 오전 10:42:01

Page 26: 시작하세요! C# 6.0 프로그래밍 : 기본 문법부터 실전 예제까지

1장.�들어가면서27

현재, 마이크로소프트에 의해 공식적으로 제공되는 닷넷 호환 언어는 C#, Visual Basic .NET, F#,

C++/CLI가 있다. 여기에 더해 기존의 COBOL, Lisp, Python, PHP, Ruby 등의 언어도 닷넷 환경

에서 실행될 수 있게 중간 언어를 산출하는 버전들이 발표됐으며 원한다면 웹에서 내려받아 사용할 수

있다.

1.1.2 공통 중간 언어(CIL: Common Intermediate Language)

자바의 VM에서는 중간 언어를 특별히 바이트 코드(Byte code)라고 한다. 이와 마찬가지로 닷넷의

CLR에서는 이를 CIL이라고 하며, 보통은 줄여서 IL 코드, 또는 MSIL 코드라고 한다. 이는 CPU에 독

립적인 결과물로서, 모든 닷넷 호환 언어는 소스코드를 IL 코드로 컴파일하고, CLR이 실행될 때 IL 코

드를 CPU의 기계어로 최종 번역한다.

특이하게 IL 코드에는 자체적인 프로그래밍 언어 문법이 있으며, ILASM.EXE라는 전용 컴파일러도

있다. 예를 들어, C#으로 다음과 같은 프로그램을 작성해

예제 1.1 CIL 확인용 예제

class Program

{

static void Main(string[] args)

{

int a = 5;

int b = 6;

int c = a + b;

}

}

C# 컴파일러로 빌드하면 중간 언어인 IL 코드로 변환된다. IL 코드는 가상 머신에서 실행된다는 의미

에서 일종의 기계어와 유사하다. 기계어와 일대일 대응되는 어셈블리 언어가 있는 것처럼 IL 코드도

일대일 대응되는 IL 언어가 따로 있다. 아래는 위의 C# 프로그램을 IL 언어로 변환한 것이다.

.assembly ConsoleApplication2

{

}

.module ConsoleApplication2.exe

책2.indb 27 2015-07-27 오전 10:42:02

Page 27: 시작하세요! C# 6.0 프로그래밍 : 기본 문법부터 실전 예제까지

281부�_�C#

.class private auto ansi beforefieldinit Program extends [mscorlib]System.Object

{

.method private hidebysig static void Main(string[] args) cil managed

{

.entrypoint

.maxstack 2

.locals init ([0] int32 a, [1] int32 b, [2] int32 c)

IL_0000: nop

IL_0001: ldc.i4.5

IL_0002: stloc.0

IL_0003: ldc.i4.6

IL_0004: stloc.1

IL_0005: ldloc.0

IL_0006: ldloc.1

IL_0007: add

IL_0008: stloc.2

IL_0009: ret

}

}

실제로 위의 IL 소스코드를 닷넷 프레임워크에 포함된 ilasm.exe로 컴파일하면 C#에서와 동일한 프

로그램이 생성된다.

이러한 특징 덕분에 대체적으로 닷넷 호환 언어는 두 가지 방법으로 구현되고 있다. 예를 들어,

COBOL 언어를 닷넷용으로 만든다고 가정해 보자. 첫 번째는 C# 언어처럼 COBOL 소스코드에서 곧

바로 중간 언어를 생성하도록 만들 수 있다. 두 번째는 COBOL 소스코드를 일단 IL 소스코드로 변환

한 다음 그것을 컴파일할 수 있는 ilasm.exe의 도움을 받아 실행 파일을 만드는 유형도 있다.

1.1.3 공용 타입 시스템

닷넷 호환 언어가 지켜야 할 타입(Type)의 표준 규격을 정의한 것이 공용 타입 시스템(CTS:

Common Type System)이다. 만약 여러분이 새로운 언어를 만들어 닷넷 프레임워크 상에서 실행하

고 싶다면 CTS 규약을 만족하는 한도 내에서만 구현할 수 있다. 예를 들어, CTS 에서는 클래스 상속

을 하나만 받을 수 있도록 정의하고 있다. 따라서 직접 닷넷 호환 언어를 만든다면 클래스의 다중 상속

을 지원하도록 만들 수는 없다. 실제로 중간 언어에서는 다중 상속과 관련된 어떠한 IL 코드 표현도 제

공하지 않는다. 즉, 닷넷 호환 언어는 CTS의 한계를 넘어서 구현할 수 없다.

책2.indb 28 2015-07-27 오전 10:42:02

Page 28: 시작하세요! C# 6.0 프로그래밍 : 기본 문법부터 실전 예제까지

1장.�들어가면서29

또 한 가지 특징으로는, 닷넷 호환 언어가 CTS에서 정의된 모든 규격을 구현할 필요도 없다는 점이다.

예를 들어, CTS에서는 타입의 접근성에 대해 public, private, ...... 등으로 나누고 있지만 여러분이

만드는 닷넷 호환 언어에서는 public만 지원하도록 만드는 것이 가능하다. 언어에서 필요하지 않다면

굳이 CTS에서 정의한 접근성에 모두 대응하지 않아도 된다.

C#과 Visual Basic .NET 언어는 CTS가 정의한 타입 시스템의 일부를 자신들의 언어 사양에 맞게 구

현하고 있다. 만약, CTS 전체를 활용해 프로그램을 만들고 싶다면 IL 언어를 사용하거나 CTS 전체 규

격을 표현한 언어를 새롭게 만들어야 한다.

1.1.4 공용 언어 사양

닷넷 호환 언어가 지켜야 할 최소한의 언어 사양을 정의한 것이 공용 언어 사양(CLS: Common

Language Specification)이다. 직접 닷넷 호환 언어를 만들고 싶다면 CTS 전체를 구현해야 할 필요

는 없지만 적어도 CLS에 명시된 사양만큼은 완벽하게 구현해야 한다.

예를 들어, C#에서는 부호 없는(unsigned) 형식을 지원한다. 이는 CTS에 정의돼 있기 때문에 C#에

서도 정의할 수 있는 것이다. 하지만 CLS에서는 unsigned 타입을 강제화하지 않았다. 따라서 C#에

서 unsigned 타입이 구현됐다고 해서 다른 언어에서도 unsigned 타입이 구현됐다고 보장할 수 없다.

그런데 왜 이것이 문제되는 것일까?

닷넷 호환 언어끼리는 서로 사용할 수 있고 상속도 받을 수 있다는 사실을 떠올려 보자. C# 언어에서

unsigned 타입을 사용하는 함수를 정의했다고 가정했을 때, unsigned를 지원하지 않는 다른 언어에

서는 이 함수를 사용할 때 호환성 문제가 발생한다. 따라서 서로 다른 언어를 섞어서 프로그램을 만들

어야 한다면 외부에서 사용할 기능에 대해서는 CLS를 준수해야 한다.

CLS는 두 가지 측면에서 의미가 있다. 하나는 모든 닷넷 호환 언어가 CLS에서 정의한 사양만큼은 구

현해야 한다는 것이고, 다른 하나는 닷넷 호환 언어끼리 호출해야 하는 경우에는 그 기능에 한해서

CLS를 만족시키도록 작성해야 한다는 것이다.

CLS, CTS와 닷넷 호환 언어의 관계를 다이어그램으로 정리해 보면 다음과 같다.

책2.indb 29 2015-07-27 오전 10:42:03

Page 29: 시작하세요! C# 6.0 프로그래밍 : 기본 문법부터 실전 예제까지

301부�_�C#

그림 1.2: CTS와 CLS

CTS

VB.NETC# CLS

1.1.5 메타데이터

일반적인 정의로는 데이터를 위한 데이터를 메타데이터(Metadata)라고 한다. 예를 들어, 그림 파일에

서는 그림을 나타내는 컬러 값이 사진을 구성하는 “데이터”가 된다. 윈도우의 탐색기에서 이러한 그림

파일의 속성 창을 띄워 보면 또 다른 데이터가 있는 것을 확인할 수 있다. 그림 1.3에서처럼 그림은 너

비와 높이, 해상도 등의 데이터를 담고 있는데, 이는 “원본 사진 데이터”를 위한 데이터에 해당하고 이

를 메타데이터라고 한다.

그림 1.3: 파일의 메타데이터

책2.indb 30 2015-07-27 오전 10:42:03

Page 30: 시작하세요! C# 6.0 프로그래밍 : 기본 문법부터 실전 예제까지

1장.�들어가면서31

프로그래밍에서 메타데이터의 정확한 의미를 이해하려면 기존 네이티브 언어의 특징을 먼저 이해해야

한다. 예를 들어, Visual C++로 다음과 같은 2개의 클래스를 정의한 경우

클래스 멤버 반환값 인자

DrawRectangle 함수 없음 4개의 integer 타입

Line 함수 없음 2개의 integer 타입

MathAbs 함수 double 타입 1개의 double 타입

Max 함수 integer 타입 2개의 integer 타입

이 소스코드를 컴파일해서 생성한 실행 파일로부터는 개발자가 만든 클래스의 어떠한 정보도 알아낼

수 없다. 왜냐하면 Visual C++ 컴파일러는 위와 같은 클래스 정보를 설명하는 메타데이터를 생성하

지 않기 때문이다. 즉, 프로그래밍 언어에서는 개발자가 구현한 코드가 데이터에 해당하고, 해당 코드

의 성격을 설명해 주는 별도의 데이터를 메타데이터라고 한다.

CLR에서 동작하는 실행 파일은 완전하게 자기 서술적인(self-descriptive) 메타데이터를 제공하며,

외부에서는 이러한 정보를 리플렉션(Reflection)이라고 하는 기술을 통해 사용할 수 있다. 따라서 직

접 닷넷 호환 언어를 만들어 컴파일러를 제공한다면 중간 언어 코드는 물론이고 그에 대한 메타데이터

도 함께 생성되게끔 만들어야 한다. 마찬가지로 C# 언어로 컴파일된 EXE/DLL 파일에도 메타데이터

가 담겨 있다. 다른 사람이 만든 EXE/DLL 파일에서 어떤 클래스와 메서드가 제공되는지 확인하고 싶

다면 이 메타데이터를 통해 알 수 있다.

1.1.6 어셈블리, 모듈, 매니페스트

C#으로 프로그램을 하는 경우, 대개 EXE 또는 DLL 파일을 만들게 된다. 닷넷에서는 이러한 실행 파

일을 어셈블리(Assembly)라고 한다.

기계어와 1:1 대응되는 프로그래밍 언어인 어셈블리와 이름이 같으므로 혼동할 수 있지만 닷넷 프로그래밍

에서 특별한 언급이 없다면 어셈블리는 실행 파일(EXE, DLL)을 의미한다.

어셈블리는 1개 이상의 모듈(Module)로 구성되는데, 이때 모듈 하나당 한 개의 파일이 대응된다. 그

런데 여러 개의 파일이 하나의 어셈블리를 구성하고 있다면 그 목록을 관리하는 데이터가 있어야 하지

않을까? 이를 위해 모듈 중의 하나는 반드시 다른 모듈의 목록을 관리하는 매니페스트(Manifest) 데

이터를 담고 있어야 한다. 다음은 3개의 모듈 파일로 구성된 어셈블리다.

책2.indb 31 2015-07-27 오전 10:42:04

Page 31: 시작하세요! C# 6.0 프로그래밍 : 기본 문법부터 실전 예제까지

321부�_�C#

그림 1.4: 어셈블리 = (모듈 + 매니페스트) + n개의 모듈……

어셈블리

메타데이터 메타데이터

메타데이터

모듈C 모듈A

모듈B

매니페스트

매니페스트를 포함하고 있지 않은 모듈은 보통 확장자가 netmodule이고, 매니페스트를 포함하는 경

우에는 확장자가 DLL(또는 EXE)이다. 어셈블리는 그 자체가 “참조 단위”이자 “배포 단위”라는 것에

의미가 있다. 다른 사람이 만든 어셈블리에 구현된 코드를 사용하고 싶다면 매니페스트가 포함된 모듈

및 그와 관련된 모든 모듈을 함께 가지고 있어야 한다.

이론상 어셈블리가 다수의 모듈을 지원하긴 하지만 일반적으로 여러분이 개발하거나 사용하게 될 거

의 모든 어셈블리가 1개의 (EXE/DLL 모듈) 파일로 구성된다. 여러 개의 모듈을 관리하는 것은 번거롭

고 비주얼 스튜디오와 같은 개발 도구에서도 모듈 생성을 지원하지 않기 때문에 다중 모듈을 사용하는

경우는 거의 없다.

1.1.7 공용 언어 기반구조

공용 언어 기반구조(CLI: Common Language Infrastructure)는 마이크로소프트에서 ECMA 표준

으로 제출한 공개 규약이다. CLI는 CTS 명세를 포함하며, 중간 언어에 대한 코드 정의, 메타데이터와

그것을 포함하는 이진 파일(binary file)의 구조까지 표준 사양으로 기술하고 있다. 자바의 VM을 IBM

과 Sun에서 구현한 것처럼, 공개된 CLI 사양은 누구나 가져가서 임의로 구현할 수 있다. 또한 IBM이

만든 JVM 위에서 컴파일된 자바 클래스 파일이 Sun의 JVM 위에서 동작하는 것처럼 CLI 사양을 준수

한 구현체에서 동작하는 닷넷 파일은 또 다른 구현체에서 실행하는 것이 가능하다. 이를 그림으로 표

현하면 다음과 같다.

책2.indb 32 2015-07-27 오전 10:42:04

Page 32: 시작하세요! C# 6.0 프로그래밍 : 기본 문법부터 실전 예제까지

1장.�들어가면서33

그림 1.5: CLI와 CLR의 관계

csc.exe컴파일러

CommonLanguageRuntime(Windows)

Mono(Linux)

vbc.exe컴파일러

fsc.exe컴파일러

CommonIntermediateLanguage

C#소스코드

VB.NET소스코드

F#소스코드

CommonLanguageInfrastructure

1000�00111111�1000

1111�10000000�0001

닷넷�언어는�각�소스코드를�컴파일해�플랫폼�독립적인�공통�중간�언어(CIL)로�변환

CIL�결과물을�각�플랫폼에�구현된CLI�구현체가�번역해�실행

CLI 규격을 마이크로소프트에서 구현한 실체가 바로 CLR이다. 게다가 마이크로소프트에서는 CLI를

외부에서도 쉽게 구현할 수 있게 최소한의 코드로 CLI를 구현한 SSCLI(Shared Source CLI)를 함께

공개했다. 그 외에 모노(Mono) 프레임워크라는 또 다른 CLI 구현체가 오픈소스로 꾸준히 개발되고

있으며, 이 프레임워크는 리눅스, iOS, 안드로이드까지 지원하고 있다.

1.1.8 공용 언어 런타임

공용 언어 런타임(CLR: Common Language Runtime)은 CLI 사양을 따르는 가장 대표적인 VM으

로서 마이크로소프트가 개발해 윈도우 운영체제용으로만 배포되고 있다. CLR에는 두 가지 큰 기능이

있는데, 하나는 중간 언어를 JIT 컴파일러를 이용해 기계어로 변환하는 것이고, 다른 하나는 가비지

수집기(GC: Garbage Collector)를 제공해 동적 메모리 할당 및 회수를 지원하는 것이다.

CLR은 프로세스(EXE) 내에서 공개된 API에 의해 로드될 수 있다. 즉, 윈도우 개발 환경에서 동작하

는 기존 네이티브 응용 프로그램에서 CLR을 내장하는 것이 가능하다. 다음은 이렇게 적용된 몇 가지

예를 보여준다.

■ CLR을 로드하는 w3wp.exe: 윈도우에 포함된 웹 서버인 IIS(Internet Information Services)는 기존의 w3wp.exe 프로

세스에 CLR을 자동으로 로드할 수 있는 기능을 추가했다. 이로써 개발자는 명시적으로 CLR을 로드하는 코드를 작성

하지 않고도 웹 애플리케이션을 닷넷 언어로 만들 수 있다.

책2.indb 33 2015-07-27 오전 10:42:05

Page 33: 시작하세요! C# 6.0 프로그래밍 : 기본 문법부터 실전 예제까지

341부�_�C#

■ CLR을 로드하는 SQL 서버: 마이크로소프트의 SQL 서버는 CLR을 로드해서 내장 프로시저(Stored Procedure)를 작

성할 수 있게 한다. 또한 데이터베이스의 테이블에 포함되는 칼럼의 타입을 닷넷의 클래스로 확장할 수 있다.

■ CLR을 로드하는 인터넷 익스플로러: 웹 브라우저인 IE(Internet Explorer)도 CLR을 로드하기 때문에 닷넷 호환 언어로

만들어진 컨트롤을 웹 브라우저에서 활성화할 수 있다(최근 윈도우 10에 포함된 마이크로소프트 에지(Edge) 브라우저

는 CLR 로드를 지원하지 않는다).

■ CLR을 로드하는 명령어 셸(Shell): 도스 시절의 배치 명령어를 기반으로 한 명령행 셸이 윈도우에서도 제공되지만 기

능 면에서 너무 제한적이다. 마이크로소프트는 닷넷 프레임워크를 출시하면서 파워셸(PowerShell)을 별도로 제공하기

시작했는데, 이 새로운 명령어 해석기에는 CLR이 기본적으로 로드돼 있어 닷넷 용으로 만들어진 명령어를 사용할 수

있다.

CLR 자체를 관리 환경(Managed Environment)이라고도 하고, CLR이 로드되는 프로세스를 기존의

네이티브 프로세스와 구별해 관리 프로세스(Managed Process)라고 한다.

대체로 “관리”라는 단어가 들어가면 CLR 환경과 엮인다고 보면 된다. 닷넷 호환 언어 역시 C/C++ 언어와

같은 네이티브 언어와 구분하는 의미에서 관리 언어(Managed Language)라고 한다.

CLI와 CLR, 닷넷은 보통 구분 없이 사용된다는 점에 유의해야 한다. 예를 들어, C#과 같은 언어는 닷

넷 호환 언어라는 말보다는 CLI 호환 언어라고 불러야 하는 것이 맞다. 단지, CLI 구현체 중에 CLR이

가장 대표적이고, CLR은 닷넷 프레임워크에 포함돼 있으므로 암묵적으로 혼용되는 면이 있다.

1.1.9 닷넷 프레임워크

CLR의 기능만으로는 응용 프로그램을 작성하는 개발자를 만족시킬 수 없다. 마이크로소프트는 CLR

말고도 여러 가지 구성 요소를 함께 만들어 이를 하나의 패키지로 묶어 배포하는데, 이것이 바로 우리

가 자주 들었던 “닷넷 프레임워크”로서, 간단히 줄여 “닷넷”이라고 표현한다.

즉, “닷넷 프레임워크 = CLR + 부가 구성 요소”라고 간단히 정의할 수 있고, 여기서 구성 요소에는 다

음과 같은 것들이 포함된다.

■ BCL(Base Class Library): 마이크로소프트는 특정 기능을 수행하는 타입을 미리 만들어 놓았으며 개발자는 이 기능을

이용해 좀 더 쉽게 응용 프로그램을 개발할 수 있다. 예를 들어, 문자열을 암호화해야 할 때 개발자가 직접 구현할 필요

없이 BCL에서 제공되는 암호화 관련 타입을 이용하면 된다.

■ 부가적인 실행 파일: 마이크로소프트는 닷넷 프레임워크에 기본적으로 C#, VB.NET 컴파일러를 제공하고 있으며, 그

외에도 각종 유틸리티 성격의 실행 파일을 포함시켜 뒀다.

책2.indb 34 2015-07-27 오전 10:42:06

Page 34: 시작하세요! C# 6.0 프로그래밍 : 기본 문법부터 실전 예제까지

1장.�들어가면서35

■ GAC(Global Assembly Cache): GAC는 컴퓨터에서 실행되는 닷넷 응용 프로그램이 어셈블리 파일을 공통적으로 찾

을 수 있는 전역 저장소다. 일반적으로 C:\Windows\assembly 폴더에 위치하고 각종 DLL 파일을 담고 있다.

닷넷 응용 프로그램을 계층상으로 보면 다음과 같다.

그림 1.6: 윈도우와 닷넷 프레임워크

ASP.NET웹�응용�프로그램 Console

응용�프로그램

Windows

IIS

Win32�APICOM+

Windows응용�프로그램

Base�Class�Library

Common�Language�Runtime

VB.NET,C#,C++/CLI,F#,...

닷넷 응용 프로그램은 기존의 모든 윈도우 응용 프로그램에 대응해서 만들 수 있다. 즉, Visual C++

로 만든 네이티브 프로그램이 있다면 닷넷으로도 제작할 수 있다. 다음은 이에 대한 좀 더 세분화된 응

용 프로그램 유형을 보여준다.

응용 프로그램 유형 닷넷 이전 닷넷 응용 프로그램

웹 응용 프로그램 ASP ASP.NET

콘솔 응용 프로그램 Win32 Console Console

윈도우 응용 프로그램 Win32 Windows, MFC Windows Forms, WPF

COM+ 응용 프로그램 COM+ Enterprise Services

윈도우 서비스 NT 서비스 윈도우 서비스

이 책의 후반부에서 위의 응용 프로그램 유형별로 C# 언어를 이용해 간단한 실습을 진행할 것이다.

거의 모든 응용 프로그램에서 여러분은 BCL을 사용하게 된다. 예를 들어, 파일을 만들어야 할 때

Win32 API를 직접 호출하는 것도 가능하지만 BCL을 사용하면 더욱 편리하게 작업할 수 있다. BCL

에는 윈도우 개발자가 필요로 하는 많은 기능이 구현돼 있으므로 틈틈이 BCL을 공부해둘 필요가 있

다. 다음 페이지의 BCL 분류는 방대한 BCL의 일부 단면만을 보여준다.

책2.indb 35 2015-07-27 오전 10:42:07

Page 35: 시작하세요! C# 6.0 프로그래밍 : 기본 문법부터 실전 예제까지

361부�_�C#

그림 1.7: 네임스페이스로 구분한 BCL

System

Runtime

System.Web System.Windows.Forms

System.Drawing

System.XMLSystem.Data

Services

Description

Discovery

Protocols

UI

HTML�Controls

Web�Controls

Caching Security

Form

Drawing2D

XSLTSQLOLEDB

Collections IO Security

Configuration Net Service�Process Interop�Services

Diagnostics Reflection Media Remoting

Globalization Resources CodeDom Serialization

Serialization

Button

Printing

Message�Box

Imaging

XPathSQL�TypesODBC

List�Control

TextConfiguration Session�State

새로운 버전의 닷넷 프레임워크가 출시될 때마다 BCL의 영역은 점점 더 커지고 있다. 그와 함께 배울

것도 많아졌지만 달리 말하면 개발자가 작성해야 할 코드의 규모는 상대적으로 더 줄어들고 있다. 이

책에서는 지면 관계상 모든 BCL을 다룰 수는 없고 이 책을 읽어나가는 데 필요한 수준의 BCL만 살펴

본다.

이처럼 닷넷 응용 프로그램을 만들려면 필연적으로 닷넷 프레임워크의 전반적인 지식을 함께 공부해

야 한다. 그 지식에는 CLR/CLI/CTS/CIL이 포함되며 모든 것을 알아야 할 필요는 없지만 많이 알수록

여러분의 닷넷 프로그램 제작 능력은 더욱 향상될 것이다.

1.1.10 C#과 닷넷 프레임워크의 관계

C#은 닷넷 프레임워크를 기반으로 IL 코드를 생성하는 컴파일러에 불과하므로 이 책에서 배우는 모든

것은 오직 ‘문법적인 요소’만을 제외하고는 닷넷 프레임워크의 영역에 해당한다. C#을 배운다는 것은

곧, 닷넷 프레임워크를 공부한다는 의미다. C#은 여러 도구 중 하나일 뿐 결국엔 닷넷 프레임워크가

여러분의 목표다.

책2.indb 36 2015-07-27 오전 10:42:07

Page 36: 시작하세요! C# 6.0 프로그래밍 : 기본 문법부터 실전 예제까지

1장.�들어가면서37

그런데 왜 굳이 여러분은 C#을 선택했을까? 또는 왜 C#을 선택하는 것이 좋을까? 다른 닷넷 호환 언

어를 선택하는 것이 더 좋지 않을까?

C#이 좋은 이유는 마이크로소프트가 닷넷 프레임워크를 위해 만든 언어이기 때문이다. VB.NET은 기

존 비주얼 베이직(Visual Basic) 개발자가 닷넷 환경으로 좀 더 쉽게 다가설 수 있도록 VB 언어의 기

본 문법을 확장하는 형식으로 발전시켰기 때문에 닷넷을 위해 만들어진 것이 아니다. C++/CLI 역시

동일한 한계를 지니고 있다. C++ 언어를 바탕으로 닷넷용 응용 프로그램을 만들 수 있게 문법을 확장

한 것이다. F# 언어는 어떨까? F#은 마이크로소프트에서 공식적으로 지원하는 닷넷의 함수형 언어다.

즉, 함수형 언어를 통한 문제 풀이 능력을 더하기 위해 만들어진 언어일 뿐 닷넷 프레임워크를 위한 언

어는 아니다.

마이크로소프트는 닷넷을 출시하면서 그것을 가장 잘 표현할 수 있는 언어가 필요했고, 그렇게 해서

새롭게 탄생한 언어가 C#이다. C#은 닷넷을 위해 태어났고 닷넷과 함께 발전해 간다.

닷넷 버전 닷넷의 변화 C#의 변화

1.0 ~ 1.1 최초 버전 C# 1.0 발표

2.0 Generic 제공 Generic, 익명 함수 문법 추가

3.0 ~ 3.5 LINQ, WCF, WPF, WF 표현식, 확장 메서드, 익명 타입을 위한 문법을 추가하고

LINQ 구문을 언어적으로 지원

4.0 DLR(Dynamic Language Runtime) 추가 동적 언어와의 바인딩을 지원하도록 dynamic 예약어 추가

4.5 비동기 지원 비동기를 위한 async/await 예약어 추가

4.6 로슬린(Roslyn) 컴파일러 및 RyuJIT 도입 이전 버전들에서 볼 수 있었던 기능의 추가보다는 코드를

간결하게 유지할 수 있는 문법을 다수 추가

마이크로소프트에서는 닷넷에 새로운 기능이 추가될 때마다 그것을 이용할 수 있는 가장 첫 번째 언어

로 C#을 함께 발전시킨다. 따라서 닷넷 프레임워크를 공부하기에 가장 좋은 언어가 바로 C#인 것이다.

정리

프로그래밍 언어를 어떻게 설명해야 좋을지에 대해서는 의견이 분분하다. 순수하게 문법만 다루느냐?

실질적인 프로그래밍을 위한 수준으로만 문법을 다뤄야 하는가? C#의 경우에는 이 문제가 더욱 복잡

해지는데, 그 근간에 “닷넷 프레임워크”가 존재하기 때문이다. C#의 완벽한 문법 체계를 이해하고 싶

책2.indb 37 2015-07-27 오전 10:42:08

Page 37: 시작하세요! C# 6.0 프로그래밍 : 기본 문법부터 실전 예제까지

381부�_�C#

다면 『The C# Programming Language Fourth Edition』1이라는 책을 권한다. 이 책은 C#을 설계한

앤더스 헤일스버그(Anders Hejlsberg)가 직접 참여해서 쓴 책으로 이보다 더 상세하게 C#의 문법을

다루는 책을 찾을 수 없다. 반대로, “닷넷 프레임워크”를 C# 언어로 공부하고 싶은 독자라면 『CLR via

C#』2이라는 책을 권한다. 닷넷 프레임워크에 대한 제프리 리처(Jeffrey Richter)의 통찰력이 깃든 이

책은 닷넷 개발자라면 누구나 한번쯤은 읽어봐야 할 명서다.

마지막으로, 이 책의 모든 내용이 필자의 머릿속에서 창조됐다고 하면 분명 거짓말일 것이다. C#

언어에 대한 구체적인 내용을 얻을 수 있었던 마이크로소프트의 개발자 웹 사이트(http://msdn.

microsoft.com)는 이 책을 쓰는 데 많은 참고가 됐으며, 필자가 읽었던 C#/닷넷 관련 서적과 숱한 블

로그 글에서도 필자가 인지하든 못하든 이 책을 쓰는 데 일조했을 것이다. 이 글이 나오기까지 먼저 자

료를 정리했던 그들의 노고를 지나칠 수 없기에 구체적인 참고 내용은 책의 말미에 부록으로 정리해

뒀다.

1 국내 번역서로 『The C# Programming Language. 4/E(한국어판)』(에이콘출판, 2012)이 있다

2 국내 번역서로 『제프리 리처의 CLR via C# 4판』(비제이퍼블릭, 2014)이 있다.

책2.indb 38 2015-07-27 오전 10:42:08

Page 38: 시작하세요! C# 6.0 프로그래밍 : 기본 문법부터 실전 예제까지