Top

Essential C# 6.0 한국어판 [C# 6.0 기초에서 고급까지 완벽 가이드]

  • 원서명Essential C# 6.0 (5th Edition) (ISBN 9780134141046)
  • 지은이마크 미카엘리스(Mark Michaelis), 에릭 리퍼트(Eric Lippert)
  • 옮긴이김도균, 안철진
  • ISBN : 9788960778481
  • 50,000원
  • 2016년 05월 31일 펴냄 (절판)
  • 페이퍼백 | 1,088쪽 | 188*250mm
  • 시리즈 : 프로그래밍 언어

판매처

  • 현재 이 도서는 구매할 수 없습니다.

책 소개

요약

이 책은 시간이 흘러도 변치 않는 가치를 제공하며 C#에 이미 익숙해진 후라도 여전히 유용한 참고서가 될 책이다. C# 언어에 대해 자세하고 포괄적으로 다루면서 튜토리얼을 넘어 능률적인 소프트웨어 개발을 시작할 수 있는 이론적 토대를 제공한다. 또한, C# 프로그래밍 패러다임에 대한 통찰력을 제공하며, 이전 버전 C#의 모든 기능과 더불어 C# 6.0과 닷넷 프레임워크 4.6의 최신 버전에서 소개한 기능을 다룬다.

추천의 글

C# 관련 도서 중에서 사람들이 꿈꿔 온 가장 뛰어난 작업 결과물(아마도 훨씬 뛰어난) 중 하나에 온 걸 환영한다. 마크 미카엘리스의 『Essential C#』 시리즈는 고전으로 인정받아 왔는데, 이전 판에서 유명한 C# 블로거인 에릭 리퍼트와 팀을 구성한 일은 절묘한 한 수였다.
사람들은 에릭이 블로그를 작성하고 마크가 책을 쓴다고 생각할 수도 있지만, 나는 처음부터 사람들의 인식과는 다르게 에릭과 마크를 보았다.
2005년에 LINQ(Language Integrated Query)가 세상에 나왔을 때 나는 막 마이크로소프트에 입사한 상태였고, 이 대규모 공개 행사를 위한 PDC 컨퍼런스에 따라온 참이었다. LINQ 기술에 기여한 바가 거의 없음에도 나는 LINQ 기술을 선전하는 일에 푹 빠졌다. 대화의 자리가 끊임없이 이어지는 동안 전단지도 날개 돋친 듯이 사라져 갔다. C# 및 닷넷과 관련해 정말 의미 있는 하루였으며, 잊을 수 없는 시간이었다.
실습 지역에 있던 사람들은 잘 작성된 실습 자료를 사용해 이 기술을 둘러보느라 매우 조용했다. 그곳에서 마크를 만났다. 짐작하겠지만 그는 제공된 실습 자료의 스크립트를 따르지 않았다. 하고 싶은 방식대로 실습해보면서 문서를 샅샅이 뒤지기도 하고 다른 사람과 이야기하기도 했는데, 우리는 계속 마크에 눈길을 두게 되었다.
이제 막 C# 사용자 모임에 낀 셈이기는 했지만, 나는 그 컨퍼런스에서 수많은 사람을 만났고 좋은 관계를 맺었다. 하지만 솔직히 그때 만났던 사람들이 잘 기억나지 않는다. 대부분은 희미하게 생각날 뿐이다. 기억나는 단 한 사람이 바로 마크다. 내가 이 새로운 기술이 좋은지 마크에게 물었을 때 마크는 남들처럼 극찬하지 않았기 때문이다. 아주 신중하게 “아직 잘 모르겠습니다. 이 기술에 확신이 서지 않습니다.”라고 말했다. 마크는 패키지를 모두 알아본 다음에 이해하고자 했는데, 완전히 이해될 때까지는 이것이 어떻다고 누군가에게 얘기하지 않는 사람이었던 것이다.
내가 기대했던 긍정의 찬사 대신, 이 새로운 기술과 관련한 세부 내용, 결과, 염려스러운 부분에 대해 솔직하고 유익하게 대화를 나눈 것은 지난 수년 동안에 이때가 처음이었다. 그 이래로 마크는 우리 언어 설계자에게는 탁월한 가치를 지닌 커뮤니티 멤버로 남아있는데, 그는 정말 똑똑하고 핵심에 대한 모든 것을 이해하기를 고집하며, 이런 기술이 실제 개발자에게 어떻게 영향을 끼치는지에 대한 놀라운 통찰력을 갖고 있다. 무엇보다도 그는 솔직하며, 자신의 생각을 얘기하는 데 두려움이 없다. 어떤 내용이 ‘마크 시험’을 통과하고 나면 그와 관련해 시작이 좋다는 느낌을 갖게 된다. 이러한 재능이 마크를 훌륭한 저자로 만들었다. 마크는 본질에 집중하고 사탕발림이 없는 진실한 대화를 추구하며, 실용적인 가치와 실제 문제를 꿰뚫어 보는 눈을 지녔다.
에릭 또한 C# 팀에서 7년이나 같이 근무한 동료다. 그는 나보다 더 오래 이 팀에 있었는데, 에릭에 관해 제일 처음 떠올리는 기억은 배배 꼬인 문제를 풀어내는 방법을 팀에 설명하던 모습이다. 엄밀히 말하면 그때 C# 컴파일러 코드베이스에는 약간 심각한 아키텍처 TLC가 필요했고, 새로운 기능을 추가하기가 대단히 어려웠다. 이 기능은 LINQ를 사용하는 데 필수적이었다. 에릭은 어떤 아키텍처가 필요한지 찾아줬고(그 당시에는 정말 사람도 부족했다), 더 중요한 것은 단계적으로 나아가는 방법까지도 알려줬다는 점이다. 놀랐던 것은 팀도 코드베이스도 처음이었던 내가 그처럼 복잡한 구조를 에릭이 해주는 말로 바로 이해할 수 있었다는 것이다.
에릭은 블로그에 이 문제를 정말 명확하고 잘 구조화해서 풀어놓았으며, 그가 제시한 해결책이 명료해서 누구나 납득할 수 있었고, 때로는 깨달음의 기쁨이 차오르기까지 했다. 그 내용의 절반도 이해하지 못했더라도 상관없었다. 에릭은 복잡한 문제와 씨름을 할 때마다 팀에 문제와 관련된 모든 것을 공유했는데, 그 일로 에릭이 보낸 이메일 내용은 상세하면서도 무척 재미있었다. 이와 같은 문제에 관한 에릭의 공식 문서를 한없이 기다릴 수 없었기 때문에 에릭이 제기한 근본적인 문제에 대한 블로그의 글을 지나칠 수가 없었다. 심지어 그 글이 나를 창피하게 만들 때도 마찬가지였다. 나는 그의 블로그에 출판되지 않은 수많은 기술에 대한 글은 물론 C# 컴파일러 팀과 언어 설계 팀의 멤버로서 유쾌하고 통찰력이 있는 글이 올라올 때마다 즐겁게 읽었다. 마이크로소프트를 떠난 이후에도 에릭은 그가 알고 있는 것보다 더 우리의 결정에 멋지고 통찰력 있는 영향력을 계속해서 끼치고 있다.
요컨대 경이로운 인물 두 명이 정기적으로 함께 작업한 결과를 책으로 펴낸 것에 진심으로 경의를 표한다. 에릭은 내가 바른 생각을 하는 데 도움을 줬으며, 마크는 나를 정직하게 만들어 줬다. 저자들은 C#의 겉과 속을 잘 결합하고 명료하게 설명함으로써 마치 독자가 놀라운 선물을 받는 느낌을 받게 했고, 완성도를 높인 책을 내줬다. 어느 누구도 이 두 신사가 한 것처럼 C# 6을 이해하는 데 도움을 주지는 못할 것이다.
이 책을 즐기길 바란다.
- 매드 토르거슨(Mads Torrgersen) / 마이크로소프트의 C# 프로그램 매니저

이 책에서 다루는 내용

■ C# 데이터 형식과 연산자, 제어 흐름, 메소드, 매개변수
■ C# 6.0에서 상당히 간결해진 문법으로 클래스와 상속, 인터페이스 등을 포함하는 C# 개체 지향 구조 사용
■ 잘 구성된 값과 참조 형식 사용
■ 신뢰할 수 있는 효과적인 예외 처리 코드 작성
■ 코드 복잡성을 낮추기 위한 제네릭과 대리자, 람다 식, 이벤트의 사용(이벤트를 발생시키는 간결한 C# 6.0 문법 포함)
■ 리플렉션과 특성을 사용한 동적 프로그래밍
■ LINQ와 질의 식을 사용한 다양한 데이터 컬렉션 질의
■ 비즈니스 개체를 다루는 사용자 지정 컬렉션 생성
■ 컬렉션 인터페이스와 표준 질의 연산자를 사용한 닷넷(.NET) 컬렉션 액세스
■ 닷넷 4.6에서의 CLR(Common Language Infrastructure)과 C#
■ 선언형 프로그래밍과 포함된 메타데이터, 리플렉션, 특성 활용
■ 새로운 async/await 패러다임을 포함한 다중스레딩과 동기화
■ P/Invoke와 포인터, 직접 메모리 조작을 사용한 다른 언어의 코드와 상호작용
■ C# 프로그램과 기본 런타임의 관계

이 책의 대상 독자

이 책이 의도하는 바는 프로그래머보다는 대장장이에게 더 어울릴 것 같은 어셈블리, 링크, 체인, 스레드, 퓨전과 같은 단어를 사용해 초보자를 겁먹게 하지 않으면서 고급 개발자를 깨우치게 하는 데 있다. 이 책의 주요 독자는 (화살통에 든 또 다른 화살처럼) 또 다른 언어를 자신의 무기고에 추가하고자 하는 경험 있는 개발자다. 하지만 이 책은 모든 수준의 개발자들에게 중요한 가치를 제공할 수 있도록 신중하게 만들었다.

■ 초심자: 프로그래밍에 처음 입문한다면 이 책은 초급 수준 프로그래머에서 C# 개발자로 전환하는 데 도움을 주는 리소스를 제공하므로, 부여받은 어떠한 C# 프로그래밍 작업도 편하게 할 수 있을 것이다. 이 책은 문법을 가르쳐줄 뿐만 아니라 여러분의 프로그래밍 경력 전체에 유용한 프로그래밍 연습을 제공한다.
■ 구조적 프로그래머: 몰입식 외국어 공부가 최선인 것처럼 모든 세세한 것을 알기에 앞서 언어를 사용해야 할 때 컴퓨터 언어부터 배우는 것이 가장 효과적이다. 이런 방식에서 이 책은 구조적 프로그래밍에 익숙한 이들이 편안함을 느끼는 튜토리얼로 시작하고, 4장 후반부에서 이 범주에 해당하는 개발자는 편안한 기분으로 기본 흐름 제어 프로그램을 작성하게 될 것이다. 하지만 C# 개발자가 되기 위해 문법을 다시 숙지하지 않아도 된다는 점은 큰 장점이다. 오히려 간단한 프로그램 작성 수준을 기업용 개발 수준으로 높이려면 C# 개발자는 근본적으로 객체(object)와 객체의 관계라는 측면에서 생각해야 한다. 이를 위해 5장의 초급 주제에서 클래스와 객체지향 개발을 소개한다. 역사적으로 C와 코볼, 포트란과 같은 구조적 프로그래밍 언어로 채워진 역할은 여전히 중요하지만 영향력이 줄었으므로, 소프트웨어 엔지니어는 객체지향 개발에 익숙해져야 한다. C#은 핵심 원리 중 하나로 객체지향 개발에 맞춰 설계되었기 때문에 객체지향 개발로 전환을 위해 배울 만한 이상적인 언어다.
■ 객체 기반과 객체지향 개발자: C++와 자바 프로그래머, 대다수 경험 있는 비주얼 베이식 프로그래머가 이 범주에 들어간다. 독자 중 대부분은 이미 세미콜론과 중괄호에 아주 편안함을 느낄 것이다. 1장의 코드를 한 번 슬쩍 본다면 C#이 이미 알고 있는 C와 C++ 스타일 언어와 유사하다는 핵심이 드러난다.
■ C# 전문가: C#에 이미 정통한 이들의 경우 이 책은 비교적 덜 부딪히는 구문에 대한 편리한 참고서가 될 것이다. 더욱이 거의 잘 다루지 않는 언어 세부 사항과 미묘한 문제에 대한 답을 제공한다. 가장 중요한 점은 견고하고 유지 보수하기 좋은 코드를 프로그래밍하기 위한 지침과 패턴을 제공한다는 점이다. 이 책은 C#을 다른 사람에게 가르치는 데도 도움이 된다. C#이 3.0, 4.0, 5.0, 그리고 이제는 6.0으로 바뀌면서 가장 중요하게 변경된 내용은 다음과 같다.
• 암시적으로 형식화된 변수(2장 참조)
• 확장 메소드(5장 참조)
• 부분 메소드(5장 참조)
• 익명 형식(11장 참조)
• 제네릭(11장 참조)
• 람다 구문과 식(12장 참조)
• 표현식 트리(12장 참조)
• 표준 질의 연산자(14장 참조)
• 질의 식(15장 참조)
• 동적 프로그래밍(17장 참조)
• TPL(Task Programming Library)과 async를 사용한 멀티스레드 프로그래밍(18장 참조)
• PLINQ를 사용한 병렬 질의 처리(18장 참조)
• 동시 컬렉션(19장 참조)

이들 주제는 아직 여기에 익숙하지 않은 이들을 위해 자세히 다뤘다. 고급 C#과 관련된 몇 가지 주제도 21장에서 설명했다. 경험 있는 C# 개발자라도 종종 이런 주제를 잘 이해하지 못하는 경우가 있다.

이 책의 구성

추상적으로 보면 소프트웨어 엔지니어링이란 복잡성 관리라고 할 수 있으므로, 이 책도 이러한 목적에 맞게 구성했다. 1~4장에서는 구조적 프로그래밍을 소개하며, 바로 간단한 기능을 제공하는 코드를 작성해볼 수 있다. 5~9장은 C#의 객체지향 구조를 나타낸다. 초보자인 독자는 이 책의 나머지에서 설명하는 고급 주제를 진행하기 전에 이 부분을 완전히 이해하는 데 초점을 맞춰야 한다. 11~13장에서는 복잡성을 줄이는 구조와 사실상 요즘의 모든 프로그램에 필요한 일반 패턴을 다루는 방법을 소개한다. 이들 장에서 다루는 내용은 이어지는 장에서 스레드와 상호운용성을 위해 광범위하게 사용되는 리플렉션과 특성을 갖는 동적 프로그래밍에 필요하다.
이 책의 마지막 장은 C#이 동작하는 개발 플랫폼 컨텍스트 내에서 C#을 설명하는 CLI(Common Language Infrastructure)를 다룬다. CLI는 C# 명세가 아니며, 책에서 다루는 문법이나 프로그래밍 스타일과는 거리가 있기 때문에 맨 마지막 장인 21장에 배치했다. 하지만 21장은 아무 때나 읽어 보기에 적당하다. 어쩌면 1장을 읽은 뒤 바로 읽어보는 것이 나을지도 모르겠다.
다음은 각 장에 대한 간단한 설명이다.

1장, C# 소개: C#으로 작성한 HelloWorld 프로그램을 소개한 후 분석해본다. 독자가 C# 프로그램의 모습에 익숙할 수 있게 하며, 프로그램을 컴파일하고 디버깅하는 방법도 자세히 설명한다. C# 프로그램의 실행 컨텍스트와 중간 언어도 간략히 설명한다.
2장, 데이터 형식: 프로그램을 실행하고 데이터를 처리한다. 2장에서는 C#의 기본 데이터 형식을 소개한다. 값 형식과 참조 형식이라는 두 가지 형식 범주와 형식들 간의 변환, 배열에 대한 지원 사항을 다룬다.
3장, 연산자와 흐름 제어: 컴퓨터에서 반복 처리의 이점을 이용하려면 프로그램에 루프와 조건 로직을 포함하는 방법을 알아야 한다. 3장은 C# 연산자와 데이터 변환, 전처리 지시문도 다룬다.
4장, 메소드와 매개변수: 메소드와 매개변수의 세부 사항을 살펴본다. 값에 의한 전달과 참조에 의한 전달, 매개변수를 통한 데이터 반환을 포함한다. C# 4.0에서 기본 매개변수 지원이 추가되었으므로, 이 지원을 사용하는 방법도 설명한다.
5장, 클래스: 클래스라는 기본 빌딩 블록이 제공되므로, 5장에서는 이들 구문을 결합해 전체 기능 형식을 구성한다. 클래스는 객체에 대한 템플릿을 정의함으로써 객체 지향 기술의 핵심을 형성한다.
6장, 상속: 상속은 많은 개발자에게 프로그래밍 기초를 제공해주지만, C#은 new 한정자와 같은 다소 고유한 구조를 제공한다. 재정의(overriding)를 비롯해 상속 구문의 세부 사항을 설명한다.
7장, 인터페이스: 클래스 간에 버전을 지정할 수 있는 상호작용 계약 정의 인터페이스를 사용하는 방식을 설명한다. C#에서는 명시적 인터페이스와 암시적 인터페이스 멤버 구현 모두를 포함하며, 대부분의 다른 언어에서 지원하지 않는 추가적인 캡슐화 수준을 사용할 수 있다.
8장, 값 형식: 참조 형식 정의처럼 일반적이진 않지만, C#에 내장된 기본 형식과 유사한 방식으로 동작하는 값 형식을 정의해야 할 때가 가끔 있다. 8장은 구조체를 정의하는 방법과 이들 구조체에서 드러내는 고유한 특성을 설명한다.
9장, 잘 구성된 형식: 더 고급스런 형식 정의를 설명한다. +와 형 변환처럼 연산자를 구현하는 방법을 설명하고, 여러 클래스를 단일 라이브러리로 캡슐화하는 방법을 다룬다. 네임스페이스와 XML 주석을 정의하는 과정을 나타내고, 가비지 수집을 위해 클래스를 설계하는 방법을 설명한다.
10장, 예외 처리: 4장에서 소개한 예외 처리를 확장하고, 예외들이 사용자 지정 예외 생성을 지원하는 예외 계층 구조를 따르는 방법을 설명한다. 또한 예외 처리의 모범 사례도 몇 가지 설명한다.
11장, 제네릭: 제네릭은 C# 1.0에는 없는 핵심 기능이다. 11장에서는 C# 2.0 기능 전체를 다룬다. 제네릭이라는 맥락에서 C# 4.0에서 추가 지원하는 공변(covariance)과 반공변(contravariance)에 대해 설명한다.
12장, 대리자와 람다 식: 대리자는 코드 내에서 이벤트 처리를 위한 패턴을 정의하는 이전의 언어와 C#을 명확히 구별 짓기 시작했다. 이 관례는 사실상 폴링 루틴을 작성할 필요성을 없앴다. 람다 식은 C# 3.0의 LINQ를 가능하게 한 핵심 개념이다. 12장에서는 람다 식에서 더 우아하고 간결한 구문을 제공함으로써 대리자 구문을 만드는 방법을 설명한다. 12장은 다음에 설명할 새로운 컬렉션 API에 대한 토대다.
13장, 이벤트: 캡슐화된 대리자인 이벤트는 CLR(Common Language Runtime)의 핵심 구문이다. C# 2.0의 또 다른 기능인 익명 메소드도 설명한다.
14장, 컬렉션 인터페이스와 표준 질의 연산자: C# 3.0에서 소개된 간단하면서도 세련되고 강력한 변화는 새로운 Enumerable 클래스의 확장 메소드를 찾을 때 빛을 발한다. 이 클래스를 사용하면 표준 질의 연산자인 완전히 새로운 컬렉션 API를 사용할 수 있다. 여기서 이를 자세히 살펴본다.
15장, LINQ와 질의 식: 표준 질의 연산자를 단독으로 사용하면 해독하기 곤란한 긴 구문이 나올 수 있다. 하지만 15장에서 설명하는 것처럼 질의 식은 SQL과 유사한 대체 구문을 제공한다.
16장, 사용자 지정 컬렉션: 비즈니스 객체를 대상으로 동작하는 사용자 지정 API를 만듦에 있어 사용자 지정 컬렉션을 만들어야 할 때가 있다. 16장에서는 이 컬렉션을 만드는 방법을 상세하게 다루며, 이런 과정에서 사용자 지정 컬렉션을 더 쉽게 만드는 상황에 맞는 키워드를 소개한다.
17장, 리플렉션, 특성, 동적 프로그래밍: 객체지향 프로그래밍은 1980년대 후반의 프로그램 구조에서 패러다임이 변화하는 단초를 제공했다. 마찬가지 방식으로 특성은 선언형 프로그래밍과 메타데이터의 포함을 용이하게 해 새로운 패러다임을 안내했다. 17장에서는 특성을 살펴보고 리플렉션을 통해 이들 특성을 가져오는 방법을 설명한다. BCL(Base Class Library) 내에서 직렬화 프레임워크로 수행하는 파일 입력과 출력도 다룬다. C# 4.0에서는 새로운 키워드인 dynamic이 언어에 추가되었다. 이 키워드는 C#으로 할 수 있는 일의 중요한 확장으로, 런타임 때까지 모든 형식 검사를 제거했다.
18장, 멀티스레딩: 대부분의 현대 프로그램에서는 동시 이벤트에 능동적으로 응답을 제공하면서 오랫동안 돌아가는 작업을 실행하는 스레드의 사용을 필요로 한다. 프로그램이 더 복잡해짐에 따라 이들 고급 환경에서 데이터를 보호하기 위해 추가적인 예방 조치를 취해야 한다. 멀티스레드를 적용한 애플리케이션 프로그래밍은 복잡하다. 18장은 스레드를 사용하는 방법을 설명하고 멀티스레드 애플리케이션을 괴롭히는 문제를 피하는 모범 사례를 제공한다.
19장, 스레드 동기화: 18장에서 다룬 내용을 기반으로 19장에서는 멀티스레드 코드의 명시적 제어를 단순화할 수 있는 내장 스레딩 패턴 지원을 설명한다.
20장, 플랫폼 상호운용성과 안전하지 않은 코드: C#은 비교적 젊은 언어이므로, C#보다는 다른 언어로 작성된 코드가 상당히 많다. 이런 기본 코드의 이점을 누리기 위해 C#은 P/Invoke를 통해 비관리 코드와의 상호운용성을 지원한다. 게다가 C#에서는 포인터의 사용과 직접 메모리 조작을 지원한다. 포인터를 사용한 코드는 실행에 특수 권한을 필요로 하지만, 전통적인 C 기반 애플리케이션 프로그래밍 인터페이스와 완전히 상호작용하는 강력함을 제공한다.
21장, 공용 언어 인프라: 근본적으로 C#은 기본 CLI 위에 가장 효과적인 프로그래밍 언어로 설계된 구문을 갖는다. 21장에서는 C# 프로그램이 기본 런타임과 런타임 명세와 어떤 관련이 있는지 깊이 살펴본다.
부록 A, C# 컴파일러와 CLI 플랫폼의 다운로드와 설치: 마이크로소프트 닷넷이나 모노와 같은 C# 컴파일러와 코드를 실행하는 플랫폼을 설정하는 단계를 설명한다.
부록 B, 3목 프로그램 소스코드: 부록 B는 3장과 4장에서 다루는 3목 프로그램의 전체 소스코드를 제공한다.
부록 C, TPL과 C#5.0 이전의 멀티스레드 패턴: C# 5.0 이전의 개발을 위한 멀티스레드 패턴과 TPL(Task Parallel Library)에 대한 세부 내용을 설명한다.
부록 D, C# 5.0의 Async/Await 패턴 이전의 타이머: 닷넷 4.5/C# 5.0을 사용할 수 없을 때 사용하기 위한 3가지 다른 형식의 타이머를 설명한다.

저자/역자 소개

지은이의 말

소프트웨어 공학의 역사를 통틀어 컴퓨터 프로그램을 작성하는 데 사용된 방법론은 몇 번의 패러다임의 전환을 거치면서 각 전환기마다 코드 구조를 향상시키고 복잡성을 줄이는 식으로 다음의 전환에 대한 토대를 이뤄왔다.
처음 몇 장에서는 구문이 작성된 순서대로 실행되는 순차 프로그래밍 구조를 살펴본다. 이런 모델에 내포된 문제는 요구 사항이 증가함에 따라 복잡성이 기하급수적으로 증가한다는 점이다. 이런 복잡성을 줄이려면 코드 블록을 메소드로 옮기는 구조화된 프로그래밍 모델을 만들면 된다. 이 모델을 사용하면 프로그램 내의 여러 위치에서 코드 중복 없이 동일한 코드 블록을 호출할 수 있다. 하지만 이런 구조도 곧 커져가는 프로그램의 통제로 인해 한계에 부딪혔고 추상화를 더 필요로 했다. 5장에서 설명한 객체지향 프로그래밍은 이런 상황을 바로 잡기 위해 등장했다. 뒤이은 장들에서 인터페이스 기반 프로그래밍과 LINQ(그리고 이를 컬렉션 API로 만든 변환), 특성을 통한 기본적인 선언형 프로그래밍 형식(17장)과 같은 추가적인 방법론을 배운다.

이 책의 주요 장점은 다음 세 가지다.
• C# 언어에 대해 포괄적으로 다루면서 단순한 학습서 수준을 넘어 효과적인 소프트웨어 개발 프로젝트를 시작할 수 있는 토대를 제공한다.
• 이미 C#에 익숙한 독자의 경우 더 복잡한 프로그래밍 패러다임에 대한 통찰력을 제공하며, C# 6.0과 닷넷 프레임워크 4.6의 가장 최신 버전에서 소개한 기능을 상세히 다룬다.
• 이 책은 시간이 지나도 변치 않는 참고서로서, C#에 충분히 익숙해진 이후에도 여전히 유용하다.
C# 학습에 성공하려면 가능한 한 빨리 코드부터 작성해야 한다. 이론적으로 완전히 무장할 때까지 기다릴 필요가 없다. 바로 소프트웨어를 작성해보는 것이 좋다. 반복 개발의 신봉자처럼 나는 이 책을 통해 초보 프로그래머일지라도 2장의 말미에서 기본 C# 코드 작성을 시작할 수 있기를 바란다.

이 책에서 많은 주제를 다루지는 않는다. ASP 닷넷, 엔티티 프레임워크, WPF와 같은 스마트 클라이언트 개발, 분산 프로그래밍 등과 같은 주제까지 다루지는 않는다. 이들 주제가 닷넷 프레임워크와 관련이 있지만, 이들을 다루려면 각 주제별로 책 한 권이 따로 필요할 정도다. 다행히 애디슨웨슬리 출판사의 닷넷 개발 시리즈에는 이러한 주제를 다룬 책이 여럿 있다. 이 책은 C#과 기본 클래스 라이브러리 내의 형식에 초점을 맞춘다. 이 책을 읽으면 다른 시리즈에서 다루는 영역에 대한 전문성을 개발하는 데 필요한 준비를 마칠 수 있다.

지은이 소개

마크 미카엘리스(Mark Michaelis)

인텔리텍트(IntelliTect)의 창업자며, 수석 아키텍트와 트레이너 역할을 담당하고 있다. 1996년부터 C#과 비주얼 스튜디오 팀 시스템, 윈도우 SDK 분야의 MVP로 활동하고 있으며, 2007년에는 마이크로소프트 RD(Regional Director)로 인정받았다. C#과 커넥티드 시스템, 오피스/셰어포인트, 비주얼 스튜디오 등을 비롯해 마이크로소프트 소프트웨어 설계 리뷰 팀 중 몇 곳에서도 활동 중이다. 개발자 컨퍼런스에서 발표하기도 했으며, 수많은 기사를 쓰고 여러 책을 집필했다. 일리노이 주립대학에서 철학 학사학위를 받았고, 일리노이 공과대학에서 컴퓨터과학 석사학위를 받았다. 컴퓨터와 씨름하고 있지 않을 때는 가족과 함께 바쁘게 지내기도 하고, 철인 3종 경기 훈련에 참가하기도 한다(2008년에 처음으로 철인 경주를 완주했다). 아내 엘리자베스와 세 자녀인 벤자민, 한나, 아비가일과 함께 워싱턴 주에 있는 스포캔에서 살고 있다.

에릭 리퍼트(Eric Lippert)

지금은 시놉시스(Synopsys)의 일원인 커버리티(Coverity)에서 C# 정적 분석을 위한 도구를 만들고 있다. 커버리티로 옮기기 전에는 마이크로소프트에서 C# 컴파일러 팀의 수석 개발자로 일했다. 블로그에 C#에 관한 글을 작성하거나 책을 쓰지 않을 때는 자신의 작은 요트와 멋진 시간을 즐긴다. 에릭은 워싱턴 주 시애틀에서 아내 리아와 함께 살고 있다.

옮긴이의 말

새로운 밀레니엄의 시작과 함께 발표된 C#은 초기에는 자바를 베낀 언어라는 조소를 많이 받았지만, 지금은 상황이 많이 바뀌었습니다. 그동안 자바의 아버지라 불리던 제임스 고슬링은 선 마이크로시스템즈가 오라클에 인수되는 격랑 속에 자바의 가치를 높이는 역할을 내려놓고 새로운 관심사인 로봇 분야의 스타트업으로 옮겼습니다. 자바의 성공에 뛰어난 업적을 쌓았던 많은 인물이 자바를 떠나 다른 곳으로 눈을 돌린 것입니다.
C#은 첫 정식 버전이 나온 후 15년의 세월 동안 진화를 거듭해 점점 함수형 언어인 스칼라를 닮아가고 있는 듯합니다. C# 1.0에서 기초를 놓은 속성과 대리자라는 기능은 익명 메소드에서 람다로의 진화를 이끌었습니다. C#은 5.0에서 호출자 정보와 비동기에 대한 기능을 포함했고, 6.0에 와서는 이전에 반복적으로 작성했던 코드를 더 간결하게 만들어 주는 편리한 기능으로 무장했습니다. 처음엔 빠른 추격자였을지 모르지만, 지금은 현대 프로그래밍 언어의 패러다임을 선도하는 위치로 올라왔습니다.
이 책은 시간이 흘러도 변하지 않는 가치를 제공해주며, C#에 이미 익숙해진 후에도 유용한 참고서가 될 책입니다. C# 언어 자체에 대해 포괄적으로 다루면서 튜토리얼을 넘어 능률적인 소프트웨어 개발을 시작할 수 있는 이론적 토대를 제공합니다. 이 책에서는 C# 프로그래밍 패러다임에 대한 통찰력을 제공하며, C# 6.0과 닷넷 프레임워크 4.6의 최신 버전에서 소개한 기능을 다루고 있습니다. 이 책을 번역하면서 역자들의 바람이 있다면 C#이라는 언어를 마이크로소프트라는 프레임이 아니라 프로그래밍 언어의 발전이라는 관점에서 C#의 가능성을 주목해줬으면 하는 것입니다.
-김도균

어느덧 C#이 세상에 나온 후 강산이 바뀌고도 한참의 세월이 흘러버렸습니다. 어린 시절의 나에게 가장 큰 영향을 끼쳤던 두 가지 언어인 베이식과 C의 경우에는 아쉽게도 그러지 못했지만, C#의 경우에는 출현부터 현재에 이르는 과정을 가까이서 또 한편으로는 먼발치에서 지켜볼 수 있었는데, 이처럼 훌륭한 책을 접하고 또 소개할 수 있는 기회를 갖는 행운까지 만끽하게 되었습니다.
우리가 태어나서 앞 세대로부터 교육을 받으며 자라나 더 나은 세대가 되고자 노력하고, 또 그렇게 꾸준히 무언가를 이뤄가며 살아가는 것처럼 프로그래밍 언어도 마치 생명체와 같이 탄생, 학습, 성장 등과 같은 생명주기를 지니는 것이라 생각합니다. 물론 이러한 생명력을 부여하는 존재 또한 역자나 독자와 같은 인간이기에 프로그래밍 언어가 생명체라고 정의할 수는 없지만, 어떤 면에서는 그러기에 더욱 인간적인 면들이 프로그래밍 언어에 나타나는 것이 아닌가라는 생각도 해봅니다.
C#은 이제 어느 정도 성숙한 느낌을 주는 언어가 되었습니다. 앞서 나온 언어들에서 구현된 많은 면을 그대로 계승하고, 좋은 점을 발전적으로 이어 나가면서 C#의 강점 가운데 하나로 꼽는 높은 생산성마저도 꾸준히 개선해 나가고 있습니다. C#의 단점이라면 한 번 C#을 경험한 프로그래머가 이전에 쓰던 언어로 돌아가기가 쉽지 않다는 점 정도가 아닐까 합니다.
이처럼 발전을 이뤄낸 모습을 지니고 있지만, 초기보다 불가피하게 덩치가 커지고 복잡해졌습니다. 그래서 C#을 제대로 알고 사용하려면 어쩔 수 없이 더 많은 노력이 필요한데, 이는 개발자에게 부담으로 작용합니다. 다행히 ‘제대로 알고 정확하게 사용’하는 데 도움이 될 멋진 지침서 가운데 하나가 바로 지금 여러분의 눈앞에 있다고 감히 이야기하고 싶습니다. 책을 번역하면서 개발자인 저도 수년간 당연시하며 사용하던 코드의 내막들을 깨닫고 고개를 수없이 끄덕였습니다. C#을 닷넷의 일부가 아닌 언어 자체로 보고 언어에 대한 탐구를 즐기고자 하거나, 초급에서 벗어나 중/고급 개발자를 향해 열정을 불태우고자 한다면 이 책이 큰 도움이 될 것이라고 믿습니다.
-안철진

옮긴이 소개

김도균

‘강철 벼룩’이라는 필명으로 글을 쓰는 엔지니어다. 마이크로소프트의 기술을 전파하는 공인 강사며, ‘Office Servers and Services’와 ‘Visual Studio and Development Technologies’ 분야의 MVP다. 독립 IT 기술자의 저술 강연 상호부조 네트워크인 GoDev(www.godev.kr)의 리더로 섬기고 있다. 에이콘출판사에서 출간한 『The C# Programming Language』, 『Essential C# 5.0 한국어판』, 『처음 배우는 C#』을 번역했다.

안철진

비슷한 길을 가고 있지만 항상 다른 시각을 가지려고 고민하고, 미래를 그저 현재의 연장선이 아닌 좀 더 나은 가치를 이룰 수 있는 변화와 희망으로 채우고자 하루하루를 열심히 살아가는 대한민국의 개발자다. 시뮬레이터 전문업체인 도담시스템스를 거쳐 현재는 KTDS에서 시스템 개발에 몸담고 있으며, GoDev 멤버로도 활동 중이다.

목차

목차
  • 1장. C# 소개
    • Hello, World
    • C# 구문 기초
    • 콘솔 입력과 출력
    • 요약

  • 2장. 데이터 형식
    • 기본 숫자 형식
    • 더 알아야 할 기본 형식
    • null과 void
    • 형식 분류
    • null 허용 한정자
    • 데이터 형식 간의 변환
    • 배열
    • 요약

  • 3장. 연산자와 흐름 제어
    • 연산자
    • 흐름 제어 소개
    • 코드 블록({})
    • 코드 블록과 범위, 선언 공간
    • 불리언 표현식
    • 비트 단위 연산자(<<, >>, |, &, ^, ~)
    • 흐름 제어 구문(계속)
    • 점프문
    • C# 전처리 지시문
    • 요약

  • 4장. 메소드와 매개변수
    • 메소드 호출
    • 메소드 선언
    • using 지시문
    • Main()의 반환과 매개변수
    • 고급 메소드 매개변수
    • 재귀
    • 메소드 오버로딩
    • 선택적 매개변수
    • 예외를 사용한 기본 에러 처리
    • 요약

  • 5장. 클래스
    • 클래스 선언과 인스턴스 생성
    • 인스턴스 필드
    • 인스턴스 메소드
    • this 키워드 사용
    • 접근 한정자
    • 속성
    • 생성자
    • 정적 멤버
    • 확장 메소드
    • 데이터 캡슐화
    • 중첩 클래스
    • 부분 클래스
    • 요약

  • 6장. 상속
    • 파생
    • 기본 클래스 재정의
    • 추상 클래스
    • System.Object에서 파생된 모든 클래스
    • is 연산자를 사용한 기본 형식 확인
    • as 연산자를 사용한 변환
    • 요약

  • 7장. 인터페이스
    • 인터페이스 소개
    • 인터페이스를 통한 다형성
    • 인터페이스 구현
    • 클래스와 인터페이스 구현 간의 변환
    • 인터페이스 상속
    • 다중 인터페이스 상속
    • 인터페이스의 확장 메소드
    • 인터페이스를 통한 다중 상속 구현
    • 버전 관리
    • 인터페이스와 클래스의 비교
    • 인터페이스와 특성 비교
    • 요약

  • 8장. 값 형식
    • 구조체
    • 박싱
    • 열거형
    • 요약

  • 9장. 잘 구성된 형식
    • object 멤버 재정의
    • 연산자 오버로딩
    • 기타 어셈블리 참조
    • 네임스페이스 정의
    • XML 주석
    • 가비지 수집
    • 리소스 정리
    • 지연 초기화
    • 요약

  • 10장. 예외 처리
    • 다중 예외 형식
    • 예외 잡기
    • 일반 catch 블록시
    • 예외 처리를 위한 지침
    • 사용자 지정 예외 정의
    • 예외 래핑과 다시 던지기
    • 요약

  • 11장. 제네릭
    • 제네릭 없는 C#
    • 제네릭 형식 소개
    • 제약 조건
    • 제네릭 메소드
    • 공변과 반공변
    • 제네릭의 내부
    • 요약

  • 12장. 대리자와 람다 식
    • 대리자 소개
    • 람다 식
    • 익명 메소드
    • 범용 대리자(System.Func와 System.Action)
    • 요약

  • 13장. 이벤트
    • 다중 형 변환 대리자를 이용한 Observer 패턴 구현
    • 이벤트
    • 요약

  • 14장. 컬렉션 인터페이스와 표준 질의 연산자
    • 익명 형식과 암시적 형식의 지역 변수
    • 컬렉션 이니셜라이저
    • 클래스를 컬렉션으로 만들어주는 IEnumerable<T>
    • 표준 질의 연산자
    • 요약

  • 15장. LINQ와 질의 식
    • 질의 식 소개
    • 질의 식은 메소드 호출일 뿐이다
    • 요약

  • 16장. 사용자 지정 컬렉션
    • 기타 컬렉션 인터페이스
    • 주요 컬렉션 클래스
    • 인덱서 지원
    • Null이나 빈 컬렉션의 반환
    • 반복기
    • 요약

  • 17장. 리플렉션, 특성, 동적 프로그래밍
    • 리플렉션
    • nameof 연산자
    • 특성
    • 동적 객체를 이용하는 프로그래밍
    • 요약

  • 18장. 멀티스레딩
    • 멀티스레딩 기초
    • System.Threading 활용
    • 비동기 태스크
    • 태스크 취소
    • 태스크 기반 비동기 패턴
    • 루프 반복의 병렬 처리
    • LINQ 질의의 병렬 실행
    • 요약

  • 19장. 스레드 동기화
    • 왜 동기화가 필요한가?
    • 타이머
    • 요약

  • 20장. 플랫폼 상호운용성과 안전하지 않은 코드
    • 플랫폼 호출
    • 포인터와 주소
    • 대리자를 통한 안전하지 않은 코드 실행
    • C#을 통한 윈도우 런타임 활용
    • 요약

  • 21장. 공용 언어 인프라
    • 공용 언어 인프라의 정의
    • CLI 구현
    • C#에서 기계어로의 컴파일
    • 런타임
    • 애플리케이션 도메인
    • 어셈블리, 매니페스트, 모듈
    • 공용 중간 언어(CIL)
    • 공용 형식 시스템(CTS)
    • 공용 언어 사양(CLS)
    • 기본 클래스 라이브러리(BCL)
    • 메타데이터
    • 요약

  • 부록 A. C# 컴파일러와 CLI 플랫폼의 다운로드와 설치
    • 윈도우용 마이크로소프트 닷넷
    • OS X과 리눅스에서의 닷넷

  • 부록 B. 3목 프로그램 소스코드
    • 비동기 프로그래밍 모델
    • 비동기 대리자 호출
    • 이벤트 기반 비동기 패턴(EAP)
    • 백그라운드 작업자 패턴
    • 윈도우 UI로의 디스패치

  • 부록 D. C# 5.0의 Async/Await
    • 패턴 이전의 타이머

도서 오류 신고

도서 오류 신고

에이콘출판사에 관심을 가져 주셔서 고맙습니다. 도서의 오탈자 정보를 알려주시면 다음 개정판 인쇄 시 반영하겠습니다.

오탈자 정보는 다음과 같이 입력해 주시면 됩니다.

(예시) p.100 아래에서 3행 : '몇일'동안 -> 며칠동안

정오표

정오표

[p49. 아래에서 6행]
즉,동물이 -> 즉, 동물이

[p51. 3행]
max = "It would take a miracle."; -> miracleMax = "It would take a miracle.";

[p57. '주석' 첫 행]
이번 절에서는 리스트 1.15의 프로그램에 주석을 넣었다.
->
이번 절에서는 리스트 1.16의 프로그램에 주석을 넣었다.

[p76. 6행]
리터럴용 접미사는 대소문자를 구분한다.
->
리터럴용 접미사는 대소문자를 구분하지 않는다.

[p156. 리스트 3.25, 3.26]
3.14
->
Math.PI

[p174. 10행, p179. 아래에서 4행]
// 초기 mask를 100으로 설정 ....
->
// 초기 mask를 100...으로 설정