99

Head First C# : 상상을 초월하는 객체지향 C# 학습법(개정3판)-미리보기

  • View
    364

  • Download
    12

Embed Size (px)

DESCRIPTION

앤드류 스텔만,제니퍼 그린 공저/최길우 역 | 한빛미디어 | 2015년 03월 42,000원

Citation preview

Page 1: Head First C# : 상상을 초월하는 객체지향 C# 학습법(개정3판)-미리보기
Page 2: Head First C# : 상상을 초월하는 객체지향 C# 학습법(개정3판)-미리보기

헤드 퍼스트 C#(개정3판) : 상상을 초월하는 객체지향 C# 학습법

초판발행 2015년 3월 1일

지은이 앤드류 스텔만, 제니퍼 그린 / 옮긴이 최길우 / 펴낸이 김태헌

펴낸곳 한빛미디어 (주) / 주소 서울시 마포구 양화로 7길 83 한빛미디어(주) IT출판부

전화 02 – 325 – 5544 / 팩스 02 – 336 – 7124등록 1999년 6월 24일 제10 – 1779호 / ISBN 978-89-6848-165-9 93000

총괄 배용석 / 책임편집 최현우 / 기획 강은희 / 편집 강은희

디자인 표지 강은영, 조판 이경숙

영업 김형진, 김진불, 조유미 / 마케팅 박상용, 서은옥

이 책에 대한 의견이나 오탈자 및 잘못된 내용에 대한 수정 정보는 한빛미디어(주)의 홈페이지나 아래 이메일로

알려 주십시오. 잘못된 책은 구입하신 서점에서 교환해 드립니다. 책값은 뒤표지에 표시되어 있습니다.

한빛미디어 홈페이지 www.hanbit.co.kr / 이메일 [email protected]

Copyright © 2015 by HANBIT Media, Inc.

Authorized Korean translation of the English edition of Head First C#, 3rd Edition ISBN

9781449343507 © 2013 Andrew Stellman and Jennifer Greene. This translation is published and

sold by permission of O’Reilly Media, Inc., which owns or controls all rights to publish and sell the

same.

이 책의 저작권은 오라일리와 한빛미디어 (주)에 있습니다.

신 저작권법에 의해 한국 내에서 보호를 받는 저작물이므로 무단 전재와 무단 복제를 금합니다.

지금 하지 않으면 할 수 없는 일이 있습니다.

책으로 펴내고 싶은 아이디어나 원고를 메일 ( [email protected] ) 로 보내주세요.

한빛미디어(주)는 여러분의 소중한 경험과 지식을 기다리고 있습니다.

Page 3: Head First C# : 상상을 초월하는 객체지향 C# 학습법(개정3판)-미리보기

Head First C#

전화번호부를 외우는 것보다 더 재미있게

C#을 배울 수 있다면 정말 꿈만 같지 않을까?

꿈 속에서나 있을 수 있는 일이겠지…

앤드류 스텔만, 제니퍼 그린 지음

최길우 옮김

(개정3판)

Page 4: Head First C# : 상상을 초월하는 객체지향 C# 학습법(개정3판)-미리보기

4

2007년 4월 17일에 브루클린으로 헤엄쳐 왔던 고래 슬러지를 기리며…

우리 운하에서는 하루밖에 살지 못했지만

우리 마음속에서는 영원히 살 수 있길.

Page 5: Head First C# : 상상을 초월하는 객체지향 C# 학습법(개정3판)-미리보기

5

『Head First C#』에 대한 찬사“『Head First C#』은 초보 개발자 혹은 나처럼 자바 경험을 가진 개발자 모두에게 훌륭한 책이

다. 독자의 숙련도는 가정하지 않았지만, 초보 개발자들도 쉽고 빠르게 이해할 수 있도록 만들

었다. 이 책은 내가 첫 번째로 맡은 C# 개발 대형 프로젝트 업무를 즉시 진행할 수 있도록 도와

주었다. 이 책을 강력히 추천한다.”

- 쉘레와 오두산야, 구글 테크니컬 어카운트 매니저

“『Head First C#』은 C#을 학습하는 데 있어 뛰어나고 간단하며 재미있는 책이 될 것이다. C#

초보자를 위한 최고의 작품이다. 예제와 주제가 명확하고 간결하게 잘 쓰여 있다. 미니 게임에

있는 각양 각색의 프로그래밍 문제들은 분명히 독자들의 뇌에 잘 전달될 것이다. 실습을 하면

서 배우기 좋은 책이다!”

- 조니 할리프, Mural.ly 수석 아키텍트

“『Head First C#』은 마치 친구와 대화하는 것처럼 C#을 배울 수 있는 폭 넓은 지침서이다. 심

지어 개념이 조금 이해하기 어렵더라도 많은 코딩 문제들이 흥미를 유지할 수 있게 도와준다.”

- 레베카 둔-크렌, 세마포어 솔루션 창립 파트너

“지금까지 컴퓨터 책을 처음부터 끝까지 읽어본 적이 한 번도 없었는데, 이 책은 정말 첫 페이

지부터 마지막 페이지까지 흥미진진하게 읽었다. C#을 깊이 있게, 그러면서도 재미있게 공부

하고 싶다면 단연코 이 책을 권하겠다.”

- 엔디 파커, 새내기 C# 프로그래머

“좋은 예제 없이 프로그래밍 언어를 배우는 것은 정말로 힘들다. 이 책은 좋은 예제들로 가득

채워져 있다. 『Head First C#』은 초보자들이 C#과 .NET 프레임워크를 사용하는 데 실질적인

지침으로 자리잡을 것이다.”

- 크리스 버로우스, 마이크로소프트의 C# 컴파일러팀 개발자

“『Head First C#』에서 앤드류와 제니는 C#을 공부하는 데 있어서 매우 훌륭한 튜터리얼을 제공

하고 있다. 저자들은 독특한 스타일로 상세한 내용을 모두 다루면서도 독자들이 쉽게 다가갈 수

있는 책을 만들어냈다. 다른 C# 책에 실망한 독자들이라도 이 책은 분명히 마음에 들 것이다.”

- 제이 힐야드, 소프트웨어 개발자, 『C# 3.0 Cookbook』 공저자

“프로그래밍과 C#의 세계로 뛰어들려는 사람들에게 추천한다. 첫 번째 페이지부터 저자는 계

속해서 독자가 C#의 어려운 개념을 간단하고 쉽게 이해할 수 있도록 설명한다. 마지막 부분에

있는 프로젝트와 실습을 하면서 독자는 자신이 성취한 내용에 깜짝 놀랄 것이다”

- 데이비드 스털링, 마이크로소프트 비주얼 C# 컴파일러팀 개발자

Page 6: Head First C# : 상상을 초월하는 객체지향 C# 학습법(개정3판)-미리보기

6

다른 Head First 책에 대한 찬사

“『Head First C#』은 머릿속에 쏙쏙 들어오는 예제와 재미있는 연습문제로 가득한, 즐겁게 공부할 수 있는

튜터리얼이다. 여기저기 손으로 적은 듯한 설명이 달린 연습문제에서 추상 클래스와 인터페이스가 설전을

벌이는 ‘난롯가 담소’에 이르기까지 독자들의 눈을 사로잡을 만한 생동감 넘치는 스타일로 꾸며져 있다. 프

로그래밍을 새로 배우는 사람에게는 더할 나위 없이 좋은 책이다.”

- 조셉 알바하리, 영국 최대의 의료 소프트웨어 공급사인 에그톤 의료정보 시스템의 C# 디자인 아키텍트,

『C# 3.0 in Nutshell』 공저자

“『Head First C#』은 쉽게 읽고 이해할 수 있는 책이다. C#을 막 시작하려는 개발자라면 단연코 이 책을 추

천하겠다. 그리고 자기가 만든 코드에서 어떤 일이 일어나는지 더 자세하게 이해하려는 고급 개발자들에게

도 추천하고 싶은 책이다. 그리고 ‘C#이 어떤 식으로 작동하는지 더 잘 설명할 수 있는 방법이 없을까’ 고민

하는 개발자들에게도 추천할 만한 책이다.”

- 주세페 투리토, 콘월 컨설팅 그룹 C# 및 ASP.NET 개발자

“앤드류와 제니는 독자들이 C#을 흥미롭게 학습할 수 있도록 이 책을 만들었다. 컴퓨터 앞에 앉아 연필을

움켜쥐고 우뇌와 좌뇌, 뼈를 타고 오는 재미를 즐겨라. ”

- 빌 미텔스키, 소프트웨어 엔지니어

“『Head First C#』을 읽은 것은 매우 좋은 경험이었다. 원래 독자를 가르치는 방식의 책 시리즈에 특별한 인

상을 받지 못했었다. 그러나 이 책은 C#을 배우고 싶은 사람들에게 확실히 추천하고 싶은 책이다.”

- 크리쉬나 팔라, MCP(Microsoft Certificated Professional)

“내 머릿속에서 500킬로그램 정도되는 책을 걷어내 버린 듯한 느낌이다.”

- 워드 커닝햄, 위키의 발명자이자 힐사이드 그룹 창립자

“우리 마음 속에 숨어 있는 쿨한 괴짜 코더에 딱 맞는 스타일의 책이다. 실용적인 개발 전략에 있어서도 최적

의 레퍼런스라고 할 수 있다. 지루한 교수님들의 강의에 눌려 지친 두뇌에 날개를 달아 줄 수 있는 책이다.”

- 트래비스 칼라닉, Scour and Red Swoosh 창립자, MIT TR100 멤버

Page 7: Head First C# : 상상을 초월하는 객체지향 C# 학습법(개정3판)-미리보기

7

“책은 사두기만 하는 책, 책꽂이에 잘 꽂아두는 책, 책상 위에 올려놓고 보는 책으로 나눌 수 있다. 하지만

O’Reilly와 Head First팀 덕분에 Head First 시리즈라는 새로운 부류가 등장할 수 있었다. 이 부류의 책

은 너덜너덜해질 때까지 어디든 가지고 다니면서 보는 책이다. 내 책상에 쌓인 책들 맨 위에 바로 『Head

First SQL』이 올려져 있다. 리뷰용으로 받았던 PDF 파일마저도 여기저기 해지고 너덜너덜해질 지경이다.”

- 빌 소이어, ATG 커리큘럼 관리자, 오라클

“놀라우리만치 명료하면서도 유머가 넘치고 재치가 번뜩이는 이 책 덕분에 프로그래머가 아닌 사람들조차

문제 해결에 대해 배울 수 있을 것만 같다.”

- 코리 닥터로우, Boing Boing의 공동 편집자,

『Down and Out in the Magic Kingdom』과 『Someone Comes to Town, Someone Leaves Town』의 저자

“어제 이 책을 받아서 바로 읽기 시작했는데, 도저히 중간에 멈출 수가 없었다. 정말 쿨한 책이다. 재미있으

면서도 근본적인 내용부터 충실하게 다루고 있다. 정말 인상적이다.”

- 에릭 감마, IBM Distinguished Engineer, 『Design Patterns』의 공저자

“지금까지 읽어본 소프트웨어 디자인 관련 책 중 가장 재미있고 멋진 책”

- 아론 라버지, VP Technology, ESPN.com

“길고 지루한 시행착오를 통해 배우던 내용을 이제 깔끔하고 재미있는 책 한 권으로 배울 수 있는 날이 오

고야 말았다.”

- 마이크 데이비슨, Newsvine, Inc. CEO

“우아한 디자인을 소개하면서도 각각의 개념을 실용성과 위트를 곁들여서 소개해 주는 책”

- 켄 골드스타인, 디즈니 온라인 부사장

“보통 디자인 패턴에 관한 책이나 글을 읽을 때는 내용에 집중하기 위해 몸부림을 쳐야 했지만 이 책은 그렇

지 않다. 이상하게 들릴지 모르지만 이 책은 디자인 패턴을 정말 재미있게 배울 수 있는 책이다. 다른 디자

인 패턴 책들을 고상한 고전음악에 비유한다면 이 책은 신나는 댄스음악에 비유할 수 있을 것 같다.”

- 에릭 울러

“정말 사랑스러운 책이다. 심지어 아내 앞에서 이 책에 키스한 일도 있었다.”

- 새티시 쿠마르

Page 8: Head First C# : 상상을 초월하는 객체지향 C# 학습법(개정3판)-미리보기

8

저자들

제니퍼 그린은 대학교에서는 철학을 전공했지만 철학 전공자답

게 전공과 관련된 직장을 구하지는 못했습니다. 다행히도 소프

트웨어 테스팅에 능통한 덕에 온라인 서비스 업체에서 테스팅

을 시작하면서 프로젝트 관리에 대해 배울 수 있었습니다.

1998년에 뉴욕으로 이사해서 회계 소프트웨어 테스트 업무를

맡았습니다. 그 후로는 미디어와 회계 회사에서 소프트웨어 개

발자, 테스터, PM들을 관리했습니다.

세계 방방곡곡을 돌면서 여러 소프트웨어 팀과 함께 일하면서

갖가지 재미있는 프로젝트를 진행했습니다.

여행을 좋아하고, 발리우드 영화를 즐겨 보며, 가끔씩 만화책

을 보기도 하고, PS3 게임을 하며 큰 시베리안종의 고양이 샤

샤와 시간을 보냅니다.

앤드류 스텔만은 뉴요커로 자라긴 했지만 미니애폴리스,

제네바에서 살았고 피츠버그에서 꽤 오래 지냈습니다. 카

네기 멜론 대학교 전산학부를 다니는 동안 피츠버그라는

동네를 알게 되었고, 나중에 제니와 함께 컨설팅 사업을

시작하고 오라일리에서 책을 내기 시작하면서 다시 피츠

버그로 이사왔습니다.

대학을 졸업하고 앤드류가 처음 얻은 직장은 EMI 음반사의 프로그래

머 자리였습니다. 그가 라구아디아 공연예술 고등학교에서 첼로와 재즈

베이스 기타를 전공했던 것을 감안하면 제법 그럴듯한 직장이었습니다.

앤드류와 제니가 처음으로 같이 일했던 곳은 회계 소프트웨어 회사였는

데, 거기에서 앤드류는 프로그래머팀을 맡고 있었습니다.

몇 년 동안 앤드류는 큰 규모의 실시간 백 앤드 시스템을 설계하는 메이

저 투자 은행의 부사장으로 있었습니다. 그는 세계적인 소프트웨어팀을

관리하고 회사와 학교, 기관을 위해 컨설팅을 했습니다. 마이크로소프

트, 국립경제연구실, MIT가 여기에 포함됩니다. 그때 끝내주는 프로그

래머들과 일할 수 있었고, 그 과정에서 많은 것을 배웠습니다.

책을 쓰지 않는 동안에는 별로 쓸데없는(하지만 재미있는) 소프트웨어

를 만들기도 하고, 음악과 비디오 게임도 하고, 태극권과 합기도 연습도

하고, 포메라니언종 강아지하고 놀곤 한답니다.

제니와 앤드류는 1998년에 처음 만난 이후로 함께 소프트웨어를 만들고 소프트웨어 엔지니어링에 관한 글을 쓰고 있습니다.

2005년에는 그들의 첫 책인 『Applied Software Project Management』, 2009년에는 『Beautiful Times』가 오라일리에서

출간되었습니다. Head First 시리즈의 첫 번째 책은 2007년에 출간된 『Head First PMP』였습니다.

2003년에 베트남전 참전자들의 제초제에 대한 노출을 연구하는 과학자들을 위한 소프트웨어 프로젝트를 구축하기 위해

Stellman & Green 컨설팅을 설립했습니다. 소프트웨어를 만들고 책을 쓰는 일뿐만 아니라 회사를 컨설팅하고 소프트웨어

엔지니어링, 아키텍처, 프로젝트 관리와 관련된 학회나 회의에서 발표를 합니다.

http://www.stellman-greene.com에 가면 그들이 만들어가는 Building Better Software(더 좋은 소프트웨어를 만드는 법)

블로그를 볼 수 있습니다. 앤드류와 제니의 소식을 듣고 싶으면, 트위터 @AndrewStellman와 @JennyGreene에 팔로우해 주세요.

제니

앤드류

우리 책을 구입해 주셔서 감사합니다.

정말 즐거운 마음으로 책을 만들었어요. 독자 여러분도

마찬가지로 이 책을 즐길 수 있길 바라요.모두 C#을 즐거운 마음으로

배웠으면 해요.

이 사진과 고와누스 운하 사진은

니샤 손드가 찍어줬어요..

Page 9: Head First C# : 상상을 초월하는 객체지향 C# 학습법(개정3판)-미리보기

9

역자 서문

마이크로소프트가 변하고 있습니다. 예전에는 오로지 윈도우의, 윈도우에 의

한, 윈도우를 위한 폐쇄적인 정책을 펼쳤다면, 윈도우뿐만이 아니라 다양한

환경에서 마이크로소프트 제품을 사용할 수 있도록 개방적인 정책을 펼치고

있습니다. 2014년 11월 12-13일 뉴욕에서 열린 Connect() 개발자 컨퍼런스

에서 마이크로소프트가 개발하고 있는 많은 기술들을 설명했습니다. 그리고

이 책에서 다루는 통합 개발 환경인 Visual Studio에 대한 많은 변화들도 있었습니다. 물론 C#과

.NET을 공부하는 것도 중요하지만, 자신이 사용하고 있는 개발 도구의 변화를 잘 주시해야 합니

다. 독자 여러분과 함께 마이크로소프트의 행보를 계속 지켜봐야 할 것 같습니다.

『Head First C#』은 딱딱하지 않게 내용을 설명하면서도, 중요한 개념들(객체 지향 프로그래밍, 예

외 처리, 직렬화, LINQ, 이벤트, 비동기 프로그래밍 등)을 놓치지 않고 있습니다. 그리고 친절한

스크린 캡처들과 많은 연습 문제는 여러분의 실력을 향상시켜 줄 것입니다.

이 책에서 사용한 용어들은 C# MSDN 혹은 인터넷에

검색했을 때, 많이 쓰이는 단어로 사용했습니다. 원

서는 본래 Visual Studio 2012로 되어 있는데 Visual

Studio 2012에서 2013으로 버전이 업그레이드되면

서 달라진 부분이 있습니다. 이러한 예제 코드 부분

을 고치고, Visual Studio 2013 Express for Windows와 Desktop에서 테스트했습니다. 이 책의

윈도우 스토어 앱은 윈도우 8 이상의 버전에서만 동작합니다. 하지만 윈도우 8 이전 버전을 사용

하는 독자들을 위해서 WPF(Windows Presentation Foundation) PDF 파일도 제공하고 있습니

다. 조금 더 자세한 사항은 책을 읽다 보면 자연스럽게 알게 됩니다. 자, 그럼 이제 C#과 .NET의

세계로 빠져들 준비가 되셨나요?

이 책이 깔끔하게 나올 수 있도록 편집해 주신 강은희 편집자님께 감사의 말을 전하고 싶습니다.

그리고 모두 이름을 열거할 수 없지만, 항상 삶에 큰 자극이 되어 준 멘토님들, 친구들, 회사 동

료 분들에게도 감사의 말을 전하고 싶습니다. 바쁘다는 핑계로 자주 집에 찾아가지 못해 엄마, 동

생에게 미안하고, 사랑한다는 말을 전하고 싶습니다. 마지막으로 하늘에 계신 아빠에게 이 책을

선물하고 싶습니다.

2015년 2월

최길우

역자 소개

Software Maestro 3기 연수 과정 중 약 1년 동안 수면실에서 미래를 고민하다가, 지금은 어느 한 회사에서 신입사원으로서

미생의 삶을 살아가고 있습니다. 아직도 무엇을 해야 할지 끊임없이 고민하고 있습니다. 내일부터 피아노와 기타를 쳐야지

하면서, 몇 년째 악기들을 곁에만 두고 있습니다.

Page 10: Head First C# : 상상을 초월하는 객체지향 C# 학습법(개정3판)-미리보기

10

서문 33

1 C# 시작하기 : 멋진 뭔가를 빠르게 만들어 봅시다! 45

2 모두 다 코드에 불과하나니… : 뒤에 숨어 있는 그 무엇 97

3 객체를 지향하라! : 제대로 된 코드 만들기 145

4 유형과 참조 : 10시… 당신의 데이터는 어디에 있습니까? 185

C# 실습 1 : 경주 시뮬레이션 231

5 캡슐화 : 비밀스러운 것은… private으로… 241

6 상속 : 객체의 가계도 281

7 인터페이스와 추상 클래스 : 약속 잘 지키는 클래스 만들기 337

8 열거형과 컬렉션 : 데이터 왕창 저장하기 395

9 파일 읽고 쓰기 : 마지막 바이트를 저장하라! 453

C# 실습 2 : 퀘스트 509

10 XAML로 윈도우 스토어 앱 디자인하기 : 앱을 다음 레벨로… 531

11 데이터 컨트랙트 직렬화 : 실례합니다, 잠시만요! 579

12 예외 처리 : 나중에는 불길 잡기가 힘들어요 613

13 캡틴 어메이징 : 객체의 최후 655

14 쿼리와 LINQ : 데이터 처리하기 693

15 이벤트와 대리자 : 코드가 은밀히 처리하는 것 745

16 MVVM 패턴으로 앱 설계하기 : 좋은 앱의 내부, 외부 구조 789

C# 실습 3 : 인베이더(Invaders) 851

17 보너스 프로젝트 : 윈도우 폰 앱 만들기 875

부록 1 남은 것들 : 이 책에 넣고자 했던 11가지 내용 889

목차(요약)

Page 11: Head First C# : 상상을 초월하는 객체지향 C# 학습법(개정3판)-미리보기

목차

11

목차(진짜)C#에 빠져봅시다. 여러분은 뭔가를 배우기 위해서 이 책을 보고 있을 것입니다. 하지만 여

러분의 머리에서는 배운 내용을 잘 받아들이려고 하지 않습니다. 아마 ‘어떤 야생 동물을 주의해야

한다거나 왜 안전 장비를 잘 갖추고 수상스키를 타야 하는 걸까? 같은 더 중요한 내용을 채워 넣어

야 하니까 자리를 좀 남겨 둬야 돼’라고 생각하고 있을지 모르죠. 이제 여러분의 두뇌를 속여서 C#

은 목숨이 달린 중요한 사안이라고 생각하게 만들어 봅시다.

서문

누구를 위한 책일까요? 34

지금쯤 여러분은 이런 생각을 하고 있겠죠? 35

초인지: 생각하는 것에 대해 생각하는 것 37

이 책에서는 이렇게 했습니다 38

두뇌를 정복하는 방법 39

이 책의 학습을 위해 필요한 것 40

마지막으로 알아 둬야 할 몇 가지 41

테크니컬 리뷰팀 42

감사의 글 43

Page 12: Head First C# : 상상을 초월하는 객체지향 C# 학습법(개정3판)-미리보기

목차

12

멋진 뭔가를 빠르게 만들어 봅시다! 1 멋진 앱을 정말 빨리 만들고 싶습니까?

C#을 쓰면 강력한 프로그래밍 언어와 훌륭한 도구를 자유자재로 활용할 수 있습니다. 그리고 비주

얼 스튜디오 IDE를 이용하면 버튼이 제대로 작동하게 만들려고 복잡한 코드를 가지고 오랫동안 씨

름할 필요도 없죠. 게다가 버튼에 대한 적은 양의 코드로 멋진 소프트웨어를 만들 수 있습니다. 뭔

가 끌리는 느낌이 드나요? 그러면 다음 페이지로 넘어가서 프로그래밍을 시작해 봅시다.

C# 시작하기

C#을 배워야 하는 이유 46

C#과 비주얼 스튜디오 IDE가 있으면 여러모로 쉬워집니다 47

비주얼 스튜디오에서 해야 할 일 48

비주얼 스튜디오가 대신해 주는 일 48

외계인 침입! 52

당신만이 지구를 구할 수 있습니다 53

빌드할 것들 54

빈 응용 프로그램으로 시작하기 56

그리드 설정하기 62

그리드에 컨트롤 추가하기 64

속성값으로 컨트롤이 변하는 모습을 봅시다 66

컨트롤로 게임 동작하게 하기 68

게임 만들 준비가 됐습니다 73

다음에 해야 할 것 74

메서드 추가하기 75

메서드에 코드 채워 넣기 76

메서드를 끝내고 프로그램을 실행해 봅시다 78

지금까지 한 일 80

타이머 추가하기 82

시작 버튼 동작하게 하기 84

진행 상황을 볼까요? 85

플레이어가 컨트롤을 조정하는 코드를 작성해 봅시다 86

사람과 적이 부딪히면 게임이 끝납니다 88

이제 게임을 할 수 있습니다 89

적을 외계인처럼... 90

깜빡이는 화면과 타일 추가하기 91

앱 배포하기 92

사이드 로딩을 위한 원격 디버거 사용하기 93

원격 디버깅 시작하기 94?!

안 돼! 외계인이

사람들에게 레이저

빔을 쏘고 있어.

이렇게 생긴 외계인을

피하세요

Page 13: Head First C# : 상상을 초월하는 객체지향 C# 학습법(개정3판)-미리보기

목차

13

뒤에 숨어 있는 그 무엇2 우리는 그냥 IDE 사용자가 아니라 프로그래머입니다.

IDE만 가지고도 꽤나 많은 일을 할 수 있습니다. 하지만 거기에는 한계가 있습니다. 물론 응용 프로그램을 만들다

보면 반복적인 작업을 많이 해야 하긴 합니다. 그런 일을 하다 보면 IDE에서 제공하는 기능이 정말 많이 도움이 된

다는 것을 알 수 있죠. 하지만 IDE를 가지고 작업하는 것은 시작에 불과합니다. 프로그램에서 할 수 있는 일은 IDE

에서 하는 일에 비하면 무궁무진합니다. 그리고 그런 일을 하려면 C# 코드를 작성해야 합니다. 일단 코딩에 대해

어느 정도 감을 잡고 나면 프로그램으로 못할 일이 없다니까요.

모두 다 코드에 불과하나니...

이런 일을 할 때… 98

IDE에서는 이런 일을 합니다 99

프로그램은 어디에서 오는가 100

IDE가 코딩을 도와주네요 102

프로그램의 해부학 104

같은 네임스페이스 안에 두 클래스가 있을 수도 있습니다 109

데이터는 변수로… 110

C#의 연산자 112

변수 값의 추이를 지켜보려면 디버거를 사용하세요 113

같은 일을 계속 반복해 주는 반복문 115

결정을 내릴 때는 if/else 선언문으로 116

기초부터 만들기 117

버튼 동작하게 하기 119

조건문을 만들고 그 조건이 맞는지 확인합니다 120

윈도우 데스크톱 앱, 쉽게 만들 수 있어요 131

다시 만들어 볼까요? 132

어디에서 시작할까요? 136

프로그램의 진입점을 바꿀 수 있습니다 138

IDE에서 뭔가를 바꾸면 코드도 바뀝니다 140

네임스페이스

클래스

메서드 1

선언문

메서드 2

선언문

새로운 프로그램을 만들 때는 항상 별도의 네임스페이스를 만들어서 그 코드를 .NET 프레임 워크 클래스, 윈도우 스토어 API와 구분 지을 수 있게 합니다.

한 클래스에는 하나 이상의 메서드가 들어갑니다. 메서드는 언제나 클래스 안에서만 살아갑니다. 그리고 메서드는 - 우리가 이미 살펴본 것처럼 - 선언문으로 이뤄지죠.

한 클래스에는 우리가 만드는 프로그램의

일부분이 담겨 있습니다(아주 간단한

프로그램은 한 클래스만 가지고도 만들 수

있긴 합니다).

Page 14: Head First C# : 상상을 초월하는 객체지향 C# 학습법(개정3판)-미리보기

목차

14

청사진을 만들 때 집 내부 구조물의

배치도를 그려 넣듯이 클래스를 선언할 때

메서드를 정의합니다.

청사진 하나로 똑 같은 집을 여러 채 지을 수 있는 것처럼 클래스 하나로 객체를 여러 개 만들 수 있습니다.

제대로 된 코드 만들기3 모든 프로그램은 어떤 문제를 해결하기 위해 만들어집니다.

프로그램을 만들 때는 항상 그 프로그램으로 어떤 문제를 해결하는 것인지부터 생각하는 습관을 기르는 것이 좋

습니다. 그런 관점에서 볼 때 객체는 정말 유용합니다. 그 객체를 통해서 문제를 해결하면 코드 구조를 구축하는

데 도움이 되고, 결과적으로 코드를 작성하는 방법에 얽매이기보다는 우리가 해결해야 할 문제를 고민하는 데

더 많은 시간을 투자할 수 있으니까요. 객체를 올바르게 활용하면 더 직관적으로 작성할 수 있는 코드, 더 쉽게

이해하고 수정할 수 있는 코드를 만들어 낼 수 있습니다.

객체를 지향하라!

마이크의 문제 해결 방법 146

마이크의 내비게이션 시스템에서는 이 문제를 어떻게 생각하고 있을까요? 147

마이크의 Navigator 클래스에는 경로를 설정하고 변경하는 메서드가 있습니다 148

지금까지 배운 걸 활용해서 간단한 프로그램을 만들어 봅시다 149

방금 만든 프로그램은 무슨 일을 할까요? 150

마이크, 새로운 아이디어를 떠올리다 151

객체를 쓰면 이 문제를 해결할 수 있습니다 152

클래스를 이용해 객체를 만들 수 있습니다 153

클래스에서 생성한 객체를 그 클래스의 인스턴스(instance)라고 부릅니다 154

객체를 이용한 더 나은 해결책 155

인스턴스에서는 필드로 모든 것을 저장합니다 160

인스턴스를 만들어 봅시다! 161

메모리와 객체 162

프로그램에서는 무슨 일이…? 163

클래스와 메서드 이름을 활용하면 직관적인 코드를 만들 수 있습니다. 164

직관적인 클래스 구조 166

클래스 다이어그램을 써서 클래스를 제대로 만듭시다 168

두 친구를 위한 클래스를 만들어 봅시다 172

프로젝트를 만들어 봅시다 173

폼을 만들어 봅시다 174

객체를 더 쉽게 초기화하는 방법 177

직관적인 클래스를 만드는 방법 178

new Navigator()

new Na

vigato

r()

Navigator 객체

navigator3

Navigator 객체

navigator1

Navigator 객체

navigator2

new Navigator()

Navigator

SetDestination()

ModifyRouteToAvoid()

ModifyRouteToInclude()

GetRoute()

GetTimeToDestination()

TotalDistance()

Page 15: Head First C# : 상상을 초월하는 객체지향 C# 학습법(개정3판)-미리보기

목차

15

10시… 당신의 데이터는 어디에 있습니까?4유형과 참조

데이터의 유형에 따라 저장할 수 있는 데이터의 종류가 결정됩니다 186

변수는 테이크-아웃용 컵과 같습니다 188

2킬로그램짜리 가방에 10킬로그램 분량의 데이터를 담으면? 189

값이 별 문제가 되지 않는다고 해서 아무 변수에나 넣을 수는 없습니다 190

너무 큰 값을 형변환하면 C#에서 자동으로 값을 조절합니다 191

일부 형변환은 C#에서 자동으로 해 줍니다 192

메서드를 호출할 때는 인수와 매개변수의 유형이 딱 맞아야 합니다 193

마일리지 계산기 디버깅하기 197

연산자와 =의 만남 198

객체에서도 변수를 사용합니다! 199

참조변수로 객체 참조하기 200

참조는 객체에 대한 레이블과 마찬가지입니다 201

더 이상 참조가 없으면 객체는 가비지 컬렉션(쓰레기 수집)됩니다 202

참조변수가 여러 개 있을 때 생길 수 있는 문제점 204

참조변수가 두 개 있다는 것은 객체의 데이터를 두 가지 경로로 바꿀 수 있다는

것을 뜻합니다 209

특별 케이스: 배열 210

배열에 참조변수를 저장할 수 있습니다 211

슬라피 조의 샌드위치 하우스에 오신 것을 환영합니다! 212

객체는 참조변수를 통해서 이야기합니다 214

어떤 객체도 가 보지 못한 길 215

문자입력 게임 만들기 220

다른 객체들처럼 컨트롤도 객체입니다 224

자료형, 데이터베이스, 전화번호부… 전부 ‘중요하다’는 공통점이 있습니다.

데이터가 없이는 어떤 프로그램도 쓸모가 없습니다. 사용자로부터 정보를 받고, 그 정보를 활용해 새로운 정보를

찾아내거나 만들어 내서 다시 사용자에게 돌려 줘야 하니까요. 사실 프로그래밍 과정에서 하는 일은 대부분 어떤

식으로든 데이터로 작업하는 것이라고 할 수 있습니다. 이 장에서는 C#의 자료형(data type)에 대해 속속들이 알

아보겠습니다. 프로그램에서 데이터를 다루는 방법을 자세하게 알아보고, 객체에 대한 비밀스러운 이야기까지 살

펴봅시다(떠도는 소문에 의하면 실은 객체도 데이터라고 합니다).

2번 Dog 객체

fido휘릭!

Dog fido;

Dog lucky = new Dog();

fido = new Dog();

1번 Dog 객체

lucky

lucky = null;

2번 Dog 객체

fido

1번 Dog 객체

lucky

Page 16: Head First C# : 상상을 초월하는 객체지향 C# 학습법(개정3판)-미리보기

16

조, 밥, 앨은 경견장에 가는 걸 매우 좋아합니다. 하지만, 매번 갈 때마다 돈을 잃어서 애

로가 많습니다. 그래서 돈을 걸기 전에 어떤 개가 이길지를 알아낼 수 있는 시뮬레이터

를 만들어 달라고 부탁하는군요. 그리고 프로그램을 잘 만들어 주면 수익금도 나눠 주겠

다고 하네요.

C# 실습1경주 시뮬레이션

요구사항: 경주 시뮬레이터를 만들어 주세요 232

실습 과제 완성!!! 240

Page 17: Head First C# : 상상을 초월하는 객체지향 C# 학습법(개정3판)-미리보기

목차

17

비밀스러운 것은… private으로…5캡슐화

이벤트 플래너 캐슬린 242

견적 계산기에서 해야 할 일 243

캐슬린을 위한 프로그램 만들기 244

캐슬린, 프로그램을 테스트해 보다 250

각 옵션은 개별적으로 계산해야 합니다 252

객체를 잘못 사용하는 경우 254

캡슐화란 클래스에 있는 어떤 데이터를 은밀하게 숨기는 걸 뜻합니다 255

클래스에 있는 메서드와 필드에 대한 접근을 제어하고 싶다면 캡슐화 기법을 활용합시다 256

하지만 RealName 필드가 정말 안전할까요? 257

private 필드나 메서드는 클래스 내부에서만 접근할 수 있습니다 258

클래스 캡슐화에 관한 몇 가지 팁 265

캡슐화로 데이터를 소중하게! 266

속성을 쓰면 한결 더 쉽게 캡슐화할 수 있습니다 267

Farmer 클래스를 테스트하는 응용 프로그램을 만들어 봅시다 268

자동 속성으로 클래스를 완성해 봅시다 269

FeedMultiplier를 바꾸려면? 270

생성자를 이용한 private 필드 초기화 271

좀 더 은밀한 것을 원하시나요?

때때로 객체에서도 은밀한 것이 필요할 수 있습니다. 일기장이나 은행 거래내역서 같은 걸 안전하고 비밀스럽게 보

관하는 것과 마찬가지로 훌륭한 객체라면 다른 친구들이 마음대로 자기 내부를 휘젓고 다니지 못하게 할 수 있어

야 할 겁니다. 이 장에서는 캡슐화의 위력에 대해 알아볼 겁니다. 객체의 데이터를 남들로부터 숨기고, 그 데이터에

안전하게 접근하게 해 주는 메서드를 추가하는 방법도 배우게 됩니다.

파티 참가자 수

(1인당 25달러)헬씨 옵션?

주류 제공

(1인당 20달러)

팬시 데코레이션

주스 및 탄산음료

(1인당 5달러,

총비용 5% 할인)

주스 및 탄산음

료(1인당 15달

러 + 기본 장식

비 50달러)

주류 제공(1인당

7달러 50센트 +

기본 장식비 30

달러)

아니오

아니오

ciaAgent

kgbAgent

mi5Agent

Page 18: Head First C# : 상상을 초월하는 객체지향 C# 학습법(개정3판)-미리보기

목차

18

객체의 가계도6상속

캐슬린은 생일 파티도 준비해 준답니다 282

BirthdayParty 클래스를 만듭시다 283

파티 플래너 2.0 버전을 만들어 봅시다 284

혹시... 참가자 수가 12명이 넘어가면 100달러의 추가 비용을 받게 하는 것도 가능할까요? 291

클래스에서 상속을 활용하면 코드를 한 번만 작성해도 됩니다 292

우선 일반적인 부분부터 클래스 모형을 구축한 다음 더 구체적인 부분을 만듭니다 293

동물원 시뮬레이터를 만든다면? 294

서브 클래스에서 코드가 중복되는 것을 피하려고 상속을 사용합니다 295

동물마다 서로 다른 소리를 냅니다 296

동물 분류 방법 297

클래스 계층구조를 만듭시다 298

모든 서브 클래스에서는 베이스 클래스를 확장합니다 299

베이스 클래스로부터 상속받을 때는 콜론을 씁니다 300

상속을 사용하면 서브 클래스에 베이스 클래스의 필드, 속성, 메서드가 추가되는데… 303

서브 클래스에서는 메서드를 오버라이드해서 상속받은 메서드를 고칠 수 있습니다 304

베이스 클래스를 사용할 수 있는 곳이라면 어디든 서브 클래스를 대신 써도 됩니다 305

서브 클래스는 슈퍼 클래스에 있는 메서드를 숨길 수 있습니다 312

동작을 상속받으려면 override와 virtual 키워드를 사용하세요 314

서브 클래스에서는 base 키워드로 베이스 클래스에 접근할 수 있습니다 316

베이스 클래스에 생성자가 있으면 서브 클래스에도 생성자를 만들어야 합니다 317

이제 캐슬린의 프로그램을 완성해 봅시다! 318

벌집 관리 시스템을 만들어 봅시다 323

기본 시스템을 구축합시다 324

상속을 써서 벌 관리 시스템을 확장해 봅시다 331

부모님을 닮고 싶다는 생각을 해 본 적 있지 않나요?

혹시 여러분이 만들고자 하는 객체와 거의 똑같은 일을 해 주는 객체를 본 적이 있나요? 어떤 객체를 보고 ‘조금

만 고치면 딱 내가 필요로 하는 객체를 만들 수 있겠다’하는 생각이 들어본 적 있나요? C# 언어에서 가장 강력

한 개념이자, 가장 강력한 테크닉인 상속(inheritance)이 만들어진 배경에는 그런 생각이 담겨 있습니다. 이번 장

을 공부하고 나면 어떤 객체의 서브 클래스를 만들어서 필요한 행동은 그대로 받아오면서 유연성을 살려 고쳐야

할 게 있으면 고쳐서 쓰는 방법을 터득하게 될 겁니다. 중복된 코드를 피하면서 실제 세계와 더욱 유사한 모형을

만들고 더 관리하기 쉬운 코드를 만들 수 있게 될 거예요.

Canine

Eat()Sleep()

Dog

MakeNoise()Wolf

MakeNoise()

Page 19: Head First C# : 상상을 초월하는 객체지향 C# 학습법(개정3판)-미리보기

목차

19

약속 잘 지키는 클래스 만들기7 인터페이스와 추상 클래스

벌집 문제로 돌아가 봅시다 338

상속을 통해 여러 유형의 벌에 대해 서로 다른 클래스를 만들 수 있습니다 339

인터페이스란 클래스에 어떤 메서드와 속성을 반드시 구현해야 한다고 알려 주는 역할을 합니다 340

인터페이스를 정의할 때는 interface 키워드를… 341

이제 꿀도 따고 벌집도 지킬 줄 아는 NectarStinger 인스턴스를 만들 수 있습니다 342

인터페이스를 구현하는 클래스에는 인터페이스에 있는 모든 메서드가 들어가야만 합니다 343

인터페이스 연습 344

인터페이스로 인스턴스를 만들 순 없지만, 인터페이스를 참조하는 건 가능합니다 346

인터페이스 참조변수와 객체 참조변수 347

어떤 클래스가 특정 인터페이스를 구현하는지 알아내고 싶다면 ‘is’를 사용하면 됩니다 348

인터페이스의 상속 349

꿀을 먹지도 않고 일할 수 있는 RoboBee 4000 등장!! 350

is 연산자로 무엇을 구현하는지 알 수 있고, as 연산자로 어떻게 간주해야 할지

알려줄 수 있습니다 351

커피메이커도 가전제품이에요 352

업캐스팅과 객체, 인터페이스 353

다운캐스팅으로 가전제품을 커피메이커로 돌려놓기 354

업캐스팅, 다운캐스팅과 인터페이스 355

public, private 말고 다른 것도 있어요 359

접근 제한자와 영역 360

접근 제한자 돌아보기 361

인스턴스를 만들면 안 되는 클래스 363

추상 클래스는 클래스인가 아니면 인터페이스인가? 364

인스턴스를 만들면 안 되는 클래스도 있어요 366

추상 클래스에는 몸통이 없어요 367

다형성이란 한 객체가 여러 모양을 가질 수 있다는 것을 뜻합니다 375

백 번 말하는 것보다는 한 번 실천하는 것이 중요합니다.

때때로 객체가 어떤 클래스를 상속받는지보다는 어떤 일을 할 수 있는지를 기준으로 묶어 줘야 하는 경우가

있습니다. 그런 경우에 쓰이는 것이 바로 인터페이스(interface)입니다. 어떤 클래스든 같은 인터페이스를 구

현하면 같은 일을 할 수 있죠. 하지만 강력한 힘을 갖게 되면 그만큼 책임져야 할 것도 많아지는 법이죠. 어떤

클래스든 특정 인터페이스를 구현한다면 반드시 모든 의무를 이행해야 합니다. 그렇지 않으면 컴파일러가 가

만 두지 않을 거예요.

다형성

캡슐화

상속

추상화

거실

(Living Room)

식당

(DiningRoom)

부엌(Kitchen)앞마당

(Front Yard)

뒷마당

(Back Yard)

정원(Garden)

LocationNameExits

Description()

RoomDecoration

OutsideHot

Page 20: Head First C# : 상상을 초월하는 객체지향 C# 학습법(개정3판)-미리보기

목차

20

데이터 왕창 저장하기8열거형과 컬렉션

데이터 카테고리를 저장할 때 문자열이 만능은 아닙니다 396

열거형을 이용하면 쓸 수 있는 값을 열거할 수 있습니다 397

enum을 쓰면 숫자를 이름으로 표현할 수 있습니다 398

카드 한 벌을 만들기 위한 방법은? 401

까칠한 배열 402

List는 뭐든 간편하게 저장할 수 있어요 403

리스트는 배열보다 유연성이 좋습니다 404

리스트는 크기가 동적으로 바뀝니다 407

List 객체에는 어떤 유형이든 저장할 수 있어요 408

컬렉션 이니셜라이저는 객체 이니셜라이저와 비슷합니다 412

오리 리스트를 만들다 413

리스트는 사용하기 쉽지만 정렬하기는 까다로울 수 있습니다 414

IComparable<Duck>은 리스트에서 오리를 정렬하는 데 도움을 줍니다 415

IComparer로 리스트에 정렬 방법을 알려 주는 방식 416

IComparer 객체 인스턴스를 생성합시다 417

IComparer로 더 복잡하게 비교할 수도 있어요 418

ToString() 메서드를 오버라이드해서 객체 자신을 설명하도록 만들어 봅시다 421

Ducks와 Cards가 자신을 출력하도록 foreach문을 수정해 봅시다 422

foreach문을 작성할 때, IEnumerable<T>를 사용합니다 423

IEnumerable을 사용해서 리스트 전체를 업캐스팅할 수 있습니다 424

여러분 자신만의 오버로드된 메서드를 만들 수 있습니다 425

키와 값을 저장할 때는 딕셔너리를 쓰면 됩니다 431

딕셔너리에서 제공하는 기능 432

딕셔너리를 사용하는 프로그램을 만들어 봅시다 433

기타 컬렉션 유형 445

큐는 FIFO, 즉 선입선출 방식입니다 446

스택은 LIFO, 즉 후입선출 방식입니다 447

엎친 데 덮친 격

실생활에서는 데이터를 조금씩 찔끔찔끔 처리하는 일이 별로 없습니다. 보통 데이터가 한꺼번에 왕창 몰려옵니다.

따라서 다량의 데이터를 정리하기 위한 뭔가가 필요하고, 컬렉션(collection)이 바로 그런 경우에 쓸 수 있는 도구

입니다. 컬렉션으로 프로그램에서 사용할 데이터를 저장하고 정렬하고 관리할 수 있습니다. 데이터를 관리하는 부

분은 컬렉션에 맡겨버리고 우리는 데이터로 일을 처리하는 부분에 더 많은 시간을 할애할 수 있지요.

휘릭!

Page 21: Head First C# : 상상을 초월하는 객체지향 C# 학습법(개정3판)-미리보기

목차

21

FileStream 객체

FileStream 객체

69 117 114 101 107 97 33

마지막 바이트는 남겨 두세요9 파일 읽고 쓰기

데이터를 읽고 쓰기 위해 C#은 스트림을 사용합니다 454각양각색 스트림 455FileStream은 바이트 형태로 파일을 작성합니다 456간단한 3가지 단계만 거치면 파일에 텍스트를 쓸 수 있습니다 457사기꾼이 또 다른 음모를 꾸미고 있군요 458두 개의 객체로 읽고 쓰기 461데이터는 한 개 이상의 스트림을 거쳐갈 수 있습니다 462표준 대화상자를 보여 주려면 내장 객체를 사용하세요 465대화상자를 띄우는 ShowDialog() 465대화상자는 또 다른 WinForms 컨트롤의 하나일 뿐입니다 466대화상자 역시 객체입니다 467디렉터리와 파일에 대한 작업을 하려면 내장 File과 Directory 클래스를 사용하세요 468파일을 열고 저장하려면 OpenFileDialog와 SaveFileDialog를 사용하세요 471IDisposal은 객체들이 제대로 배치되었는지를 확인합니다 473using문을 사용해서 파일시스템 에러를 방지합시다 474직장에서의 갈등 475일반적으로 파일을 쓸 때 많은 결정을 해야 합니다 480올바른 선택을 하려면 switch문을 사용하세요 481switch문을 사용해서 파일로부터 카드를 읽거나 써 봅시다 482파일에서 카드를 읽는 오버로드된 Deck() 생성자를 추가하세요 483객체가 직렬화되면 무슨 일이 일어날까요? 485객체의 상태란 정확히 무엇을 말하는 걸까요? 뭐가 저장되어야 한다는 것일까요? 486객체가 직렬화될 때 객체의 모든 요소 역시 직렬화됩니다 487직렬화를 하면 한 번에 객체 전체를 읽거나 쓸 수 있습니다 488클래스가 직렬화되기 원한다면 [Serializable] 특성을 명시하세요 489카드를 직렬화 및 역직렬화해 봅시다 490.NET은 텍스트를 유니코드로 자동 변환합니다 493C#은 바이트 배열에서 데이터를 이리저리 옮길 수 있습니다 494이진 데이터를 쓰려면 BinaryWriter를 사용하세요 495다시 데이터를 읽어오려면 BinaryReader를 사용하세요 496수동으로 직접 직렬화된 파일을 읽고 쓸 수도 있습니다 497차이가 나는 부분을 찾아 해당 정보를 이용해 변경하세요 498이진 파일로 작업하는 것은 까다로울 수 있습니다 499헥스 덤프 프로그램을 만들려면 파일 스트림을 사용하세요 500StreamReader와 StreamWriter는 이상 없이 제대로 동작할 거예요 501스트림에서 바이트를 읽으려면 Stream.Read()를 사용하세요. 502

데이터를 지속적으로 남겨 둬야 될 때도 있습니다.

지금까지 여러분이 작성한 모든 프로그램은 단명했습니다. 프로그램이 일단 실행된 후 곧바로

죽었죠. 하지만 이것만으로는 뭔가 부족합니다. 특히, 중요한 정보를 다룰 땐 더욱 그렇죠. 작업

한 내용을 저장할 수 있어야 합니다. 이 장에서는 데이터를 파일에 쓰는 방법과 다시 파일에서 그

데이터를 어떤 식으로 읽어 내는지 배우게 될 것입니다. 이를 위해 .NET 스트림 클래스의 내용과

2진법, 16진법의 정체를 살펴보겠습니다.

Page 22: Head First C# : 상상을 초월하는 객체지향 C# 학습법(개정3판)-미리보기

22

C# 실습2퀘스트

주인공이 한 레벨씩 올라가면서 무시무시한 적들을 물리치는 퀘스트를 수행하는 어드벤

처 게임을 만들어야 합니다. 이 게임은 주인공과 적이 서로 한 턴씩 움직이는 턴 기반 시

스템으로 만들겠습니다. 주인공은 한 턴에서 이동이나 공격 둘 중 하나만 할 수 있지만 적

은 한 턴에 이동과 공격을 동시에 할 수 있습니다. 플레이어가 죽거나 7레벨에 있는 모든

적을 죽이면 게임이 끝납니다.

스펙: 어드벤처 게임 만들기 510

좀 더 재미있게 만들어 보세요! 530

Page 23: Head First C# : 상상을 초월하는 객체지향 C# 학습법(개정3판)-미리보기

목차

23

O

bservableCollec

tion

객체

ListBox 객체

앱을 다음 레벨로…10XAML로 윈도우 스토어 앱 디자인하기

브라이언은 윈도우 8을 사용합니다 532

윈폼은 IDE에서 준비된 객체 그래프를 사용합니다 538

객체 그래프를 탐험해 볼까요? 541

윈도우 스토어 앱은 XAML로 UI 객체를 만듭니다 542

고피시 폼을 윈도우 스토어 앱 페이지로 새롭게 단장해 봅시다 544

페이지 레이아웃과 컨트롤 546

페이지의 크기에 맞게 행과 열이 조절됩니다 548

그리드 시스템을 이용한 앱 페이지 레이아웃 550

데이터 바인딩으로 XAML 페이지를 클래스로 연결해 봅시다 556

XAML 컨트롤은 텍스트 외 많은 것을 담을 수 있습니다 558

데이터 바인딩으로 슬라피 조의 향상된 메뉴판을 만들어 봅시다 560

정적 리소스로 XAML의 객체를 선언해 봅시다 566

데이터 템플릿으로 객체를 표현하기 568

INotifyPropertyChanged는 바인딩된 객체를 갱신해 줍니다 570

GeneratedDate 속성이 바뀔 때 알림을 받아서 MenuMaker를 수정해 봅시다 571

우리는 앱 개발의 새로운 세계에 들어갈 준비가 되었습니다.

윈폼을 사용해서 윈도우 데스크톱 앱을 만드는 것은 C#의 중요한 개념을 배우는 데 좋은 방법입니다

만 윈도우 스토어 앱에서는 조금 더 많은 것을 할 수 있습니다. 이번 장에서는 XAML을 이용하여 윈도

우 스토어 앱을 디자인하고, 모든 장치에 맞게 페이지를 작성하는 방법과 데이터 바인딩을 이용해 데

이터를 페이지에 통합하는 과정을 배워 봅니다. 비주얼 스튜디오에서 XAML 코드로 만들어진 객체들

을 탐험하며 XAML 페이지에 대한 신비를 파헤쳐 봅시다.

그리드는 20픽셀 단위의 사각형

으로 구성 되어 있습니다.각 단위는 5픽셀

하위단위로 쪼개져

있습니다.

BindingItemsSource="{Binding}"

Page 24: Head First C# : 상상을 초월하는 객체지향 C# 학습법(개정3판)-미리보기

목차

24

실례합니다, 잠시만요!11데이터 컨트랙트 직렬화

브라이언의 파일에 문제가 생겼어요 580

반응적인 await 582

FileIO 클래스로 파읽을 읽고 써 봅시다 584

간단한 텍스트 편집기 만들기 586

데이터 컨트랙트는 객체 데이터의 추상화된 정의입니다 591

async 메서드로 파일을 찾아서 열어보기 592

KnownFolder는 자주 사용하는 폴더에 접근하는 데 도움을 줍니다 594

객체 그래프를 XML로 직렬화하기 595

Guy 객체를 XML로 만들어서 로컬 폴더에 보내 주세요 596

Guy Serializer의 시범운행 600

한 async 메서드로부터 다른 async 메서드 호출하기 601

새로운 변명 관리 앱을 만들어 봅시다 602

페이지와 Excuse, ExcuseManager로 나눠 봅시다 603

변명 관리 앱의 메인 페이지를 만들어 봅시다 604

메인 페이지에 앱 바 추가하기 605

ExcuseManager 클래스 만들기 606

페이지의 코드-비하인드 추가하기 608

아무도 기다리는 것을 원하지 않습니다. 그것이 꼭 사용자만은 아닙니다.

컴퓨터는 한 번에 많은 일을 처리합니다. 그러나 한 번에 많은 일을 처리하다 보면 하나의 일을 끝내는

데 대기시간이 길어질 수 있습니다. 이 장에서는 비동기 메서드로 앱이 즉각 반응하도록 유지하는 방

법을 배웁니다. 그리고 내장파일 피커, 메시지 대화상자, 대기시간을 줄여 주는 비동기 파일 입출력에

대해서도 배우게 될 것입니다. 마지막으로 데이터 컨트랙트 직렬화를 배우면 여러분은 완벽한 모던 앱

을 만들 수 있습니다.

Page 25: Head First C# : 상상을 초월하는 객체지향 C# 학습법(개정3판)-미리보기

목차

25

브라이언은 변명 관리 프로그램을 들고 다니려고 합니다 614

프로그램이 예외를 발생시키면 .NET은 Exception 객체를 생성합니다 618

브라이언의 코드도 예상치 못한 방식으로 동작했군요 620

모든 예외 객체는 Exception에서 상속받습니다 622

디버거를 사용해서 예외를 추적하고 방지해 보세요 623

디버거를 사용해서 변명 관리 프로그램의 문제를 살펴봅시다 624

어휴, 코드에 여전히 문제가 있네요 627

try와 catch로 예외를 처리합시다 629

위험한 메서드 호출 630

디버거를 사용해서 try/catch 흐름을 따라가 보죠 632

언제나 실행되는 코드를 작성하려면 finally 블록을 사용하세요 634

문제점에 대한 정보를 얻으려면 Exception 객체를 사용하세요 639

다양한 유형의 예외를 처리하려면 여러 개의 catch 블록을 사용하세요 640

한 클래스가 예외를 던지면 다른 클래스에 있는 메서드에서 그 예외를 잡아낼

수 있습니다 641

꿀벌은 OutOfHoney 예외가 필요합니다 642

많은 문제를 피하는 간단한 방법: using문을 사용하세요 645

예외 회피: 자기 자신을 삭제하려면 IDisposable을 구현하세요 646

역사상 최악의 catch 블록: 주석 648

일시적인 해결책도 당분간은 쓸모가 있습니다 649

예외 처리를 위한 몇 가지 간단한 팁 650

나중에는 불길 잡기가 힘들어요12예외 처리

프로그래머는 소방수가 아닙니다.

헤드 퍼스트 책과 수많은 기술 매뉴얼을 들고 허리가 휠 정도로 일해서 여러분은 드디어 마스터 프로

그래머로서 업계의 정상에 우뚝 서게 되었습니다. 하지만 작성했던 프로그램들이 충돌하거나 예상대

로 동작하지 않아서 여전히 코드를 뒤적이고 있을 것입니다. 이상한 버그를 수정하는 여러분을 도와

줄 수 있는 것은 아무것도 없습니다. 그러나 예외 처리를 이용하면 부딪치게 될 수많은 문제를 처리

하는 코드를 작성할 수 있습니다. 심지어 그러한 문제들에 반응해서 모든 것이 정상적으로 동작하도

록 유지할 수 있습니다.

Exception

int[] anArray = {3, 4, 1, 11}; int aValue = anArray[15];

예외 처리가 된

클래스사용자

프로그램을 더 강력하게!

public class Data {

public void

Process(Input i) {

try {

if (i.IsBad()) {

explode();

} catch {

HandleIt();

}

}

}

와, 이 프로그램은 정말 안정적이야!

안 돼! 무슨 일이

일어난거야?

객체

Page 26: Head First C# : 상상을 초월하는 객체지향 C# 학습법(개정3판)-미리보기

목차

26

뭔가를 할 수 있는 여러분의 마지막 기회… 객체 소멸자 662

정확히 언제 소멸자가 실행되는 걸까요? 663

Dispose()는 using을 사용하고 소멸자는 가비지 컬렉션을 사용합니다 664

소멸자는 안정성을 기대할 수 없습니다 666

Dispose()에서 직렬화하는 객체를 만들어 봅시다 667

구조체는 객체와 비슷합니다… 671

값은 복사되고, 참조는 할당됩니다 672

구조체는 값 유형이고 객체는 참조 유형입니다 673

무슨 일이 일어났는지 여기에 나와 있습니다 674

스택 vs 힙: 메모리 탐구 675

하나 이상의 값을 반환하는 메서드를 작성하려면 out 매개변수를 사용하세요 678

ref 제한자를 사용한 참조에 의한 전달 679

선택적 매개변수를 사용해서 기본 값을 설정하세요 680

존재하지 않는 값이 필요할 때는 nullable 유형을 사용하세요 681

Nullable 유형은 프로그램을 튼튼하게 만드는 데 도와 줍니다 682

회복 중인 캡틴 어메이징 685

확장 메서드는 기존 클래스에 새로운 기능을 추가합니다 686

기본 유형 확장하기: string 688

13 CAPTAIN AMAZINGTHE DEATH

OF THE OBJECT캡틴 어메이징

객체의 최후

Page 27: Head First C# : 상상을 초월하는 객체지향 C# 학습법(개정3판)-미리보기

목차

27

데이터 처리하기14쿼리와 LINQ

지미는 캡틴 어메이징의 슈퍼 팬입니다 694

그런데 그의 책이 넘치네요 695

LINQ는 다양한 소스에서 데이터를 추출해 낼 수 있어요 696

.NET 컬렉션은 이미 LINQ를 사용할 준비를 마쳤어요 697

LINQ를 사용하면 쿼리를 쉽게 작성할 수 있어요 698

LINQ는 간단한데, 쿼리는 복잡해요 699

쿼리 해부 700

지미는 도움이 필요합니다 702

지미의 앱을 만들어 봅시다 704

new 키워드를 사용해서 익명 유형을 만들어 봅시다 707

LINQ는 다재다능합니다 710

지미의 앱에 새 쿼리를 추가해 봅시다 712

LINQ 자석 연습문제 715

LINQ 자석 연습문제 정답 716

LINQ는 쿼리 결과를 묶어서 보여 줄 수 있습니다 717

값을 그룹으로 묶어봅시다 718

두 개의 컬렉션을 하나의 시퀀스로 합치려면 조인을 사용하세요 721

꽤 많은 돈을 절약한 지미 722

데이터를 탐색하기 위한 시맨틱 줌 사용하기 728

지미의 앱에 시맨틱 줌 추가하기 730

지미가 해냈습니다 735

데이터 탐색을 위한 분할 응용 프로그램(Split App) 템플릿 736

데이터 중심의 세계에 살고 있습니다. 어떻게 하면 더 나은 세상에서 살 수 있을까요?

지난 며칠 혹은 몇 주 동안 우리가 만들었던 프로그램들은 데이터를 처리하지는 않았습니다. 이 장에서

다루는 것은 전부 데이터에 관련된 것입니다. 여기에서 필요한 것이 바로 LINQ입니다. LINQ는 간단하면

서도 직관적인 방식으로 데이터를 질의할 뿐만 아니라 다른 데이터 소스에 있는 데이터들을 그룹 짓고 합

칠 수 있게 합니다. 여러분의 데이터를 관리 보관소에 맡기기만 하면, 윈도우 스토어 앱은 데이터를 처리

하여 사용자가 쉽게 데이터를 다룰 수 있게 해 줍니다. 심지어 데이터의 세부사항을 볼 수 있게 해 주죠.

Page 28: Head First C# : 상상을 초월하는 객체지향 C# 학습법(개정3판)-미리보기

목차

28

코드가 은밀히 처리하는 것15이벤트와 대리자

객체가 스스로 생각할 수 있다면 멋지지 않겠어요? 746

이벤트가 발생할 때 객체는 귀를 쫑긋 세우고 있습니다 747

한 객체에서 이벤트가 발생하면 다른 객체는 그 이벤트를 경청합니다 748

그러고 나서 다른 객체들이 이벤트를 처리합니다 749

점(.)으로 연결하기 750

IDE는 이벤트 핸들러를 자동으로 생성해 줍니다 754

제네릭 EventHandler를 사용하면 여러분 자신의 이벤트 유형을 정의할 수 있습니다 760

윈폼은 여러 가지 이벤트를 사용합니다 761

하나의 이벤트와 여러 개의 핸들러 762

이벤트와 프로세스 수명 관리 764

지미의 앱에 프로세스 수명 관리를 추가하기 765

XAML 컨트롤은 라우트된 이벤트를 사용합니다 768

라우트된 이벤트를 살펴봅시다 769

이벤트 송신자와 수신자 연결하기 774

대리자는 실제 메서드 대신 일해 줍니다 775

행동에 나선 대리자 776

한 객체는 한 이벤트를 구독할 수 있습니다 779

구독자를 통제하기 위해서 콜백을 사용해 봅시다 780

콜백은 단지 대리자를 사용하는 또 다른 패턴입니다 782

MessageDialog로 콜백을 사용할 수 있습니다 784

대리자를 이용하여 윈도우 참 설정 사용하기 786

객체들이 자기 자신에 대해 생각하기 시작했습니다.

객체들이 하는 일들을 계속 제어할 수는 없습니다. 가끔씩은 날벼락 같은 일이 일어나죠. 이럴 때 여러

분은 객체들이 발생하는 사건에 대해 반응할 수 있을 정도로 똑똑해지길 원합니다. 이벤트란 바로 이런

것이며, 그 이상도 이하도 아닙니다. 하나의 객체가 이벤트를 발행하면 다른 객체들은 그 이벤트를 구독

하고 함께 일하는 모든 사람들은 계속 자기 할 일을 하죠. 정말 대단한 점은 같은 이벤트에 반응하는 객

체들이 너무나 많다는 점인데, 이런 경우에는 콜백(callback)을 사용하면 매우 편리합니다.

Fan 객

Pitcher 객체

Umpire 객체

BallEvent 매

변수

~BallInPlay 이벤트

Page 29: Head First C# : 상상을 초월하는 객체지향 C# 학습법(개정3판)-미리보기

목차

29

헤드 퍼스트 농구 협회는 앱이 필요합니다 790

브라이언과 지미의 충돌 791

바인딩이나 데이터 작업을 위한 설계를 한다고요? 792

MVVM은 바인딩과 데이터를 디자인해 줍니다 793

MVVM 패턴으로 농구선발명단 앱을 만들어 봅시다 794

사용자 정의 컨트롤 797

심판은 스톱워치가 필요합니다 805

MVVM 패턴을 사용할 때, 앱의 상태를 고려해야 합니다 806

스톱워치 모델 만들기 807

이벤트는 상태변화를 알려 줍니다 808

스톱워치 뷰 만들기 809

스톱워치 뷰모델 추가하기 810

스톱워치 앱 완성하기 812

변환기는 바인딩을 이용해서 자동으로 값을 변환해 줍니다 814

변환기는 다양한 유형으로 작업할 수 있습니다 816

스타일은 컨트롤 유형의 외형을 바꿔줍니다 818

시각적 상태 변화에 따른 컨트롤의 반응 822

DoubleAnimation을 이용하여 두 값 표현하기 823

객체 애니메이션으로 객체 값 표현하기 824

같은 뷰모델을 이용하여 아날로그 스톱워치를 만들어 봅시다 825

UI 컨트롤도 인스턴스화할 수 있습니다 830

간단한 애니메이션 만들기 832

이미지 애니메이션을 위한 사용자 정의 컨트롤 만들기 833

벌이 날아다닙니다 834

TemsPanelTemplate을 이용하여 캔버스에 컨트롤을 바인딩해 봅시다 837

축하합니다(아직 끝난 건 아니에요)! 850

좋은 앱의 내부, 외부 구조16MVVM 패턴으로 앱 설계하기

앱이 가꾸어야 하는 것은 꼭 외면만이 아닙니다.

설계를 생각할 때 무엇이 떠오르나요? 큰 빌딩을 설계하는 것? 아름답게 배치된 페이지? 미적으로 즐

거움을 주면서 내부가 잘 설계된 제품들을 떠올리나요? 이러한 요소들이 여러분의 앱에 적용되어야

합니다. 이번 장에서는 MVVM(Model-View-ViewModel) 패턴과 결합도가 느슨하고 잘 설계된 앱

을 만드는 방법에 대해 배워 봅니다. 또한 애니메이션과 시각적인 디자인을 위한 컨트롤 템플릿을 배

우게 됩니다. 데이터 바인딩을 쉽게 해 주는 컨버터와 탄탄히 다져진 C# 기초를 토대로 여러분이 원하

는 어떤 앱이라도 만들 수 있습니다.

VIEWMODEL

Page 30: Head First C# : 상상을 초월하는 객체지향 C# 학습법(개정3판)-미리보기

30

C# 실습3인베이더(Invaders)

이번 실험실은 지난 몇 장에서 습득한 지식을 활용해 여러분이 작성하게 될 프로그램에 대

한 지침을 제공합니다.

비디오 게임의 산 증인 852

아직 할 일이 더 남아 있습니다… 873

Page 31: Head First C# : 상상을 초월하는 객체지향 C# 학습법(개정3판)-미리보기

목차

31

윈도우 폰 앱 만들기17보너스 프로젝트

벌들의 침입! 876

시작하기 전에… 877

이미 여러분은 윈도우 폰 앱을 만들 준비가 되었습니다.

클래스, 객체, XAML, 캡슐화, 상속, 다형성, LINQ, MVVM… 여러분은 윈도우 스토어 앱과 데스크톱 앱

을 만드는 데 필요한 기술들을 배웠습니다. 여러분이 배운 기술로 윈도우 폰 앱을 만들 수 있다는 사실

을 알고 계셨나요? 거짓이 아닙니다! 이번 보너스 프로젝트에서는 윈도우 폰을 위한 게임을 만들어 봅

니다. 윈도우 폰이 없으시다고요? 걱정하지 마세요. 여러분은 윈도우 폰 에뮬레이터로 게임을 실행할

수 있습니다. 자 그럼 시작해 볼까요!

Page 32: Head First C# : 상상을 초월하는 객체지향 C# 학습법(개정3판)-미리보기

목차

32

이 책에 넣고자 했던 11가지 내용부록 I 남은 것들

#1. 윈도우 스토어에는 엄청나게 많은 것이 있습니다 890

#2 C# 기초학습 892

#3 네임스페이스와 어셈블리 898

#4. BackgroundWorker를 사용해서 반응적인 윈폼을 만들어 봅시다. 902

#5. Type 클래스와 GetType() 905

#6. IEquatable, Equals( ), 동일한 것들에 대해서 906

#7. yield return으로 열거형 객체 생성하기 909

#8. 리펙터링 912

#9 익명 유형, 익명 메서드, 람다 표현식 914

#10 LINQ to XML (LINQ로 XML 데이터 조회하기) 916

#11 Windows Presentation Foundation 918

재미있는 것은 이제부터 시작됩니다!

지금까지 C#을 이용해서 강력한 소프트웨어를 만들기 위한 수많은 도구들을 소개하고 학습했지만, 이

책 한 권만으로 C#에 대한 모든 도구와 기술을 다룰 수는 없습니다. 이 책을 쓰면서 도대체 어떤 내용을

포함하고 어떤 내용을 제외해야 하는지 상당한 시간을 고민했습니다. 이 장에서는 이 책에서 언급하지

않은 내용 일부를 소개하고 있는데, 자세히 다루지는 않았지만 정말 중요하고 유용한 내용이며, 조금이

라도 도움이 되었으면 하는 바람입니다.

Page 33: Head First C# : 상상을 초월하는 객체지향 C# 학습법(개정3판)-미리보기

33

서문

여기에서는 ‘C# 프로그래밍 서적을 왜 이런 식으로 만들었을까?’하는

독자들의 궁금증을 해소해 보겠습니다.

세상에 이런 C# 책이

있다니 믿을 수가 없군요!

이 책의 활용 방법

Page 34: Head First C# : 상상을 초월하는 객체지향 C# 학습법(개정3판)-미리보기

34 서문

이 책을 사용하는 방법

누구를 위한 책일까요?

그러면 어떤 독자들에게 이 책이 맞지 않을까요?

다음의 질문 모두에 “예”라고 대답할 수 있다면…

다음의 질문 중 하나라도 “예”라고 대답할 수 있다면…

그렇다면 이 책은 바로 당신을 위한 책입니다.

그렇다면 이 책은 당신에게는 적합하지 않습니다.

C#을 배우고자 하십니까?1

책을 읽는 것에 그치지 않고 뭔가를 직접 해 봄으로써 배우길

원하십니까?2

지루하고 학구적인 강의보다는 파티에서의 즐거운 대화를

선호하십니까?3

수많은 코드를 보면 혼란스럽고 머리가 지끈거리는 증상이 있나요?1

레퍼런스 책을 원하는 전문적인 C++ 혹은 자바 개발자입니까?2

뭔가 색다른 것을 시도하는 것이 두렵습니까? 톡톡 튀는 옷을 입느

니 차라리 누더기 옷을 걸치고 다니는 편이 낫다고 생각하십니까?

C# 개념을 의인화해 놓은 책은 제대로 된 기술서가 될 수 없다고 생

각하십니까?

3

다른 프로그래밍 언어를 알고

있나요? 지금 바로 C#을 실무에서

쓰고 싶다고요?

이미 C# 개발 경험이 있지만,

XAML과 MVVM(Model-View-

ViewModel)과 윈도우 앱 스토어

개발을 조금 더 배우고 싶나요?

많은 양의 코드를 작성하며 연습하고

싶나요?

그렇다면 이 책을 보면 됩니다.

당신처럼 많은 사람이 이러한 이유로

이 책을 선택했습니다.

프로그래밍 경험이 없는 사람에게 이

책을 추천합니다. 호기심과 흥미만

있으면 돼요! 프로그래밍 경험이 없는

수많은 초보자가 이미 『Head First C#』

을 보며 C#을 배웠습니다. 여러분도 할

수 있습니다!

많은 독자들이 윈도우 7, 윈도우 2003 혹은 다른 버전의 윈도우를 사용하고 있습니다. 따라서 여러분이

어떤 버전의 윈도우에서든 사용할 수 있도록 정보를 제공할 겁니다(PDF 링크는 1장에 있습니다).

C#을 학습하기 위해서 윈도우 8이 꼭 필요하진 않습니다.

이 책에서는 .NET과 C#의 최신 기술을 담았습니다. 여기에 있는 많은 프로젝트는 마이크로소프트의

최신 버전인(이 책의 출판 시점에서) 윈도우 8을 기반으로 하고 있습니다. 그러나 저희는 윈도우 8 이

전 버전에서도 동작할 수 있도록 많은 노력을 기울였습니다. 여러분은 웹 사이트에 가서 바뀐 프로젝트의

PDF를 내려받으면 됩니다. 우리는 반복되는 페이지양을 최소화하기 위해 최선을 다했습니다. PDF 1

장에서는 대체한 내용이 많습니다. 그러므로 첫 번째 프로젝트를 위해 책을 건너뛸 필요가 없습니다.

2장에서는 다섯 페이지가 다릅니다. 3장부터 10장까지는 모든 버전의 윈도우를 사용할 수 있습니다.

주목

Page 35: Head First C# : 상상을 초월하는 객체지향 C# 학습법(개정3판)-미리보기

서문

지금 여기예요 � 35

“어떻게 이런 걸 제대로 된 C# 책이라고 할 수 있지?”

“이런 그림은 왜 집어넣었을까?”

“정말 이런 식으로 뭔가를 배울 수 있을까?”

여러분의 머리는 항상 새로운 것을 갈망합니다. 항상 뭔가 특이한 것을 기

다리고 찾고 있지요. 원래 두뇌란 그런 것이랍니다. 그리고 이런 특징은

생존을 위해 반드시 필요합니다.

그렇다면 일상적이고 흔하디 흔한, 너무나도 평범한 것을 접할 때는 어떤

일이 일어날까요? 두뇌에서는 정말 해야 하는 일(즉, 정말 중요한 것을 기

억하는 일)을 방해하는 것을 모두 거부하려고 합니다. 지루한 것을 굳이 기

억하려고 하지 않지요. 결국 흔해 빠진, 별로 중요할 것 같지 않은 내용은

‘중요하지 않은 것을 차단해 버리는’ 필터에서 걸러지고 맙니다.

그러면 두뇌는 무엇이 중요한지 어떻게 판단할까요? 어느 날 등산을 갔는

데 호랑이가 앞에 나타났다고 가정해 봅시다. 여러분의 머릿속에서는 무

슨 일이 일어날까요?

뉴런이 갑자기 폭발하면서 감정이 북받치게 됩니다. 화학 물질이 쭉쭉 솟

아나지요.

그래서 여러분의 두뇌에서는 다음과 같은 것을 깨닫게 됩니다.

이건 정말 중요한 거야! 잊어버리면 안 돼!

하지만 집이나 도서관에 있다고 상상해 봅시다. 안전하고 따뜻하며 호랑

이가 나타날 리가 없습니다. 거기에서 공부하고 시험을 준비하거나 직장

상사가 일주일 혹은 길어도 열흘 안에 모두 마스터하라고 하는 기술적인

문제를 공부하는 경우를 생각해 보세요.

한 가지 문제가 있습니다. 여러분의 두뇌는 명백히 중요하지 않은 내용을

저장하느라 중요한 내용을 저장할 자리가 모자라게 되는 것을 싫어합니

다. 호랑이나 화재의 위험, 파티에서 찍은 사진을 페이스북(Facebook)에

올려 놓지 않아야 하는 이유 같이 중요한 것을 저장하려면 쓸데없는 내용

은 무시하는 것이 낫지요.

그리고 두뇌에게 “여보게, 이 책이 아무리 지루하고 별 감흥이 느껴지지

않아도 이 내용은 정말 기억해야 한단 말이야”라고 말하는 것이 결코 쉽

지는 않습니다.

지금쯤 여러분은 이런 생각을 하고 있겠죠?

여러분의 두뇌는 이런 식으로 동작합니다

여러분의 두뇌는 이런 것을 중요하다고 여긴답니다.

여러분의 두뇌는 이런

것을 기억할 가치가

없다고 여긴답니다.

휴, 이 지루하고 따분한

책도 700페이지만

더 보면 되겠군.

Page 36: Head First C# : 상상을 초월하는 객체지향 C# 학습법(개정3판)-미리보기

36 서문

이 책을 사용하는 방법

우리는 헤드 퍼스트 독자를 학생 이라고 간주하겠습니다.

뭔가를 배우려면 무엇을 해야 할까요? 첫째로 어떤 것을 이해하고 잊어버리지 말아야 되겠죠. 여러분의 머

리에 지식을 밀어 넣자는 이야기는 아닙니다. 인지과학, 신경생물학, 학습 심리학 분야의 최근 연구 결과에

의하면 종이 위에 적혀 있는 텍스트만으로는 부족하다고 합니다. 머리가 쌩쌩하게 돌아가도록 하려면 다음

과 같이 하는 것이 좋습니다.

헤드 퍼스트 학습 원리

시각화하자. 단어만 있는 것보다는 그림을 사용하는 것이 훨씬 더 기억하기도 좋고 학

습 효과를 향상시킬 수 있습니다(기억 및 전이 분야 연구에 의하면 최대 89%까지 향

상된다고 합니다). 또한 그림을 사용하는 것이 이해하는 데도 더 좋습니다. 그림 안이

나 근처에 단어를 집어넣으면 그림 아래, 또는 그림과 동떨어진 위치에 집어넣는 경

우에 비해 그 내용과 관련된 문제를 성공적으로 해결할 가능성이 두 배 이상 올라간다

고 합니다.

좀 더 개인적이고 대화 형식의 문체를 사용하자. 최근의 연구에 의하면 내용을 딱딱하고 형식적인 말투로 설명

하는 경우에 비해 개인적인 대화를 나누는 듯한 문체로 설명하면 학습 후 테스트에서 40% 정도까지 더 나은 점수

를 받을 수 있다고 합니다. 강의를 하려 하지 말고 이야기를 들려주는 식으로 평이한 용어

를 사용해 보세요. 너무 심각한 말투는 별로 좋지 않습니다. 재미있는 디너 파티와 강의 중

에서 어떤 것에 관심이 더 쏠릴까요?

더 깊이 생각할 수 있도록 만들자. 즉, 뉴런을 활발하게 사용하지 않으면 머릿속에서 그

리 특별한 일이 일어나지 않습니다. 항상 독자에게 문제를 풀고 결과를 유추하고 새로운 지

식을 만들어낼 수 있는 동기, 흥미, 호기심, 사기를 불어넣을 수 있어야 합니다. 그리고 그렇

게 하려면 뭔가 도전의식을 고취시킬 수 있을 만한 연습문제, 질문, 그리고 양쪽 두뇌를 모

두 써야 하는 활동, 여러 감각을 활용할 수 있는 일을 제공해야 합니다.

독자가 계속해서 주의를 기울일 수 있도록 하자. 아마도 거의 모든 사람들이 ‘아, 이거 꼭 봐야 하는데, 한 페

이지만 봐도 졸려 죽겠네’라고 생각해 본 경험이 있을 것입니다. 사람의 두뇌는 언제나 일상적이지 않은 것, 재미있

고 특이한 것, 눈길을 끄는 것, 예상치 못한 것에 주의를 기울이게 됩니다. 새롭고 기술적인 내용을 배우는 것이 반

드시 지루해야 되는 것은 아닙니다. 지루하지만 않다면 여러분의 두뇌는 훨씬 더 빠르게 받아들일 수 있

을 것입니다.

독자들의 감성을 자극하라. 뭔가를 기억하는 능력은 그 내용이 얼마나 감성을 자극하는지에 따

라 크게 달라집니다. 자신이 좋아하는 것, 많은 관심을 가지고 있는 것은 매우 쉽게 기억할 수 있

습니다. 뭔가를 느낄 수 있으면 수월하게 기억할 수 있습니다. 뭐 그렇다고 해서 한 소년과 강아

지 사이의 가슴 뭉클한 사연 같은 것을 알아보려는 것은 아닙니다. 퍼즐을 풀어내거나 남들

이 모두 어렵다고 생각하는 것을 알았을 때, 다른 친구는 모르는 것을 더 정확하게 알게 되었

을 때 느끼게 되는 놀라움, 호기심, 재미, ‘오, 이럴 수가!’, 아니면 ‘내가 해냈어!’와 같은 감정을

느낄 수 있다면 배우는 과정에 크게 도움이 된다고 합니다.

Page 37: Head First C# : 상상을 초월하는 객체지향 C# 학습법(개정3판)-미리보기

서문

지금 여기예요 � 37

어떻게 하면 두뇌에서 이 내용을 중요하다고 생각하게 만들 수 있을까?

느리고 지루한 방법도 있고 빠르고 효율적인 방법도 있습니다. 느린

방법은 반복에 의지하는 것입니다. 같은 내용을 계속 반복해서 주입

하면 아무리 재미없는 내용이라도 배우고 기억할 수 있습니다. 충분

히 여러 번 반복하다 보면 ‘사실 별로 중요한 것 같진 않지만 똑같은

걸 계속 반복해서 보고 있으니 일단 기억은 해 주자’라는 생각이 들겠죠.

빠른 방법은 두뇌 활동, 그중에서도 서로 다른 유형의 두뇌 활동을 증가시킬 수 있는 방

법을 활용하는 것입니다. 앞 페이지에 있는 내용은 모두 이렇게 두뇌 활동을 증가시키기

위한 것이며, 학습 과정에 도움이 된다고 밝혀진 방법입니다. 예를 들어 어떤 단어를 설

명하는 그림 안에 그 단어를 넣어 두면 (그림 밑에서 그림을 설명하거나 본문에서 설명하

는 경우에 비해) 그 단어와 그림 사이의 관계를 이해하기 위해 두뇌가 활발하게 움직이

면서 더 많은 뉴런이 활성화됩니다. 더 많은 뉴런이 활성화되면 뇌에서 그 내용을 집중

해서 살펴볼 가치가 있는 것이라고 인식할 가능성이 높이지고, 결과적으로 기억할 수 있

는 확률도 높아지겠죠.

대화하는 듯한 문체가 더 나은 이유는, 보통 대화를 할 때 상대방이 하는 말을 들으면서

그것을 이해하고 내용을 따라잡기 위해 노력하기 때문입니다. 그리고 더 중요한 것은 그

런 대화가 책과 독자 사이의 대화인 경우에도 우리의 뇌에서는 별로 다르게 느끼지 않는

다는 점입니다. 하지만 문체가 딱딱하고 재미없으면 수백 명의 학생이 대형 강의실에 앉

아서 건성으로 수업을 들을 때와 마찬가지로 학습 효과가 떨어진다고 합니다.

하지만 그림과 대화형 문체가 전부는 아닙니다.

정말 배우고 싶다면, 더 빨리 그리고 자세하게 배우고 싶다면 자신이 어떤 식으로 주

의를 기울이는지에 대해 주의를 기울일 필요가 있습니다. 생각하는 방법에 대해 생각

해 보고, 학습하는 방법에 대해 배워야 합니다.

대부분의 사람들은 학창시절에 초인지(Metacognition) 또는 학습 이론 등에 대해 배

운 적이 없을 것입니다. 그냥 배워야 했을 뿐, 배우는 방법은 배우지 못했을 것입니다.

일단 이 책을 읽고 있는 독자라면 C#을 이용해 프로그램을 만드는 방법을 배우고 싶

어서 읽고 있는 것이겠죠? 그리고 가능하면 빠른 시간 안에 배우고 싶을 것입니다. 이

책을 볼 때, 그리고 어떤 형태로든지 공부를 할 때 최대한 많은 것을 얻어내려면 두

뇌를 자유자재로 쓸 수 있어야 합니다. 자신의 두뇌를 그 내용에만 집중해야 합니다.

그렇게 하려면 여러분의 두뇌에서 새로 배우는 내용을 아주 중요한 것,

생존에 필수적인 것이라고 느끼게 만들어야 합니다. 즉, 호랑이만큼이

나 중요하다고 느끼게 만들어야 합니다. 그렇지 않으면 새로운 내용을

받아들이지 않으려고 하는 두뇌와 끊임없이 씨름할 수밖에 없습니다.

초인지: 생각하는 것에 대해 생각하는 것

어떻게 하면 내

머릿속에서 이 내용을

중요하다고 생각하게

만들 수 있을까?

Page 38: Head First C# : 상상을 초월하는 객체지향 C# 학습법(개정3판)-미리보기

38 서문

이 책을 사용하는 방법

이 책에서는 이렇게 했습니다이 책에는 그림이 많습니다. 여러분의 두뇌는 문자 위주의 텍스트보다는 시각적인 쪽에 더

민감하게 반응하기 때문이지요. 두뇌에서 받아들이는 정도를 생각해 보면 그림 한 장이 수

천 개의 단어보다 낫습니다. 백문이 불여일견이라는 말이 정말 딱 맞습니다. 그리고 텍스트

와 그림을 함께 사용할 때 텍스트를 그림에 포함시켰습니다. 텍스트를 그림 밑에 설명하는

식으로 적어놓거나 다른 곳에 있는 텍스트에 적어놓기보다는 그림 안에 넣었을 때 더 교육

효과가 좋기 때문이죠.

이 책에서는 같은 내용을 서로 다른 방법으로, 서로 다른 매체를 통해서 여러 감각을 거쳐서

전달하여 설명한 내용이 머리에 더 쏙쏙 잘 들어갈 수 있도록 했습니다. 여러 번 반복하면 그

만큼 효과가 좋아지니까요.

개념과 그림을 예상하기 힘든 방식으로 활용했습니다. 여러분의 두뇌는 새로운 것을 더 잘 받아들이

기 때문입니다. 그리고 그림과 개념을 통해 감성을 자극할 수 있도록 했습니다. 두뇌에서 어떤 감흥

을 불러일으킬 만한 것을 더 빠르게 받아들이기 때문이지요. 독자가 뭔가를 느낄 수 있다면 그만큼 머

릿속에 오래 남습니다. 그 감정이 사소한 유머, 놀라움, 홍미거리 같은 것에 불과할지라도 말이죠.

이 책에서는 개인적인 대화를 하는 듯한 문체를 사용했습니다. 여러분의 두뇌는 앉아서 강의

를 듣는다고 느낄 때보다는 상대방과 대화를 한다고 느낄 때 더 집중을 잘하기 때문이지요.

책을 읽을 때도 마찬가지입니다.

이 책에는 수십 가지의 연습문제가 있습니다. 어떤 것에 대한 내용을 읽을 때보다는 실제로

어떤 일을 할 때 더 잘 배울 수 있고 더 잘 기억할 수 있기 때문입니다. 그리고 문제의 난이도

는 조금 어려운 느낌이 드는 정도로, 하지만 어느 정도 노력하면 풀 수 있을 정도로 맞추었습

니다. 대부분의 독자들이 좋아할 만한 정도의 난이도로 맞추었으니 꼭 풀어보시기 바랍니다.

그리고 여러 가지 학습 유형을 섞어서 사용했습니다. 단계별로 공부하는 쪽을 선호하는 독자

들도 있지만, 큰 그림을 먼저 파악하는 것을 좋아하는 독자들도 있고, 코드 예제만 보면 된다

고 생각하는 독자들도 있기 때문입니다. 하지만 어느 것을 더 좋아하든 같은 내용을 여러 방

법으로 표현하는 방식은 모든 독자들에게 도움이 될 것입니다.

독자들의 양쪽 뇌를 모두 사용할 수 있는 내용을 포함시켰습니다. 두뇌의 더 많은 부분을 사

용할수록 더 많은 것을 배우고 기억할 수 있으며, 더 오랫동안 집중할 수 있기 때문이지요. 한

쪽 두뇌를 사용하고 있을 때는 나머지 한쪽 두뇌가 쉴 수 있기 때문에 더 오랜 시간 동안 공

부할 때도 높은 효율을 유지할 수 있습니다.

두 가지 이상의 관점을 보여 주는 이야기와 연습문제를 포함시켰습니다. 자신이 직접 어떤 것

을 평가하거나 판단을 하면 더 깊이 이해할 수 있기 때문이지요.

독자 여러분의 도전 의식을 고취시킬 수 있을만한 연습문제와 뚜렷한 정답이 없는 질문을 포

함시켰습니다. 여러분의 두뇌는 실제로 뭔가를 할 때 더 많은 것을 배우고 더 잘 기억할 수

있기 때문이지요(체육관에서 운동하는 사람들을 쳐다보기만 하는 것으로는 운동이 될 턱이

없죠? 공부하는 것도 똑같습니다). 하지만 항상 열심히 할 가치가 있는 것만 열심히 할 수 있

도록 노력했습니다. 너무 이해하기 힘든 예제를 붙잡고 낑낑대거나 어려운 전문 용어만 잔뜩

들어 있는 짤막한 문장을 해석하느라 머리가 아픈 일은 없도록 했습니다.

이 책에서는 여러 명의 사람들이 등장합니다. 이야기나 예제, 그림 등에 말이지요. 사람들은

사물보다는 사람에게 더 많은 관심을 가지게 된다고 합니다.

핵심정리

난롯가 담소

청사진을 만들 때 집 내부 구조물의

배치도를 그려 넣듯이 클래스를 선언할 때

메서드를 정의합니다.

청사진 하나로 똑같은 집을 여러 채 지을 수 있는 것처럼 클래스 하나로 객체를 여러 개 만들 수 있습니다.

Page 39: Head First C# : 상상을 초월하는 객체지향 C# 학습법(개정3판)-미리보기

서문

지금 여기예요 � 39

이제 남은 것은 여러분의 몫입니다. 여기에 나와 있는 팁에서부터 시작해 보세요. 자

신의 두뇌에서 어떤 반응을 보이는지 살펴보고 어떤 것이 적절하고 어떤 것이 부적절

한지 알아 봅시다. 항상 새로운 것을 시도해 보세요.

물을 마십시다. 될 수 있으면 많이 마시는 것이 좋습니다.

머리가 잘 돌아가려면 물이 많이 필요합니다. 수분이

부족하면(목이 마르다는 느낌이 들면 수분이 부족한

것입니다) 인지기능이 저하됩니다.

잠자리에 들기 직전에 마지막으로 이 책을 읽어 보세요.

일단 코딩을 많이 해 보세요.

프로그램을 배우는 방법은 딱 한 가지뿐입니다. 바로

많은 코드를 작성하는 것이며, 이 책 전체를 통해 여러

분이 하게 될 것들입니다. 코딩에 능숙해지는 지름길

은 연습밖에 없습니다. 건너뛰지 말고 모든 연습문제

를 꼭 풀어보세요. 문제를 해결하면서 많은 것을 배울

수 있습니다. 문제를 풀다가 막힐 때 정답을 보는 것

에 주저하지 마세요(사소한 문제로 막힐 가능성이 큽

니다)! 하지만 정답을 보기 전에 문제를 풀려고 노력

해야 합니다. 이렇게 하면 다음 장으로 넘어가기 전에

확실히 이해할 수 있을 거예요.

자신의 뇌의 반응에 귀를 기울여 봅시다.

뭔가를 느껴봅시다!

여러분의 두뇌가 지금 공부하는 것이 중요하다고 느낄

수 있어야 합니다. 책 속에 나와 있는 이야기에 몰입해

보세요. 그리고 책에 나와 있는 사진에 직접 제목을 붙

여 보세요. 아무것도 느끼지 않는 것보다는 썰렁한 농

담을 보고 비웃기라도 하는 쪽이 낫습니다.

여러분의 두뇌가 너무 힘들어하고 있지는 않은지 관심

을 가져봅시다. 대강 훑어보고 있거나 방금 읽은 것을

바로 잊어버린다는 느낌이 들면 잠시 쉬는 것이 좋습

니다. 일단 어느 정도 공부를 하고 나면 무조건 파고든

다고 해서 더 빨리 배울 수 있는 것이 아닙니다. 오히

려 공부하는 데 방해가 될 수도 있습니다.

새로 배운 것을 소리 내어 말해 봅시다.

소리 내어 읽을 때는 두뇌에서 눈으로 읽기만 할 때와

는 다른 부분이 활성화됩니다. 뭔가를 이해하려고 하

거나 나중에 더 잘 기억하고 싶다면 크게 소리를 내어

말해 보세요. 다른 사람한테 설명하면 더 좋습니다. 더

바르게 배울 수 있는 데다가 책을 읽는 동안에는 몰랐

던 것도 새삼 알게 될 수 있기 때문입니다.

학습 과정의 일부(특히 장기 기억으로의 전이 과정)는

책을 놓은 후에 일어납니다. 여러분의 두뇌에서 어떤

처리 과정을 처리하는 데에는 시간이 필요하기 때문

이죠. 그런 처리 작업 중간에 다른 것이 끼어들면 새로

배운 것을 잊어버릴 가능성이 높아집니다.

“바보 같은 질문이란 없습니다” 부분을 반드시 읽어 보세요.

반드시 모두 읽어보세요. 그냥 참고 자료로 수록한 것

이 아니라 이 책의 핵심 내용의 일부분입니다.

천천히 하세요. 더 많이 이해할수록 외울 내용은 줄어들게

마련입니다.

그냥 무작정 읽지 맙시다. 잠깐씩 쉬면서 생각을 해 봅

시다. 책에 있는 질문을 보고 바로 정답으로 넘어가면

안 됩니다. 누군가 다른 사람이 정말로 질문을 하고 있

다고 생각해 보세요. 더 깊이, 신중하게 생각할수록 더

잘 배우고 기억할 수 있습니다.

잘라서 냉장고 문에 붙여 놓으세요.

두뇌를 정복하는 방법

연습문제를 꼭 풀어봅시다. 간단하게 메모를 하는 것도 좋습니다.

연습문제는 독자들을 위해 수록한 것입니다. 그냥 답만 보고

넘어가면 다른 사람이 대신 운동을 해 주는 것을 구경하는 것

과 마찬가지입니다. 반드시 직접 필기도구를 들고 문제를 해

결해 봅시다. 실제로 배우는 과정에서 몸을 움직이는 것이 배

우는 데 도움이 된다고 합니다.

1

2

3

4

5

6

7

8

9

Page 40: Head First C# : 상상을 초월하는 객체지향 C# 학습법(개정3판)-미리보기

40 서문

이 책을 사용하는 방법

이 책은 Visual Studio Express 2013 for Windows와 Visual Studio Express 2013 for Windows Desktop을 사용해 작성했습

니다(두 버전 모두 설치하세요). 이 책에 나오는 모든 화면도 Visual Studio Express 2013이므로 이 버전을 사용하세요. Visual

Studio 2013 Professional, Premium, Ultimate 혹은 Test Professional 에디션을 사용해도 됩니다. 그러나 이 책의 내용과 약간

의 차이가 있을 수 있습니다(하지만 연습문제를 코딩하는 데 문제가 되지는 않습니다).

이 책의 학습을 위해 필요한 것

꼭 윈도우 8이 필요한 것은 아닙니다. 윈도우 7, 윈도우 2003 혹은 다른 이전 버전의 윈도우 사용자들도 이 책을 볼 수 있습니다. 이에 해당한다면, 세심하게 신경 써서 만든

윈도우 스토어 프로젝트의 대체 버전인 무료 PDF를 받으세요. 여러분이 해야 할 것은 다음과 같습니다.

¥ 이 책의 웹 사이트에서 WPF 파일을 다운로드하세요(http://www.hanbit.co.kr/exam/2165). PDF 1장에서는 대부분이 바뀌었고, 2

장에서는 다섯 페이지가 다릅니다.

¥ 3장에서 9장 사이에 나오는 두 개의 실습은 윈도우 8로 하지 않아도 됩니다. 이 실습들은 Visual Studio 2010(심지어는 2008)에서도

동작합니다. 그러나 이 책의 화면과는 다를 것입니다.

¥ 그리고 나머지 부분은, PDF의 WPF(Windows Presentation Foundation)를 이용해서 윈도우 스토어 앱(윈도우 8이 필요합니다) 대신

데스크톱 앱으로 중요한 C#의 개념을 배우게 됩니다.

이 책은 Visual Studio 2013 Express 에디션에서 테스트했습니다(원서

는 Visual Studio 2012 Express로 되어 있습니다. 화면이 조금 다를 수

있지만, 실습하는 데 문제가 없습니다). 향후 최신 버전이 나올 거지만, 마이

크로소프트는 보통 이전 버전을 다운로드할 수 있게 만들어 놓습니다.

Visual Studio 2013 Express 에디션

¥ Visual Studio Express 2013 for Windows는 마이크로소프트의 웹 페이지에서 무료로 다운로드할 수 있습니다. 다른 에디션과 이전

버전들도 여기에서 다운로드할 수 있습니다. http://www.visualstudio.com/downloads/download-visual-studio-vs

30일 안에 Visual Studio에 Microsoft 계정으로 로그인하면 여러 컴퓨터에서 설정을 동기화하고 제품을 등록할 수 있습니다.

“지금 설치”를

클릭해서 비주얼

스튜디오를

다운로드하세요.

첫 장부터 시작하거나, ‘부록: 남은 것들(이 책에 넣고자 했던 11가지 내용)’을 읽고 시작하셔도 무방합니다!

Page 41: Head First C# : 상상을 초월하는 객체지향 C# 학습법(개정3판)-미리보기

서문

지금 여기예요 � 41

마지막으로 알아 둬야 할 몇 가지이 책은 레퍼런스용 책이 아니라 학습서입니다. 그래서 내용 설명에 방해될 만한 부분은 최대한 생

략했습니다. 그리고 이 책은 앞에서 배운 내용을 알아야만 뒷부분의 내용을 이해할 수 있는 형태로

만들었으므로 적어도 처음 읽을 때는 맨 앞부터 순서대로 읽어야 합니다.

연습문제는 꼭 풀어봐야 합니다.

연습문제, 퍼즐, 독자들이 직접 풀어보라고 해 놓은 부분들은 그냥 장식품이 아닙니다. 엄연히 이

책의 핵심 요소입니다. 암기하는 데 도움을 주기 위한 것도 있고, 이해하는 데 도움을 주기 위한 것

도 있고, 배운 내용을 응용하는 데 도움을 주기 위한 것도 있습니다. 연습문제는 절대로 건너뛰지

맙시다. 수영장 퍼즐을 꼭 풀어볼 필요는 없지만 용어나 단어들을 다른 관점에서 생각해 볼 만한

좋은 기회라고 생각하고 풀어보세요.

중복되어 있는 내용들은 일부러 그렇게 해 놓은 것이며, 중요합니다.

헤드 퍼스트 시리즈가 다른 책들과 가장 크게 다른 점은, 여러분이 제대로 알고 넘어가도록 만들

었다는 데 있습니다. 이 책을 다 읽었을 때 배운 것을 최대한 많이 기억할 수 있어야 합니다. 레퍼

런스 서적들은 독자들이 확실히 기억하는 것을 주된 목표로 만들어진 책이 아닙니다. 하지만 헤

드 퍼스트 시리즈는 학습을 위한 책이기 때문에 같은 개념이 여러 번 반복적으로 등장하는 것을

볼 수 있을 것입니다.

모든 연습문제는 꼭 풀어보세요.

이 책을 읽는 여러분이 C#을 사용해서 프로그램을 작성하고 싶어한다는 가정하에 이 책을 만들었

습니다. 여러분이 구더기가 무서워 장도 못 담글 것이라 생각하지 않습니다. 모든 연습문제를 풀

어봄으로써 자신의 실력이 한층 발전한 것을 발견하게 될 것입니다. 특히 ‘직접 해 봅시다!’라고 표

시한 부분에서는 차근차근 한 단계씩 밟아가면서 특정 문제를 해결하도록 구성했습니다. 또한 운

동화 로고가 있는 연습문제에는 여러분이 해결해야 할 문제와 정답을 배치했습니다. 먼저 문제를

풀기 위해 노력한다면 정답을 보는 것을 창피하게 생각할 필요는 없습니다.

이 책의 코드 예제들은 http://www.hanbit.co.kr/exam/2165 웹 사이트에서 내려받을 수 있습

니다.

‘브레인 파워’ 연습문제는 정답이 없습니다.

어떤 문제에는 아예 정답이라는 게 있을 수 없고, 어떤 문제에서는 문제 자체에서 독자들이 내린

결론이 과연 맞을지, 어떤 상황에서 맞는지를 결정해야 할 수도 있습니다. 브레인 파워 연습문제

중에는 올바른 방향을 알려줄 만한 힌트가 들어 있는 것도 있습니다. 여러분의 머리를 적극적으

로 활용하세요!

어려운 개념을 이해하기 쉽게

그림을 많이 넣었어요.

‘연필을 깎으며’ 문제를

모두 풀어봐야 합니다.

운동화 로고가 있는 연습문제는 정말 중요합니다! 정말 C#을 배우고 싶다면 건너뛰지 마세요.

수영장 퍼즐을 꼭 풀어보라고

강요하진 않겠지만, 논리적인

함정에 빠지지 않으려면

풀어보는 게 좋을 거예요.

mi5Agent

ciaAgent

Page 42: Head First C# : 상상을 초월하는 객체지향 C# 학습법(개정3판)-미리보기

42 서문

테크니컬 리뷰팀

테크니컬 리뷰팀

이 책을 검토하신 분들

책의 완성도를 높여 준 뛰어난 테크니컬 리뷰어 덕분에 여러분이 읽고 있는 이 책은 오류가 거의 없습니다. 이 분들께 감사

드립니다. 아주 뛰어난 검증 팀이 없었더라면 커다란 오류를 담은 채로 책을 출간했을 거예요.

먼저 이 책을 좀 더 읽기 쉽게 도와주신 리사 켈너에게 깊은 감사를 드립니다. 그녀가 도와준 것이 벌써 아홉 번째예요. 고

마워요 리사! 그리고 수많은 조언을 해 주신 크리스 버로스, 레베카 둔-크렌, 데이빗 스털링에게도 특별히 감사를 드립니

다. 그리고 첫 번째 에디션을 검토해 준 조 알바하리와, 존 스킷에게 감사를 드립니다. 두 번째 에디션을 검토해 준 닉 팔

라디노에게도 감사를 드립니다.

크리스 버로스는 마이크로소프트의 C# 컴파일러팀 개발자로, C# 4.0의 언어적 특성에 대한 설계와 구현을 담당했다.

레베카 둔-크랜은 세마포어 솔루션(빅토리아, 캐나다에서 .NET 응용 프로그램을 전문으로 하는 커스터마이징 소프트웨

어 회사)의 창립 파트너이다. 그녀는 남편인 토비아스와 자녀인 소피아와 세바스티안 그리고 고양이, 세 마리의 닭과 함께

빅토리아에 살고 있다.

데이빗 스털링은 3년이 넘게 비주얼 C# 컴파일러팀에서 일하고 있다.

조니 할리프는 웹 스타트업인 Mural.ly 수석 아키텍트이자 공동 창업자이다. Mural.ly는 사용자들이 벽화(?)를 만들 수 있

도록 도와준다(하나의 큰 공간에 다양한 컨텐츠를 쉽고 유연하게 수집하는 환경 제공 - http://murally.com). 조니는 클

라우드와 높은 확장성 솔루션의 전문가이다. 그는 열정적인 러너(runner)이고 스포츠 펜이다.

리사 켈너

그 외 : 조 알바하리, 제이 힐야드, 아얌 싱,

테어도르, 피터 리치, 빌 미텔스키, 엔디

파커, 웨인 브래드니, 데이브 머독, 브리짓

줄리 랜더스, 닉 팔디노, 데이비드 스터링.

그리고 앨런 올렛 T. 그레이엄 독자와 책의

잘못된 부분을 알려준 많은 독자들에게

감사합니다!!

데이빗 스털링조니 할리프

크리스 버로스

레베카 둔-크렌

Page 43: Head First C# : 상상을 초월하는 객체지향 C# 학습법(개정3판)-미리보기

서문

지금 여기예요 � 43

감사의 글

편집자에게 …이 책의 편집자인 코트니 내쉬에게 감사드립니다.

그 밖에도 많은 오라일리 팀원들께 감사드립니다. 특히 꼼꼼하게 교정을 봐준 멜

라니 야브로우, 트라우만-제이그, 레이첼 모나한에게 감사드립니다. 자진해서

시간을 내주고 이 책이 나오는 순간에 유일하게 온전한 정신으로 도움을 준 론

빌도우에게 감사드립니다. 언제나 사랑하는 메리 트레슬러, 당신과 일하게 될 날

을 손꼽아 기다릴게요. 앤디 오럼, 마이크 핸드릭슨, 로리 페트리키, 팀 오라일

리 그리고 샌더스 클라인 펠트에게 감사드립니다. 출판업계에서 최고로 명성이

높은 팀의 마르세 헤논, 사라 페이튼에게도 감사드립니다.

오라일리팀

코트니 내쉬

Page 44: Head First C# : 상상을 초월하는 객체지향 C# 학습법(개정3판)-미리보기
Page 45: Head First C# : 상상을 초월하는 객체지향 C# 학습법(개정3판)-미리보기

새로운 장입니다    45

C# 시작하기1

멋진 앱을 정말 빨리 만들고 싶습니까?

C#을 쓰면 강력한 프로그래밍 언어와 훌륭한 도구를 자유자재로 활용할 수 있습니다. 그리고

비주얼 스튜디오 IDE를 이용하면 버튼이 제대로 작동하게 만들려고 복잡한 코드를 가지고

오랫동안 씨름할 필요도 없죠. 게다가 버튼에 대한 적은 양의 코드로 멋진 소프트웨어를 만들

수 있습니다. 뭔가 끌리는 느낌이 드나요? 그러면 다음 페이지로 넘어가서 프로그래밍을

시작해 봅시다.

멋진 뭔가를 빠르게 만들어 봅시다!

길고 험난한 여정을 위한 준비가 되었어!

Page 46: Head First C# : 상상을 초월하는 객체지향 C# 학습법(개정3판)-미리보기

46    Chapter 1

C#을 배워야 하는 이유C#과 비주얼 스튜디오 IDE를 이용하면 코드를 쉽고 빠르게 작성할 수 있습니다.

C#에서 IDE는 여러분의 가장 좋은 친구이자 든든한 동반자입니다.

C#을 쓰면 편리합니다

비주얼 스튜디오와 C#의 장점

C#과 같이 윈도우 프로그래밍용에 특화된 언어와 비주얼 스

튜디오 IDE를 활용하면 번거로운 부분은 여러분이 할 필요

가 없어집니다.

IDE에서는 이런 걸 자동으로 해 준답니다

프로그램을 만들기 시작하거나 폼에 버튼 하나라도

추가하려면 매번 반복적인 코드를 왕창 작성해야만

합니다.

using System;

using System.Collections.Gen

eric;

using System.Windows.Forms;

namespace A_New_Program

{ static cla

ss Program

{ /// <s

ummary>

/// The main entry p

oint for the application.

/// </summary>

[STAThread]

static void Main()

{ Ap

plication.EnableVisualStyles

();

Application.SetC

ompatibleTextRenderingDefaul

t(false);

Application.Run(

new Form1());

} }}

private void InitializeComponent(){ this.button1 = new System.Windows.Forms.Button(); this.SuspendLayout(); // // button1 // this.button1.Location = new System.Drawing.Point(105, 56); this.button1.Name = “button1”; this.button1.Size = new System.Drawing.Size(75, 23); this.button1.TabIndex = 0; this.button1.Text = “button1”; this.button1.UseVisualStyleBackColor = true; this.button1.Click += new System.EventHandler(this.button1_Click);

// // Form1 // this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 16F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.ClientSize = new System.Drawing.Size(292, 267); this.Controls.Add(this.button1); this.Name = “Form1”; this.Text = “Form1”; this.ResumeLayout(false);}

폼에 버튼을 그리는 데만 해도 이렇게 많은 코드가 필요합니다. 폼에 시각적인 요소를 몇 개만 더 추가해도 코드는 열 배도 넘게 불어나고 말죠.

데이터 접근

C#, .NET 프레임워크, 비주얼

스튜디오 IDE에는 프로그래밍

작업의 대다수를 차지하는

지루한 코드를 처리하는 구조가

내장되어 있습니다.

.NET 프레임워크 솔루션

이렇게 폼 나는 응용 프로그램을 훨씬 짧은 시간 안에 만들 수 있죠.

IDE(비주얼 스튜디오 통합 개발 환경)

는 C#을 사용하는 데 매우 중요합니다.

코드를 편집하고, 파일을 관리하고, 앱을

윈도우 스토어에 배포하는 것을 도와주는

프로그램이죠.

비주얼 객체

Page 47: Head First C# : 상상을 초월하는 객체지향 C# 학습법(개정3판)-미리보기

C# 시작하기

지금 여기예요 � 47

 응용 프로그램을 빠르게 만들 수 있습니다. C#을 사용하면 간단하게 프로그램을 만들 수

있습니다. 언어 자체가 강력하면서도 배우기 쉬울 뿐만 아니라 비주얼 스튜디오 IDE에

서 꽤 많은 일을 자동으로 처리해 줍니다. 귀찮은 코딩 작업은 IDE에 맡기고 코드로 무

엇을 할 것인지에 대해서만 더 집중할 수 있죠.

1

예쁘고 멋진 프로그램을 만들 수 있습니다. 사용자 인터페이스를 위한 비주얼 마크업

언어인 XAML, C#과 함께한다면, 예쁘고 멋진 프로그램을 만들 수 있습니다.

효과적인 도구를 사용해서 정말 멋지게 동작하는 소프트웨어를 만들 수 있습니다.

 예쁜 사용자 인터페이스를 디자인할 수 있습니다. 비주얼 스튜디오에 있는 비주얼 디자

이너는 시중에 나와 있는 디자인 툴 중에서 사용하기에 가장 쉬운 편입니다. 워낙 많은

일을 대신 처리하므로 C# 응용 프로그램 개발에서 가장 만족스러운 것 중 하나가 바로

사용자 인터페이스를 쉽게 만들 수 있다는 점입니다. GUI를 새로 만드는 데 몇 시간씩

투자하지 않아도 프로페셔널한 프로그램을 만들 수 있습니다.

2

진짜 문제를 해결하는 데 전념할 수 있습니다. IDE에서 많은 일을 대신해 주지만 C#으로

무엇을 만드는지는 여전히 여러분이 정할 문제입니다. IDE는 여러분이 만들 프로그램과

여러분이 할 일, 그리고 여러분의 고객에게만 전념하도록 도와주는 훌륭한 도우미입니다.

다음과 같은 귀찮은 일들은 IDE가 알아서 처리해 줍니다.

★ 프로젝트 관리

★ 프로젝트 코드를 편집하기 좋게 하기

★ 프로젝트의 그래픽스, 오디오, 아이콘 및 기타 리소스 관리

★ 데이터베이스 관리 및 작업 처리

옛날 같으면 단조로운 프로그래밍 작업에 허비했을 시간에 멋진 앱을 만들고, 공유할 수

있습니다.

C#과 비주얼 스튜디오를 사용하면 별로 힘들지 않게 멋진 기

능을 활용할 수 있습니다. IDE는 다음과 같은 역할을 합니다.

정확한 뜻은 잠시 후에 알 수

있을 겁니다.

C#과 비주얼 스튜디오 IDE가 있으면 여러모로 쉬워집니다

3

4

apps

5

Page 48: Head First C# : 상상을 초월하는 객체지향 C# 학습법(개정3판)-미리보기

48    Chapter 1

시작해 봅시다

App.xaml.csMainPage.xaml

앱이 실행(혹은 재실행)될 때 동작하는 C# 코드가 들어갑니다.

메인 페이지의 사용자 인터페이스를

정의하는 XAML코드가 들어갑니다.

비주얼 스튜디오에서 해야 할 일이제 윈도우 8에서 비주얼 스튜디오를 실행할 차례입니다. 시작 페이지(Start page)는 그냥 건너뛰고 파일(File)메뉴에서 새

프로젝트(New Project)를 선택하세요. 선택해야 할 프로젝트 유형이 있습니다. Visual C# > 스토어 앱 > Windows 응용 프로그램

> 빈 응용 프로그램(Windows)을 선택하세요. IDE는 윈도우 폴더인 Documents > Visual Studio 2013의 프로젝트 폴더에 응용

프로그램이 생성되어 있을 것입니다(“위치”에서 경로를 바꿀 수 있어요).

MainPage.xaml.cs

메인 페이지가 해야 할 행동들을

통제하는 C# 코드가 들어갑니다.

비주얼 스튜디오가 대신해 주는 일새 프로젝트를 생성해서 저장하면 IDE에서는 MainPage.xaml, MainPage.Xaml.

cs, App.xaml.cs가 포함된 많은 파일을 생성합니다. 이 파일들은 솔루션 탐색기

(Solution Explorer)창에 추가되고, 기본적으로 Documents/Visual Studio 2013/

Projects/App1/App1 폴더에 저장됩니다.

비주얼 스튜디오에서 이 세 파일을

자동적으로 만들어 줍니다. 다른 파일도

마찬가지로요! 솔루션 탐색기(Solution

Explorer) 창에서 볼 수 있습니다.

왼쪽 그림과 다른 화

면이 나올 수도 있

습니다.

Visual Studio Express 

2013 for Windows에서는 새로운 프로

젝트를 시작할 때 왼쪽과 같은 화면이 

나타납니다. Professional 혹은 Team 

Foundation 에디션을 사용한다면 조금 

다른 화면이 나올 수도 있지만 어차피 

똑같은 방식으로 작동하니까 걱정할 필

요는 없습니다.

프로젝트를 만들자마자 파일(File) 메뉴의 모두 저장(Save All)을 선택해 프로젝트를 저장하세요. 그러면 모든 프로젝트 파일이 저장됩니다. 그냥 저장(Save)만 선택하면 지금 작업 중인 파일만 저장됩니다.

이 옵션이 보이지 않는다면 여러분은 Visual Studio

Express 2013 for Windows Desktop 버전을 이용하고

있는 것입니다. 종료한 후 Visual Studio Express 2013

for Windows를 실행해 주세요.

Page 49: Head First C# : 상상을 초월하는 객체지향 C# 학습법(개정3판)-미리보기

지금 여기예요 � 49

C# 시작하기

이 툴 바에는 현재 IDE에서 사용할 수 있는 버튼들이 있군요.

너무 작아서 안 보이죠?

자세히 볼 수 있도록

아래쪽에 확대해 놨습니다.

도구 상자 혹은 오류 목록이 보이지 않으면

보기 메뉴에서 선택하세요.

여기서는 밝은 색 테마를

사용했어요. 밝은 화면이 책에서

더 잘 보이거든요. 밝게 바꾸고

싶으면 도구 > 옵션의 환경의

시각적 효과에서 “광원”을

선택하세요(어 두운 색이 편하면

그냥 두셔도 돼요).

디자이너로 컨트롤을 끌어서

사용자 인터페이스를 쉽게

편집할 수 있게 해 줍니다.

48페이지의 화면은 어

두운 테마입니다.

몇 단계를 거치면 여러분은 아래에 있는 그림을 볼 수 있을 것입니다. 첫째, 보기(View) 메뉴 > 도구 상자(Toolbox)

와 오류 목록(Error List) 창을 선택하세요. 다음은 도구(Tool) > 옵션(Option) 메뉴에서 색 테마를 광원(밝게)으로

하면 됩니다. 이미 알고 있는 내용을 바탕으로 대부분의 창과 파일의 역할을 파악할 수 있어야 합니다. IDE에서

그 부분이 무슨 역할을 하는지 빈칸에 적어 보세요. 몇 가지는 저희가 미리 적어 놨습니다. 빈칸을 채우며 무슨

일을 하는지 추측해 보세요.

Page 50: Head First C# : 상상을 초월하는 객체지향 C# 학습법(개정3판)-미리보기

50    Chapter 1

IDE를 파악해 봅시다

도구 상자 혹은 오류 목록이 보이지 않으면,

보기 메뉴에서 선택하세요.

비주얼 스튜디오 C# IDE의 각 부분에 대한 설명을 저희가 채워 봤습니다. 여러분이

적은 것과 조금 다를 수 있겠지만, IDE에 나오는 창과 섹션의 역할 및 용도에 대해서는

충분히 파악됐으리라 믿습니다.이 툴 바에는 현재 IDE에서 사용할 수 있는 버튼들이 있군요.

이 창에서는 여러분이

현재 선택한 속성을

보여 줍니다.

이것은 도구

상자입니다.

여러분이 끌어서

페이지에 넣을

수 있는 많은

컨트롤이 있습니다.

오류 목록 창은 코드에 오류가

있을 때 보여 줍니다.

이 창은 앱을 진단해서 어떤

오류가 있는지 정보를 알려

줍니다.

새 프로젝트를 추가할 때, IDE에서 XAML과 C# 파일을 생성합니다. 프로젝트에 관련된 모든 파일은 솔루션 탐색기에서 볼 수 있습니다.

IDE에서 솔루션 탐색기를 써서 파일 사이를 오갈 수 있습니다.

이 압정 아이콘이

보이세요? 클릭하면

이 창을 숨길 수 있습니다.

기본적으로 도구 상자

창에는 자동 숨김 기능이

활성화되어 있죠.

디자이너로 컨트롤을 끌어서

사용자 인터페이스를 쉽게

편집할 수 있게 해 줍니다.

Page 51: Head First C# : 상상을 초월하는 객체지향 C# 학습법(개정3판)-미리보기

지금 여기예요 � 51

C# 시작하기

Q : 이렇게 IDE에서 코드를 전부 만들어 주

니 IDE 사용법만 배우면 C#은 끝인가요?

A:아닙니다. IDE는 일부 코드를 자동으로

생성해 주는 일은 잘하지만 딱 거기까지입니

다. 일단 처음에 항상 만들어야 하는 코드를

만들어 주는 일, 폼에 있는 컨트롤의 속성을

자동으로 변경해 주는 일 같은 건 아주 잘하

죠. 그런데 프로그래밍에서 정말 중요한 부

분(프로그램에서 무엇을 해야 하는지 알아내

고 그런 일을 할 수 있게 만드는 부분)은 어떤

IDE라도 사람 대신 해 줄 수 없습니다. 비주

얼 스튜디오 IDE가 시중에 출시된 개발 환경

가운데 가장 훌륭한 편에 속하긴 하지만 실제

로 작업을 수행하는 코드를 만드는 일은 IDE

가 아닌 여러분이 해야 합니다.

Q : IDE에서 원치 않는 코드를 만들면 어떻

게 하죠?

A:바꾸면 됩니다. IDE는 사용자가 끌어다

놓거나 추가한 요소가 가장 널리 쓰이는 방식

에 맞춰 코드를 생성하게 설정되어 있습니다.

IDE에서 자동으로 해 주는 것(코드 생성 및

파일 추가)은 모두 파일을 직접 편집한다거나

하는 식의 수동으로, 또는 IDE에서 사용하기

쉬운 인터페이스를 통해서 바꿀 수 있습니다.

Q : Visual Studio Express 에디션을 다운로

드해서 설치해도 괜찮은가요? 이 책에 나온 내

용을 전부 할 수 있으려면 돈을 주고 다른 버전

을 구입해야 하는 것 아닌가요?

A:이 책에 나온 내용 중에 비주얼 스튜디

오 무료 버전(마이크로소프트 웹 사이트에서

다운로드할 수 있는 버전)으로 할 수 없는 것

은 전혀 없습니다. Express를 다른 버전과 비

교했을 때, C#으로 프로그램을 만들고 완벽하

게 작동하는 응용 프로그램을 만드는 것 자체

에는 전혀 지장을 주지 않습니다.

Q : C#과 XAML로 같이 뭔가 한다고 했는데,

XAML이 뭐예요? 어떻게 C#과 결합하나요?

A:XAML(“제멀”로 발음)은 마크업 언어

로, 이 언어를 이용해 윈도우 스토어 앱 전

체 페이지 디자인을 위한 사용자 인터페이스

를 만들 수 있습니다. XAML은 XML 기반입

니다(이 책 뒤에서 다룰 것입니다). 여러분이

HTML로 무언가 시작한다면, <로 시작합니

다. 여기에 XAML 태그로 회색 타원을 그릴

수 있는 예제가 있습니다.

<Ellipse Fill="Gray" Height="100" Width="75" />

Ellipse와 함께 오는 <는 태그 시작을 의미합

니다. 위의 Ellipse는 세 가지 속성이 있습니

다. 회색으로 채우고, 높이와 너비를 설정했

습니다. 태그의 끝을 의미하는 />가 있지만,

다른 XAML 태그도 있습니다. /> 대신 >로 바

꾸면 컨테이너 태그가 됩니다. 그리고 다른

추가 태그를 넣은 뒤 </Ellipse> 이런 형식으

로 태그를 닫습니다. 여러분은 이 책을 통해

XAML의 동작법과 XAML의 다른 태그를 배

우게 될 것입니다.

Q : 지금 IDE를 띄워놨는데 책에 나온 화면

과 다르네요. 없는 창도 있고 이상한 위치에 있

는 것도 있어요. 왜 이렇죠?

A:창(Windows) 메뉴의 창 레이아웃 다

시 설정(Reset Window Layout) 명령을 선

택하면 IDE가 기본 레이아웃으로 되돌아갑니

다. 그러면 앞에 나온 화면과 같은 화면을 볼

수 있습니다.

비주얼 스튜디오에서는 응용 프로그램 제작을 시작하는 데 적당히

활용할 수 있는 코드를 자동 생성해 줍니다.

하지만 응용 프로그램에서 진짜 해야

할 일을 하게 만드는 것은 개발자에게 달려

있습니다.

바보 같은 질문이란 없습니다

Page 52: Head First C# : 상상을 초월하는 객체지향 C# 학습법(개정3판)-미리보기

52    Chapter 1

인류를 구해 주세요

놀라운 일이 발생했습니다. 나쁜 외계인들이 지구 전체를 공격해왔습니다.

비도덕적이고 입에 담을 수 없는 식인 실험을 위해 인간들을 납치하고 있습니다.

외계인이 공격하는 것을 보고만 있을 순 없죠!

외계인 침입!

안 돼! 외계인이

사람들에게 레이저

빔을 쏘고 있어.

?!

음… 맛있겠군!

Page 53: Head First C# : 상상을 초월하는 객체지향 C# 학습법(개정3판)-미리보기

지금 여기예요 � 53

C# 시작하기

당신만이 지구를 구할 수 있습니다인류의 마지막 희망은 당신의 어깨에 달려 있습니다. 지구의

사람들에게는 외계인의 위협에서 탈출할 수 있는 멋진 C# 앱이

필요합니다. 도전할 준비가 됐나요?

아래에 있는 타이머의 시간이 다 가기

전에 사람을 목표 지점으로 끌어다

놓으세요.

사악한 외계인이 화면에

가득 차 있습니다. 사람을

여기에 끌어다 놓으면 게임이

끝납니다.

너무 빨리 끌면 그 사람을 잃을 수도 있어요.

인류의 가장 큰 과학적인 업적은 인류를 보호하기 위한 다이아몬드 모양의 포탈을 발명한 것이다.

인간들을 목표 지점인 포탈로 안전하게

피신시켜 인류를 구하는 것은 당신의 손에

달렸다.

Page 54: Head First C# : 상상을 초월하는 객체지향 C# 학습법(개정3판)-미리보기

54    Chapter 1

우리의 목표는 여기에 있어요

Ellipse

XAML 메인 페이지와 컨테이너 윈도우 UI 컨트롤

빌드할 것들

메인 페이지 위에 많은 시각적인

컨트롤을 올리며 앱을 만들 겁니다.

앱은 컨트롤을 사용해서 플레이어들이 게임을 플레이할 수 있게 해 줍니다.

여러분은 그래픽 사용자 인터페이스를 가진 응용 프로그램, 게임을

동작하게 하는 객체, 실행 가능한 파일이 필요합니다. 많은 일을 해야

할 것 같지만, 이번 장에서 이 모든 걸 끝낼 수 있습니다. 이번 장을

통해 여러분은 페이지를 디자인하고 C# 코드를 추가하면서 IDE에

능숙해질 거예요.

그리드를 사용하여 메인 페이지를 꾸밀

것입니다. 게임 화면은 그리드의 중심 부분에

위치합니다. 이를 위해 캔버스를 사용합니다.

Main pa

ge

Grid

Canvas

Rectang

le

Stack

Pane

l

Rectang

le

Progress

Bar

플레이어가 구하는 각각의 사람들은(타원과 사각형으로 그려짐) StackPanel을 이용해서 그립니다.

사람을 끌어 사각형의 목표 지점에 놓는 컨트롤과 카운트다운을 하는 타이머를 보여 주는 데 사용합니다.

타이머는 플레이어의

게임 시간이 다

되었는지 프로그래스

바의 속성을

확인합니다.

이번 장이 끝날 때쯤 여러분은

IDE에 능숙해질 것입니다.

코드를 작성하기 위한 좋은 첫

걸음입니다.

시작하기 전에 커피 한잔 어떠세요?여러분은 IDE로 정말 멋진 프로젝트를 만들 겁니다.

인류 구하기(Save the Humans)는 풀-스크린 윈도우 스토어 앱이기 때문에 빌드 후에 실행하려면 윈도우 8이 있어야 합니다. 그렇지만 WPF만 있다면 윈도우 8 없이도 빌드할 수 있습니다. 이 책에 나오는 많은 다른 프로젝트도 무료로 제공하는 “WPF Learners Guide PDF”를 내려받아 WPF 사용법을 익히면 데스크톱 앱으로 빌드할 수 있습니다.

Page 55: Head First C# : 상상을 초월하는 객체지향 C# 학습법(개정3판)-미리보기

지금 여기예요 � 55

C# 시작하기

App manifest

.png

Splash screen

StartGame()

AddEnemy()

AnimateEnemy()

EndTheGame()

C# 코드 배포 패키지

.exe

프로그램 파일

컨트롤을 조작하고 게임이 동작하도록 C# 코드를 작성할 거예요.

앱을 만들고 난 후 여러분은 앱을 패키징해서 윈도우 스토어(앱을 배포하고 팔 수 있는 마이크로소프트 온라인 마켓 플레이스)에 업로드할 수 있습니다.

.xmlTarget

timer

Enemy time

r

틱(Tick) 이벤트 핸들러

틱 이벤트 핸들러

클릭 이벤트 핸들러

Start button

메서드

플레이어의 게임이 끝나면 알려 주는 타이머와 적(외계인)을 위한 타이머를 추가합니다.

여러분은 두 가지 다른 코드를 작성할

것입니다. 첫 번째, 정말 유연한 디자인 언어인

XAML(Extensible Application Markup

Language)을 이용해서 사용자 인터페이스를

디자인합니다. 다음 C# 코드를 추가해서 게임을

실제로 동작하게 합니다. 책의 후반부에서는

XAML에 관해 많은 것을 배우게 될 거예요.

이번 장이 끝날 때쯤 여러분은

IDE에 능숙해질 것입니다.

코드를 작성하기 위한 좋은 첫

걸음입니다.

사무실이나 집 컴퓨터의 운영체제가 오래된 버전의 윈도우 2003일 수도 있습니다. 이 PDF와 함께한다면 이 책에 있는 프로젝트를 실행할 수 있습니다.

윈도우 8이 없다고요? 걱정하지 마세요.

1, 2장과 이 책의 후반부에서는 많은 프로젝트가 

Visual Studio 2013 for Windows로 빌드되어 있

습니다. 그러나 아직도 많은 독자들이 윈도우 8 환

경을 갖추고 있지 않습니다. 다행히도 이 책의 윈도우 스토어 앱은 이

전 운영체제와 호환을 가능하게 해 주는 WPF(Windows Presenta-

tion Foundation)로 빌드할 수 있습니다. 여러분은 http://www.hanbit.

co.kr/exam/2165에 가서 무료 다운로드한 후 세부 사항을 확인하세

요. 이 책의 부록, 남은 것들 #11에 넘어가 세부 사항을 확인할 수도 있

습니다.

Page 56: Head First C# : 상상을 초월하는 객체지향 C# 학습법(개정3판)-미리보기

56    Chapter 1

처음부터 시작하기

빈 응용 프로그램으로 시작하기모든 앱은 새 프로젝트로 시작합니다. 파일(File) 메뉴에서 새 프로젝트(New

Project)를 선택하세요. 창에서 Visual C# > 스토어 앱 > Windows 응용 프로그램을

누른 뒤 빈 응용 프로그램(Windows)을 선택하세요. 이름에 Save the Humans를

입력하고 확인 버튼을 누르시면 됩니다.

파일 이름이 .cs로 끝나지 않는다면 여러분은 실수로 JavaScript, Visual Basic 혹은 Visual C++로 프로젝트를 생성했을 것입니다. 이 창을 닫고 Visual C#을 선택해서 다시 실행하세요. 프로젝트 이름인 Save the Humans를 사용하고 싶으면 이전에 실수로 만든 프로젝트를 지우면 됩니다.

프로젝트가 생성되면 디자이너 창이 보입니다. 솔루션 탐색기(Solution Explorer)에 있는 MainPage.xaml을 더블-

클릭합니다. 디자이너의 왼쪽 코너에 있는 줌 드롭-다운을 찾아 모두 맞춤(Fit All)을 선택해서 화면을 축소합니다.

1

그리드 라인 표시를 위해 세 개의 버튼을 사용합니다.

스넵핑을 켜면 각 컨트롤의 위치를 맞출 수 있습니다.

그리드 라인에 스넵핑을 켜면 그리드의 격자 선에 맞게

정렬할 수 있습니다.

디자이너는 작업하고

있는 미리 보기

페이지를 제공합니다.

빈 페이지의 기본

검은색 배경화면으로

되어 있군요.

Page 57: Head First C# : 상상을 초월하는 객체지향 C# 학습법(개정3판)-미리보기

지금 여기예요 � 57

C# 시작하기

디자이너 아랫부분은 XAML 코드입니다. 디자이너의 “빈” 페이지는 빈

게 아닙니다(XAML 그리드 코드 부분이 포함되어 있습니다). 그리드는

HTML 페이지 혹은 워드 문서의 테이블과 비슷합니다. XAML을

이용하여 페이지를 다양한 크기로 늘리거나 줄여볼 거예요.

그리드를 위한 XAML 코드는

IDE가 생성해 줍니다. 이

부분을 잘 살펴보세요. 행과

열을 추가할 거예요

이 프로젝트는 ①부터 ⑤까지의 과정이 있습니다.

다음 페이지로 넘겨 주세요.

이렇게 컨트롤을 포함하는 그리드 태그를 열고 닫는 거군요. 행과 열, 컨트롤을 그리드에 추가할 때 태그를 열고 닫는 사이에 코드를 추가하면 됩니다.

.png

Splash screen

StartGame()

AddEnemy()

Ellipse

XAML 메인 페이지와 컨테이너 윈도우 UI 컨트롤 C# 코드 배포 패키지

.exe

Program file

Main pa

ge

Grid

Canva

s

Rectang

le

StackPanel

Rectang

le

ProgressB

ar

.xml

App manifest

Target tim

er

Enemy ti

mer

틱(Tick) 이벤트 핸들러

틱 이벤트 핸들러

클릭 이벤트 핸들러

Start butt

on

methods

현재 위치

WPF를 배우고 싶나요?

대부분의 윈도우 스토어 앱은 WPF(Windows Presentation Foundation)은 윈

도우 7과 이전 운영체제를 호환되게 해 줍니다)로 빌드할 수 있습니다. 무료로 

제공되는 『Head First C#』의 WPF Guide PDF를 다운로드하세요. http://www.

hanbit.co.kr/exam/2165(자세한 정보는 부록 ‘남은 것들 #11’에 있습니다)

Page 58: Head First C# : 상상을 초월하는 객체지향 C# 학습법(개정3판)-미리보기

58    Chapter 1

시작해 봅시다

제목이 필요합니다. 공백도 필요하구요. 여러분은 XAML을 이용해 이것을 손으

로 코딩할 수 있습니다. 하지만 정상적인 윈도우 스토어 앱처럼 보이게 하는 더 쉬

운 방법이 있습니다.

솔루션 탐색기로 가서 . 을 찾습니다. 마우스 오른쪽 클릭을

하고 MainPage.xaml을 삭제합니다.

2

윈도우 스토어 앱을 시작할 때, 여러분은 비주얼 스튜디오가 제공하는 템플릿으로 메인 페이지를 자주 바꾸게 될 겁니다.

이제 메인 페이지를 바꿀 때가 왔습니다. 프로젝트 탐색기로 가서

를 선택하고 마우스 오른쪽을 클릭합니다(솔루션 탐색

기에서 두 번째 항목을 선택해야 합니다). 그리고 추가(Add) > 새 항목(New Item...) 메뉴를

선택합니다.

3

프로젝트를 생성할 때 다른 이름을 사용했다면 여러분은 “Save the Humans” 대신 그 이름이 솔루션 탐색기에서 보일 것입니다.

다음 몇몇 페이지에서는 강력한 도구인 비주얼

스튜디오 IDE가 제공하는 많은 기능을 살펴보며

학습할 것입니다.이 책을 통해 IDE를 사용하며

C#을 탐험하게 됩니다. 이것은 정말 여러분의

뇌를 자극하는 효과적인 방법입니다.

솔루션 탐색기가 보이지 않는다면 보기 메뉴를 열어서 솔루션 탐색기를 클릭합니다. 창 메뉴에서 창 레이아웃 다시 설정(reset the IDE’s window layout)을 선택해도 됩니다.

Page 59: Head First C# : 상상을 초월하는 객체지향 C# 학습법(개정3판)-미리보기

지금 여기예요 � 59

C# 시작하기

IDE는 프로젝트를 위한 새 항목 창을 띄울 것입니다. 기본 페이지(Basic Page)를 선택하고 이름에 MainPage.xaml을

입력하세요. 그리고 추가(Add) 버튼을 클릭합니다.

IDE는 없는 파일을 추가하라고 하는데, Yes를 선택해서 추가해 줍시다. 디자이너의 로딩이 끝날 때까지 기다립니다. 마크업이

유효하지 않다거나 프로젝트의 디자인을 수정하라는 오류가 뜰 것입니다. IDE의 빌드(Build) 메뉴 > 솔루션 다시 빌드(Rebuild

Solution)를 선택해서 IDE 디자이너를 업데이트합니다. 그러면 정상적으로 작동합니다.

이제 추가된 MainPage.xaml 파일을 살펴봅시다. 디자이너에서 스크롤을 내려 이 XAML 코드를 찾습니다. 이 코드는 그리

드에 대한 기본 코드입니다.

기본 페이지(Basic Page)를

선택해서 프로젝트에 기본

페이지 템플릿이 적용된

새로운 페이지를 만듭니다.

이름을 MainPage.xaml로 하셔야 합니다. 왜냐하면 여러분은

같은 이름의 파일을 지웠으니까요.

전체 그리드에서 분류된 그리드 <Grid> </Grid> 태그를 주목하세요. 여기에 앱 이름을 표시하는 페이지 헤더가 있습니다. 이 그리드는 컨트롤을 추가할 수 있는 루트 그리드 안에 포함되어 있습니다.

IDE를 이용해 그리드를 수정할 겁니다.

MainPage.xaml을 기본 페이지 항목으로 바꿀 때, IDE는 추가 파일을 요구합니다. 솔루션을 다시 빌드해서 모든 것을 새롭게 업데이트하면 디자이너에서 페이지가 정상적으로 보입니다.

여러분의 페이지는

디자이너에

표시됩니다. 그렇지

않다면 솔루션

탐색기에 있는

MainPage.xaml을

더블-클릭하세요.

Page 60: Head First C# : 상상을 초월하는 객체지향 C# 학습법(개정3판)-미리보기

60    Chapter 1

한 걸음, 한 걸음

빈 페이지의 템플릿에 제목 행을 포함한 2개의 행과 3개의 열을 가진 그리드

(빈 페이지의 템플릿에서 제목이 있는 행을 포함)를 만들어 봅시다. 플레이 영

역이 포함된 중간 부분에 큰 공간이 있습니다. 테두리에서 선과 삼각형이 보일

때 행과 열을 조정해 봅시다.

4

만약 여러분의

페이지의 경계

면에서 140과 1*

이 보이지 않는다면,

바깥쪽 부분을

클릭하세요.

그리고 여기를

클릭해서 그리드 안에

아래쪽 행을 만드세요.

오렌지 색 삼각형과

선이 나타날 때 그리드

테두리를 조정하면

됩니다.

행이 추가되면 선은

파란색으로 변하고,

테두리에서 행 높이의

숫자가 보입니다. 중간

행의 높이(1*)는 *에 있는

숫자보다 크게 바뀝니다.

윈도우 스토어 앱은 태블릿, 노트북, 큰 모니터 등 어떤 화면에서도 가로나 세로에 맞게 보여야 합니다.

앱은 그리드의 행과 열을 이용하여 자동으로 레이아웃을 화면에 맞게 조정합니다.

Q : 그리드에 많은 행과 열이 있는데, 회색 선은 뭐죠?

A:회색 선은 비주얼 스튜디오가 여러분이 컨트롤을 페이지

에 맞게 잘 배치할 수 있도록 도와주는 역할을 합니다. 이 회색

선을 버튼으로 켜고 끌 수 있습니다. 비주얼 스튜디오 밖에

서 앱을 실행할 때는 디자이너에서 이 선들을 볼 수 없습니다.

그리고 여러분이 클릭해서 새로운 행을 추가할 때, XAML 코드

가 실제로 변경됩니다. 컴파일하고 실행할 때 추가된 내용이 적

용될 것입니다.

Q : 잠시만요. 전 C#을 배우고 싶은데, 왜 XAML을 배우는 데

시간을 투자해야 하나요?

A:윈도우 스토어 앱을 만들 때, 대부분 XAML로 디자인된

사용자 인터페이스로 시작합니다. 또한 비주얼 스튜디오는 사

용자 인터페이스를 쉽게 만들어 주는 멋진 XAML 편집기가 있

습니다. 이 책의 전반에 걸쳐 다양한 유형의 프로그램(XAML을

사용하지 않는 데스크톱 응용 프로그램과 콘솔 응용 프로그램)

을 만들면서 여러분이 C#을 조금 더 깊이 이해할 수 있도록 도

와 줍니다.

바보 같은 질문이란 없습니다

Page 61: Head First C# : 상상을 초월하는 객체지향 C# 학습법(개정3판)-미리보기

지금 여기예요 � 61

C# 시작하기

페이지의 위쪽 테두리를 이전 페이지에서 했던 것처럼 해 봅시다. 이번에는 왼편과 오른편에 각각 선을 넣어서

두 열을 만들어 봅시다. 행의 높이와 열의 너비는 신경 쓰지 마세요. 여러분이 어디에 클릭하느냐에 따라 크기가

다릅니다. 다음 페이지에서 고칠 거예요.

5

작업이 완료되면, XAML 윈도우 창으로 가서 이전 페이지와 같은 간격의 그리드를 만들어 봅시다. 열 너비와 행

높이가 페이지의 상단과 측면에 있는 숫자와 일치합니다.

이것이 5번 과정의 왼쪽 열의 너비입니다. 이 너비는 디자이너에서 보이는 너비와 일치합니다. IDE에서 이 XAML 코드를 생성해 줍니다.

행의 높이와 열의 너비가

다르다고 걱정하지 마세요.

다음 페이지에서 고칠 거예요.

이제 그리드의 행과 열을 추가했습니다.

XAML 그리드는 다른 컨트롤을 담을 수 있는 컨테이너 컨트롤입니다. 그리드는 셀로

정의된 행과 열로 구성되어 있습니다. 각각의 셀은 버튼, 텍스트, 도형을 나타내는

다른 XAML 컨트롤을 담을 수 있습니다. 그리드는 페이지를 쉽게 꾸며 줍니다. 화

면의 크기에 맞춰 행과 열을 다시 조정할 수 있죠.

인간들이 뭔가 준비하고 있어. 상황이 별로 좋지 못

한 것 같군.

Page 62: Head First C# : 상상을 초월하는 객체지향 C# 학습법(개정3판)-미리보기

62    Chapter 1

크기를 설정하기

왼쪽 열의 너비를 설정합니다.

드롭-다운 메뉴가 나타날 때까지 첫 번째 열 위의 번호를 가리키세요.

Pixel을 선택해서 Star(*)를 자물쇠 표시로 변경합니다. 그리고 숫

자를 클릭한 다음 160을 입력하세요. 열의 숫자는 아래와 같아야 합

니다.

1

그리드 설정하기앱은 다양한 기기에서 작동되어야 합니다. 그리드는 이런 일을 유연하게 해

주는 좋은 도구입니다. 그리드는 행과 열을 특정 Pixel의 높이에 맞게 설정할

수 있습니다. 그리고 Star(*)를 이용해서, 화면의 크기나 위치에 상관없이 서로

다른 페이지의 적정 크기를 유지할 수 있습니다.

오른쪽 열과 아래쪽 행에도 위와 같이 합니다.

오른쪽 열과 아래쪽 행에도 160을 입력하고 Pixel을 선택하세요.

2

꾸미는 데 능숙하지 않아도

괜찮아요.

앞으로 디자인하는 것에 대해서 

많이 이야기할 거예요. 지금부터

는 게임 만드는 과정을 살펴봅니다. 이 책의 마지막 

부분에서 여러분은 모든 것을 정확하게 이해할 수 있

을 거예요.

이 숫자를 바꾸면 그리드와

XAML 코드가 수정됩니다.

행과 열을 Pixel로 설정하면 너비와 높이가 고정되도록 설정합니다. Star(*)로 설정하게 되면 그리드의 나머지 부분에 맞게 행과 열이 확대되거나 축소될 수 있습니다. 디자이너에서 너비와 높이 속성을 XAML로 알맞게 변경해 보세요. 만약 너비와 높이의 속성을 제거한다면, 그것은 1*로 설정하는 것과 같습니다.

Page 63: Head First C# : 상상을 초월하는 객체지향 C# 학습법(개정3판)-미리보기

지금 여기예요 � 63

C# 시작하기

<!--

This grid acts as a root panel for the page that defines two rows:

* Row 0 contains the back button and page title

* Row 1 contains the rest of the page layout

-->

<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">

<Grid.ColumnDefinitions>

<ColumnDefinition Width="160"/>

<ColumnDefinition/>

<ColumnDefinition Width="160"/>

</Grid.ColumnDefinitions>

<Grid.ChildrenTransitions>

<TransitionCollection>

<EntranceThemeTransition/>

</TransitionCollection>

</Grid.ChildrenTransitions>

<Grid.RowDefinitions>

<RowDefinition Height="140"/>

<RowDefinition/>

<RowDefinition Height="160"/>

</Grid.RowDefinitions>

가운데 열과 행을 기본 크기인 1*로 만듭시다(이미 설정되어 있지 않은 경우).

중간에 있는 열의 숫자를 클릭해서 1을 입력하세요. 드롭-다운을 사용하지

마세요(star로 놔두세요). 아래와 같은 그림을 볼 수 있습니다. 그런 다음

IDE가 자동으로 크기를 조정하지 않았는지, 다른 열을 한 번 확인해 보세요.

만약 다른 열의 크기가 변경되었다면 다시 160으로 바꿔 줍니다.

3

XAML 코드를 봅시다.

그리드의 코드 부분으로 갑니다. 그리고 XAML 윈도우 창에서 코드가 잘 만들어졌는지 확인해 봅시다.

4

행과 열의 드롭-다운을 설정해서 너비와 높이의 속성을 변경했었죠.

XAML에서 그리드의 열이 정의되는 부분입니다.

3개의 열과 3개의 행을 추가해서, 여기에 3개의

ColumnDefinition 태그와 RowDefinition

태그가 있습니다.

잠시 후, 그리드에 컨트롤을 추가할 것입니다. 행과

열을 정의한 후 여기에 컨트롤을 배치할 거예요.

꼭대기에 있는 <Grid> 태그는 그리드 전체를 의미합니다. 그 아래에 그리드의 일부들이 있죠.

1*을 입력할 때, IDE는 기본 너비에

맞게 열의 크기를 설정합니다. 다른 열도

그렇게 적용될 것입니다. 만약 그렇다면

160 픽셀로 다시 바꿔 주세요.

140 픽셀의 높이인 위쪽 행은 여러분이 추가한 기본 페이지 템플릿의 부분입니다.

XAML과 C#은 대소문자를

구별합니다! 예제 코드와

대문자, 소문자가 일치하는지

확인하세요.

Page 64: Head First C# : 상상을 초월하는 객체지향 C# 학습법(개정3판)-미리보기

64    Chapter 1

컨트롤을 추가해 봅시다

그리드에 컨트롤 추가하기버튼과 텍스트, 사진, 프로그래스 바, 슬라이더, 드롭-다운, 메뉴와 같은 것들을

컨트롤이라고 부릅니다. 이제 앱에 컨트롤을 추가할 때가 왔군요. 그리드의 행과 열로

이루어진 셀 안에 컨트롤을 추가해 봅시다.

을 그리드의 맨 오른쪽 아래의 셀에 끌어 놓습니다. XAML 코드는 아래와 같이 보일 거예요.

컨트롤이 어느 행과 열에 배치되어 있는지 어떻게 알 수 있을까요?

2

도구 상자의 (공용 XAML 컨트롤)로 컨트롤

들을 펼친 후, 을 제일 왼쪽 아래의 셀로 끌어 놓습니다.

디자이너 아래로 가서 IDE가 생성한 XAML 태그를 봅니다. 여러분이

컨트롤을 끌어 놓은 위치에 따라 여백 숫자가 다르게 보이고, 속성의

순서가 다를 수도 있습니다.

1

XAML 버튼 코드는 시작 태그와 같이

여기서부터 시작합니다.

이것이 속성입니다. 속성은 이름과 =, 값으로 이루어져 있습니다(이름=값).

만약 도구 상자가 보이지

않는다면, IDE의 위쪽

왼쪽 모퉁이에 있는

도구 상자의 글씨를

클릭하세요. 만약

여기에도 없다면 보기

(View) 메뉴에서 도구

상자(Toolbox)를

클릭하면, 도구 상자를

볼 수 있습니다.

XAML을 읽기 쉽게 하려고 들여쓰기를 했어요.

여러분도 직접 해 보세요!

도구 상자에 있는 포인터를 클릭하고 TextBlock을 선택해서 움직여 보세요. IDE에 있는 XAML 코드의 여백 속성이 변경되는 것을 확인해 보세요.

만약 IDE에서 도구 상자가 안 보이면, 보기(View) 메뉴로 가서 도구 상자를 열 수 있습니다. 자동으로 숨겨지지 않도록 고정 핀을 사용하세요.

Page 65: Head First C# : 상상을 초월하는 객체지향 C# 학습법(개정3판)-미리보기

지금 여기예요 � 65

C# 시작하기

도구 상자에서 컨트롤을 끌어 놓을 때, IDE는 자동으로 여러분이 끌어 놓은 위치의 XAML 코드를 생성합니다.

다음, 도구 상자에 있는 (모든 XAML 컨트롤)을 펼칩니다. 맨 아래 중앙 셀에

를 끌어 놓습니다. 그리고 을 맨 아래 오른쪽 셀에 놓습니다

(우리가 이미 배치한 TextBlock 밑에 놓으면 됩니다). 그리고 를 중앙에 놓습니다.

이제 여러분의 페이지에 이렇게 컨트롤이 배치되어 있어야 합니다(아래 그림과 다르다고요? 걱정

하지 마세요. 같이 수정해 봅시다).

3

중앙에 있는 Canvas 컨트롤을 선택합니다(선택이 안 되면 도구 상자의 포인터를 눌러서

선택해 보세요). XAML 창에는 아래와 같이 보입니다.

...

Canvas 컨트롤에 대한 XAML 태그입니다. 이것은 <Canvas로 시작하고 />로 끝납니다.

그 사이에 Grid.Column=“1”과 Grid.Row=“1” 속성이 있습니다(Canvas를 가운데 열

과 행에 배치). XAML 창에 그리드를 클릭해서 다른 컨트롤을 선택해 보세요.

4

두 번째 과정에서 추가한 TextBlock 컨트롤입니다. 같은 셀에 ContentControl도 추가했었죠.

여러분이 추가한 ProgressBar입니다.

Canvas 컨트롤을 추가할

때 빈 상자처럼 보일

거예요. 조금 있다가 고쳐

봅시다.

이게 뭘까요?

ContentControl입니다!

이 버튼을 눌러 보세요. 문서

개요(Document Outline) 창이

나타납니다. 어떻게 사용하는지

아시나요? 나중에 배워 봅시다.

첫 번째 과정에서 추가한 버튼이 여기 있어요.

Page 66: Head First C# : 상상을 초월하는 객체지향 C# 학습법(개정3판)-미리보기

66    Chapter 1

속성값을 넣어 봅시다

속성값으로 컨트롤이 변하는 모습을 봅시다비주얼 스튜디오 IDE는 컨트롤을 미세하게 조절할 수 있습니다. IDE의 속성 창은 컨트롤의

외형과 동작을 변경할 수 있습니다.

 속성 창에서 Button을 수정합니다.

IDE에서 Button을 선택하고 아래의 오른쪽 코너에 속성 창으로

갑니다. 컨트롤의 이름을 startButton으로 변경하고 셀의 중앙에

컨트롤을 배치해 봅시다. Button의 속성이 맞는지 확인하려면, 마

우스 오른쪽을 클릭해서 소스 보기(View Source)를 선택하면 됩

니다. XAML 창에서 <Button> 태그를 확인할 수 있습니다.

2

 Button의 텍스트를 바꿔 봅시다.

여러분이 그리드로 끌어 놓은 Button 컨트롤을 오른쪽 클릭한 뒤, 메뉴에서 텍스트 편집(Edit

Text)을 선택합니다. Start! 로 변경한 후 XAML의 Button 태그를 확인해 보세요.

...

1

Button 컨트롤에 텍스트를 입력할 때, XAML의

Content 속성이 업데이트됩니다.

속성 창의 이름 칸에 startButton을 입력합니다.

오른쪽 메뉴를 이용해서 텍스트 편집을 눌러 Button의 텍스트를 변경했을

경우, IDE는 이 속성의 내용을 업데이트합니다.

HorizontalAlignment와 VerticalAlignment 속성의 와 (Center) 버튼으로 컨트롤을 셀의 중앙에 배치하세요.

이 작은 네모난 상자는 속성이 설정되었는지 알려 줍니다. 색칠된 상자는 속성이 변경되었다는 뜻이고, 빈 상자는 기본 값으로 설정되어 있다는 것을 의미합니다.

페이지에 Button을 끌어 놓을 때 IDE는 Margin(여백) 속성을 이용해서 셀의 정확한 위치에 놓습니다. 작은 네모 상자( )를 클릭하고, 메뉴에서 다시 설정(Reset)을 선택하면 Margin이 0값으로 재설정됩니다.

XAML 창으로 돌아가서 XAML 코드가 업데이트되었는지 확인해 보세요.

공용과 레이아웃 섹션을 확장합니다.

텍스트를 편집할 때 Esc키를 눌러 편집을 끝내면 됩니다. 컨트롤들도 이렇게 하면 됩니다.

속성들이 조금 다르게 정렬되어 있어도 괜찮아요!

2

Page 67: Head First C# : 상상을 초월하는 객체지향 C# 학습법(개정3판)-미리보기

지금 여기예요 � 67

C# 시작하기

 페이지 헤더의 텍스트를 바꿔 봅시다. 페이지의 헤더(“My Application”)에서 마우스 오른쪽 버튼을 클릭한 후 소스 보기를 클릭해서 XAML 코드의 텍스

트 블록으로 갑니다. Text 속성이 나올 때까지 XAML 창을 스크롤합니다.

잠깐만요! 텍스트가 “My Application”이 아니에요. 어디로 갔죠?

빈 페이지 템플릿은 페이지의 헤더 이름을 보여 주기 위한 AppName이라고 불리는 정적 리소스(static resource)를

사용합니다. XAML 코드 창에서 <Page.Resources> 부분이 나올 때까지 스크롤해서 이 코드를 확인하세요.

“My Application”을 다음과 같이 변경합니다.

이제 여러분의 페이지 상단에 이렇게 보일 거예요.

3

 StackPanel을 사용해서 TextBlock과 ContentControl을 묶어 봅시다.

셀에서 TextBlock을 위로 배치하고 ContentControl을 아래로 배치합니다. Shift키로 두

컨트롤을 선택한 후 마우스 오른쪽 버튼을 클릭한 후, 팝업 메뉴에서 그룹으로 묶기(Group

Into) > StackPanel을 선택합니다. 이제 페이지에 새로운 StackPanel 컨트롤이 추가되었

습니다. 두 컨트롤을 클릭해서 StackPanel을 선택할 수 있습니다.

StackPanel은 Grid, Canvas, 많은 부분이 비슷합니다. 우선 다른 컨트롤을 묶어 줍니다

(이것을 컨테이너라고 부릅니다). 그래서 컨테이너는 페이지에서 보이지 않죠. 여기에서는 셀에

서 윗부분의 TextBlock과 아랫부분의 ControlPanel을 묶은 후, StackPanel을 만들면서

Grid의 셀을 대부분 채워 줍니다. StackPanel을 선택한 후, 마우스 오른쪽 버튼을 눌러 레이

아웃 > 모두 다시 설정을 클릭하면 속성들이 빠르게 다시 설정됩니다(셀의 수평과 수직의 레이아

웃이 Stretch로 정렬됩니다). 그리고 TextBlock과 ContentControl에 오른쪽 버튼을 클릭

해서 레이아웃을 모두 다시 설정해 줍니다. ContentControl을 설정할 때, 수평과 수직 정렬

을 이용해 컨트롤을 가운데로 배치합니다.

5

지금 여기에 있어요!

 TextBlock을 수정해서 텍스트와 스타일을 바꿔 봅시다. 마우스 오른쪽 버튼을 눌러 텍스트 편집을 이용해서 TextBlock을 Avoid These로 변경

합니다(텍스트 입력이 끝나면 Esc키를 눌러 편집을 끝냅니다). 그리고, 오른쪽 버튼을 눌러

스타일 편집(Edit Style) > 리소스 적용(Apply Resource) > SubheaderTextBlockSytle

을 선택해서 텍스트를 크게 만들어 봅시다.

4

화살표 버튼에 대해서 걱정하지 마세요. 어떻게 사용하는지 14장에서 정적 리소스에 대해 배울 거예요.

TextBlock과

ContentControl은

그리드 오른쪽 아래의

셀에 있습니다.

StackPanel에 있는 TextBlock과 Content Conrol에서 각각 오른쪽 버튼을 클릭해서 레이아웃을 다시 설정해 주세요.

마우스를 이동하면 StackPanel 주변에 상자가 보일 거예요.

이전 내용을 편집(Edit) > 실행 취소(Undo 혹은

Ctrl-z)로 돌릴 수 있습니다. 실행 취소를 몇 번 해

보면 취소한 만큼의 이전 내용으로 돌아갑니다. 여러분이

컨트롤을 잘못 선택했을 경우 편집 메뉴에 있는 몇몇

항목이 비활성화됩니다. 또한 Esc키를 눌러 컨트롤의

선택을 해제할 수 있습니다. 만약 StackPanel과 Grid

와 같은 컨테이너 안에 컨트롤이 선택되어 있다면,

Esc키로 컨테이너를 선택할 수 있습니다. Esc키를

여러 번 쳐야 하는 경우도 있죠.

.png

Splash screen

StartGame()

AddEnemy()

Ellipse

XAML 메인 페이지와 컨테이너

윈도우 UI 컨트롤C# 코드 배포 패키지

.exe

Program file

Main

page

Grid

Canva

s

Rectang

le

StackPanel

Rectang

le

Progress

Bar

.xml

App manifest

Target tim

er

Enemy time

r

틱(Tick) 이벤트 핸들러

틱 이벤트 핸들러

클릭 이벤트 핸들러

Start butt

on

methods

Page 68: Head First C# : 상상을 초월하는 객체지향 C# 학습법(개정3판)-미리보기

68    Chapter 1

게임이 하고 싶군요

컨트롤로 게임 동작하게 하기컨트롤은 제목과 캡션과 같이 보이는 것만 있는 게 아닙니다. 컨트롤은 게임이 동작할 수 있도록 중심 역할을 합니다.

컨트롤을 추가해서 플레이어들이 게임을 하게 해 봅시다. 여러분이 다음에 만들 것은 다음과 같습니다.

ProgressBar를 수정해 봅시다.

그리드의 중앙 아랫부분의 셀에서 ProgressBar를 마우스 오른쪽 클릭합니다. 레이아웃 > 모두

다시 설정을 선택합니다. 그리고 속성 창의 레이아웃 섹션으로 가서 Height에 20을 입력합니다.

XAML 창에서 레이아웃과 관련된 속성을 찾아서 Height이 추가되었는지 확인해 봅시다.

1

Canvas 컨트롤을 게임 플레이를 할 수 있는 곳으로 바꿔 봅시다.

중앙에 Canvas 컨트롤 놓은 거 기억나시죠? 그런데 지금 찾기가 힘드네요. 도구 상자에

서 Canvas Control을 놓을 때, 잘 보이지 않습니다. 그러나, 쉽게 찾는 방법이 있습니다.

XAML 창의 툴 팁 박스에서 문서 개요(Document Outline)라고 쓰인 버튼을 클릭합

니다. 그리고 버튼을 클릭해서 컨트롤을 선택합니다.

Canvas 컨트롤을 선택했으면 속성 창의 이름 칸에 “playArea”를 입력합니다.

2

Canvas 컨트롤에 이름을 붙인 후, 문서 개요 창을 닫으세요. 그리

고 속성 창에 있는 와 버튼(Stretch)을 눌러 수평과 수직으

로 정렬하고, Margin(여백)을 다시 설정합니다. 그리고 Width와

Height에 있는 버튼(Auto)을 각각 누릅니다. 그리고 Column에

0과 ColumnSpan(Column의 오른쪽)에 3을 입력합니다.

마지막으로, 속성 창의 브러시(Brush) 섹션에서 Canvas에 그라데이

션을 주기 위해 버튼(그라데이션 브러시)을 클릭합니다. 편집기 아

랫부분의 왼쪽과 오른쪽 탭을 클릭해서 그라데이션의 시작 색과 끝나

는 색을 선택하고 색상을 클릭하세요.

왼쪽의 탭을 클릭해서

그라데이션의 시작 색을

선택하세요. 그리고 오른쪽

탭으로 그라데이션의 끝나는

색을 선택하세요.

이름이 변경되면 문서 개요 창에 [Canvas] 대신 playArea라고 뜹니다.

IDE의

오른

쪽 부

분에

서 문

개요

를 클

릭해

서 열

수 있

습니

다.

보기(View) > 다른 창(Other Windows) > 문서 개요(Document Outline)에서 볼 수 있습니다.

아래쪽 행에서

뭔가 해 봅시다. ProgressBar를

이만큼 늘릴 거예요.템플릿으로 적을

이렇게 만들어 봅시다.

게임 배경에 그라데이션을 넣을 거예요.

문서

개요

Page 69: Head First C# : 상상을 초월하는 객체지향 C# 학습법(개정3판)-미리보기

지금 여기예요 � 69

C# 시작하기

이제 페이지를 꾸미는 작업이 거의 끝났습니다! 마지막 단계를 향해 페이지를 넘겨주세요.

문서 개요를 이용해 StackPanel과 TextBlock 컨트롤을 수정해 봅시다.

문서 개요로 돌아옵니다(문서 개요 창의 윗부분에 이 보이면 을 클릭해서

pageRoot로 돌아옵니다). StackPanel 컨트롤을 선택해서 수평과 수직이 중앙으로 정렬되어 있는지, 여백이 설정되었

는지 확인합니다. 마찬가지로 TextBlock도 확인합니다.

5

적 템플릿을 생성해 봅시다.

게임 화면에서 같은 모양의 적군이 많이 움직여야 합니다. 다행히도, XAML에서 많은 컨트롤을 같은 적군 모양으로 만들어

주는 템플릿(Template)을 제공해 줍니다.

다음, 문서 개요(Document Outline) 창에서 [StackPanel]을 펼친 후, [ContentControl]에서 마우스 오른쪽 클릭

합니다. 그리고 템플릿 편집(Edit Template) > 빈 항목 만들기(Create Empty...) 메뉴를 선택합니다. EnemyTemplate으로

이름을 입력하고 확인을 누르면 XAML 창에 템플릿이 추가됩니다.

현재 새로 만든 템플릿이 선택되어 있습니다. 그런데 템플릿이 보이지 않네요. 다음 과정에서 템플릿을 보이게 합시다. 만

약 컨트롤 템플릿의 바깥 부분을 클릭했다면, 여러분은 문서 개요(Document Outline)를 열어서 다시 선택할 수 있습니

다. ContentControl을 오른쪽 클릭해서 템플릿 편집(Edit Template) > 현재 항목 편집(Edit Current)을 선택하면

됩니다.

3

움직이는 적들은 여기서 보이지

않습니다. 적군이 표시되도록

컨트롤을 추가하고 크기를

설정하기 전까지 디자이너 창에는

어떤 템플릿도 표시되지 않습니다.

뭔가 잘못됐다고 걱정하지 마세요.

취소(Undo)하고 다시 하면 됩니다.

템플릿이 선택되지 않을 경우, 문서 개요 창에서 그리드를 선택하세요.

적 템플릿을 편집해 봅시다.

빨간색 원을 템플릿에 추가해 봅시다.

★ 도구 상자에 있는 를 더블-클릭해서 원을 추가하세요.

★ Ellipse의 Height과 Width의 속성을 100으로 설정하세요. 그러면 셀에서 원이

보일 거예요.

★ HorizontalAlignment, VerticalAlignment, Margin 속성의 옆에 작은 네모 상자를 눌

러, 다시 설정을 선택합니다.

★ 속성 창의 브러시 섹션으로 가서 단색 브러시(Solid-color brush) 를 선택합

니다.

★ 긴 색상 바 안의 표식을 윗부분으로 끌어서, 원형에 빨간색을 칠합니다. 그런 다

음 정사각형의 색상 선택 부분을 클릭해서 오른쪽 위의 코너로 마우스를 끌어 놓

습니다.

★ ContentControl의 XAML 코드는 이제 이렇게 보일 겁니다.

4

오른쪽 위의 모서리를 클릭해서, 이 색상을 선택하세요.

XAML 윈도우 창을 스크롤해서 EnemyTemplate이 정의된 것을

확인해 보세요. AppName 리소스가 밑줄이 같아야 합니다.

디자이너에서 원형이 보일 때까지 아무 데나 클릭하지 마세요.

템플릿이 선택되는 것을 유지하려고 합니다.

Page 70: Head First C# : 상상을 초월하는 객체지향 C# 학습법(개정3판)-미리보기

70    Chapter 1

여러분이 만든 페이지를 점검해 봅시다

Canvas에 사람을 추가해 봅시다.

사람을 추가하기 위한 두 가지 옵션이 있습니다. 첫 번째는 다음 세 단계를 따라 하면 됩니다. 두 번째는 조금 더 빠

른 방법인데 XAML 코드에 4줄만 추가하면 됩니다. 여러분이 선택하세요!

Ellipse 컨트롤을 Canvas에 추가하기 위해서 셀 중앙의 Canvas 컨트롤을 선택한 후, 도구 상자의 모든 XAML 컨트

롤 섹션에서 Ellipse를 더블-클릭합니다. Canvas 컨트롤을 다시 선택해서 Rectangle을 더블-클릭합니다.

Rectangle은 Ellipse의 바로 위에 추가될 것입니다. Rectangle을 Ellipse 아래로 끌어 놓습니다.

Shift 키를 누른 채 Ellipse를 클릭한 후, 두 컨트롤 모두 선택되게 합니다. 선택한 부분에서 오른쪽 버튼을 눌러 그룹

으로 묶기(Group Into) > StackPanel을 선택합니다. Ellipse를 선택해서 단색 브러시 속성을 이용해서 흰색으로 바꿉니

다. 그리고 Width와 Height 속성을 10으로 합니다. 다음 Rectangle을 선택해서 역시 흰색으로 바꾼 후 Width를

10, Height을 25로 합니다.

문서 개요 창에서 playArea에 있는 StackPanel을 선택하세요(속성 창에서 형식 StackPanel인지 확인하세요).

Width와 Height에 있는 버튼(자동으로 설정)을 클릭하세요. 그리고 이름 칸에 human을 입력합니다. 여기에 생

성된 XAML 코드가 있습니다.

문서 개요 창으로 돌아와 새로운 컨트롤이 어떻게 나타나는지 확인해 봅시다.

6

“Game Over” 텍스트를 추가합니다.

게임이 끝났을 때 게임이 끝났다는 메시지를 표시해야 합니다. TextBlock

컨트롤을 추가해서 글꼴을 설정하고 이름을 입력해 봅시다.

★ Canvas를 선택하고 도구 상자의 TextBlock을 끌어다 놓습니다.

★ 속성 창의 TextBlock의 이름 칸에 GameOverText를 입력합니다.

★ 속성 창의 텍스트 섹션을 펼친 후 글꼴을 Arial Black으로,

글꼴 크기를 100px로 하고 Bold와 기울임꼴을 선택합니다.

★ TextBlock을 끌어서 Canvas의 중앙에 놓습니다.

★ 그리고 텍스트에 Game Over를 입력합니다.

7

만약 XAML 창에 이 코드를 입력한다면 </Canvas> 태그

바로 위에 코드를 입력하세요. 이것은 Canvas 안에 사람이

있다는 것을 의미합니다.

Canvas에 컨트롤을 끌어 놓을 때 위와 왼쪽의 속성값은 끌어 놓은 위치 값으로 설정됩니다. 만약 위와 왼쪽의 속성값을 바꾸고 싶으면 컨트롤을 움직이면 됩니다.

여러분의 XAML 코드는 도형의 바깥 라인이 보이는

Stroke 속성이 설정되어 있을 겁니다. 이 속성을

어떻게 추가하고 제거할까요?

Page 71: Head First C# : 상상을 초월하는 객체지향 C# 학습법(개정3판)-미리보기

지금 여기예요 � 71

C# 시작하기

사람을 끌어 넣을 타깃 포탈을 추가해 봅시다.

Canvas에 마지막 컨트롤을 추가합니다. 플레이어가 사람을 포탈에 끌어 넣을 겁니다(Canvas가 어디에 있어

도 상관없습니다. 다음 문장부터 따라 하세요).

Canvas 컨트롤을 선택해서 Rectangle 컨트롤을 위에 놓습니다. 속성 창의 브러시 섹션에서 버튼을 클릭

하여 그라데이션을 줍니다. 그리고 Height과 Width 속성을 50으로 합니다.

Rectangle을 45도로 회전해서 다이아몬드 모양으로 바꿔 봅시다. 속성 창의 변형 섹션을 열어서 회전 버

튼을 눌러 Angle에 45를 입력합니다.

마지막으로 속성 창의 이름 칸에 target을 입력합니다.

축하합니다. 앱 메인 페이지를 완성했습니다.

8

Page 72: Head First C# : 상상을 초월하는 객체지향 C# 학습법(개정3판)-미리보기

72    Chapter 1

컨트롤을 익혔습니다

지금까지 사용자 인터페이스를 만들어 보면서 컨트롤이 무슨 역할을 하는지에 대한 감각을 키웠습니다. 컨트롤의 속성이 무엇을

하는지, IDE의 속성 창 어디에 있는지 찾아서 연결해 보세요.

XAML 속성 무엇을 하죠?IDE의 속성 창

어디에서 찾을 수 있나요?

컨트롤의 각도를 설정할 수

있어요.Height

C# 코드로 특정 컨트롤을

조작하기 위해 사용합니다.Rotation

컨트롤의 색상Fill

컨트롤 안에 보이는 텍스트를

바꿀 때 사용합니다.x:Name

컨트롤의 크기를 알 수

있습니다.Content 속성 창 꼭대기

힌트: 속성을 찾기 위해 윈도우 속성 창에 있는 검색 속성을

이용할 수 있습니다. 검색한 속성 중 일부는 모든 컨트롤의

속성에 존재하지 않습니다.

해답은 81페이지에 있습니다.

▹ 브러시

▹ 모양

▹ 공용

▹ 레이아웃

▹ 변형

Page 73: Head First C# : 상상을 초월하는 객체지향 C# 학습법(개정3판)-미리보기

지금 여기예요 � 73

C# 시작하기

게임 만들 준비가 됐습니다이제 코딩을 할 수 있습니다. 여러분은 페이지의 기초가 되는 그리드를

설정하고, 컨트롤을 추가했습니다.

비주얼 스튜디오는 페이지를 꾸미기 위한 유용한 도구를 제공해 줍니다. XAML 코드를 자동으로 생성해 주죠. 그러나 이걸로 뭔가 하기에는 부족합니다. 이제 여러분이 나서야 할 차례입니다.

첫 번째 단계에서 프로젝트를 생성하고 그리드를 설정했습니다.

그리고 페이지에 컨트롤을 추가했습니다. 다음 단계에서는 이들을 조작하기 위한 코드를 작성할 거예요.

현재 위치

XAML 메인 페이지와 컨테이너

Main pa

ge

Grid

Canva

s

Ellip

se

윈도우 UI 컨트롤

Rectang

le

Sta

ckPanel

Rectang

le

Progress

Bar

.png

Splash screen

배포 패키지

.exe

Program file

.xml

App manifest

StartGame()

AddEnemy()

C# 코드

Target tim

er

Enemy t

imer

틱(Tick) 이벤트 핸들러

틱 이벤트 핸들러

클릭 이벤트 핸들러

Start but

ton

methods

AnimateEnemy()

EndTheGame()

Page 74: Head First C# : 상상을 초월하는 객체지향 C# 학습법(개정3판)-미리보기

74    Chapter 1

다음 단계로…

다음에 해야 할 것이제부터 재미있는 부분입니다. 게임이 동작하는 코드를 추가하기 위한

세 가지 단계가 있습니다. 첫 번째 적군을 움직이게 한 다음 플레이어와

상호동작할 수 있도록 만듭니다. 마지막으로 게임을 조금 다듬어서

멋지게 만들어 봅시다.

… 그다음, 게임을 해 봅시다…

… 마지막으로, 적을 외계인 모습으로 만들어 볼까요?

먼저, 적을 움직여 봅시다…

첫 번째 할 일은 시작 버튼을 눌렀을 때 적들이 계속 화면을 가로질러 움직이게 하는 C# 코드를 작성하는 겁니다.

게임이 동작하려면

프로그래스 바가 카운트

다운되어야 합니다. 사람이

움직여서 적에 부딪치거나

정해진 시간이 다 되었을 때

게임을 종료해야 합니다.

템플릿을 사용해서

빨간색 원을 만듭니다.

템플릿을 수정해서 나쁜

외계인처럼 만들어

봅시다.

많은 프로그래머들이 코드를 조금씩 점진적으로

작성하며 프로젝트를 진행합니다. 다음 단계로

넘어가기 전에 요구사항을 확인합니다. 즉, 이

프로그램의 나머지 부분도 이런 방식으로 진행합니다.

여러분은 Canvas 컨트롤에 움직이는 적을

AddEnemy()의 메서드에 추가하는 코드를 작성할

겁니다. 페이지에 움직이는 적들을 채우는 것으로

시작해 봅시다. 게임의 나머지 부분을 만드는 데

도움이 될 겁니다.

Page 75: Head First C# : 상상을 초월하는 객체지향 C# 학습법(개정3판)-미리보기

지금 여기예요 � 75

C# 시작하기

메서드 추가하기이제 코딩할 때가 왔습니다. 먼저 메서드(method)를 추가해 봅시다. IDE가

생성해 준 코드로 쉽게 시작할 수 있습니다.

페이지를 편집할 때, 컨트롤을 더블-클릭하면 IDE는 코드를 자동으로 생성해

줍니다. 페이지 디자이너에서 Start 버튼을 더블-클릭합니다. 여러분은

플레이어가 Start 버튼을 클릭할 때 게임을 시작하는 코드를 추가할 것입니다.

다음 코드를 팝업 창에서 볼 수 있습니다.

Q : 메서드가 뭐예요?

A:메서드는 코드 블록의 이름입니다. 2장에서 메서

드에 대해서 조금 더 이야기해 봅시다.

Q : IDE가 메서드를 생성해 주나요?

A:네… 현재까지는요. 메서드는 프로그램의 한 부분

을 만드는 기본 단위입니다. 여러분은 코딩을 하면서 많

은 메서드를 작성하고 메서드를 사용할 겁니다.

Button 컨트롤을 더블-클릭할 때 IDE는 이 메서드를 생성합니다.

플레이어가 “Start!”를 클릭할 때 게임을 시작합니다.

필요한 메서드를 만들어 봅시다

{ }중괄호 안을 클릭해서 괄호()와 세미콜론;을 포함하는 문장을 입력해 주세요.

그냥 텍스트를 입력했는데 빨간색 물결 모양의 선이 왜 나올까요? 이것은 IDE가 뭔가 잘못되었다는 것을 알려 주는

것입니다. 물결 모양의 선을 클릭하면 오류를 고치는 데 도움을 주는 작은 파란색 상자가 나타납니다.

작은 파란색 상자 위에서 팝업되는 아이콘을 클릭합니다. 그러면 메서드 스텁을 생성하라는 박스를 볼 수

있습니다. 이것을 클릭하면 어떻게 될까요? 한 번 해 보세요!

빨간색 물결 모양의 선은 IDE가 여기에 문제가 있다는

것을 알려 주는 겁니다. 작은 파란색 상자는 IDE가 이

문제를 해결할 수 있다는 것을 의미합니다.

또한 IDE는 이것을 XAML

에 추가합니다. 한 번

찾아보세요. 2장에서 이것이

무엇인지 알아 봅니다.

바보 같은 질문이란 없습니다

‘Save_the_Humans.MainWindow’에 ‘AddEnemy’에 대한 메서드 스텁 생성(M)

Page 76: Head First C# : 상상을 초월하는 객체지향 C# 학습법(개정3판)-미리보기

76    Chapter 1

지적이고 센스있게

메서드에 코드 채워 넣기이제 프로그램이 뭔가 해야 할 차례입니다. IDE가 메서드 스텁을

생성해서 Start 버튼의 메서드를 만들었습니다. 메서드에 코드를

입력해 봅시다.

이것을 선택해서 지우세요. 12장에서

예외에 대한 것을 배울 겁니다.

IDE가 생성한 메서드 스텁의 내용을 지웁니다.1

코드를 추가합니다. Content를 메서드 몸체에 입력합니다. IDE는 키워드를 제안하는 인텔리센스 창을 띄

울 것입니다. 리스트에서 ContentControl을 선택하세요.

2

마지막으로 첫 번째 줄에서 이 코드를 추가하세요. new를 입력할 때 다른 인텔리센스 창이 나타납니다.3

여기에 있는 C# 코드와 정확하

게 일치해야 합니다.

오타로 실수하기 쉽습니다. C# 코

드를 입력할 때, 대소문자가 정확

하게 일치해야 합니다. 괄호와 콤마, 세미콜론을 잘 

확인해 보세요. 하나라도 빠지면 프로그램은 동작하

지 않습니다.

이 라인은 새로운 ContentControl의 객체를 생성합니다. 3장에서 객체와 new 키워드를, 4장에서 enemy와 같은 참조변수를 배웁니다.

Page 77: Head First C# : 상상을 초월하는 객체지향 C# 학습법(개정3판)-미리보기

지금 여기예요 � 77

C# 시작하기

AddEnemy() 메서드를 채우기 전에 파일의 위쪽에 한 줄의 코드를 추가합니다.

public sealed partial MainPage로 시작하는 줄을 찾아서 중괄호{ 이후의 내용을 입력합니다.

4

이것을 필드(Field)라고 부릅니다. 4장에서 조금 더 자세히 배워 봅니다.

다음 페이지에서 프로그램을 실행해 봅시다.

아래 내용을 AddEnemy 메서드에 입력해 봅시다. 빨간색 물결의 밑줄이 보입니다.

여기에 메서드 스텁을 추가하면 AnimateEnemy()에 있는 밑줄은 사라집니다.

5 PlayArea에 물결 모양의 밑줄이

보인다고요? XAML 편집기로

돌아가서 Canvas 컨트롤의 이름이

playArea로 되어 있는지 확인해

보세요.이 라인은 적 컨트롤

객체에 Children(자식)

이라고 불리는 컬렉션을

추가합니다. 8장에서

컬렉션에 대해 배워 봅니다.

XAML과 C#의 코드 위치를 바꾸고

싶다면 윈도우 위의 탭을 이용하세요.

작은 파란색 상자를 이용하여 버튼을 누르면 AnimateEnemy() 메서드 스텁이 생성됩니다. AddEnemy()에서

했던 것처럼 말이죠. 이번에는 enemy, p1, p2, p3라고 불리는 4개의 매개변수(Parameter)가 추가됩니다. 메서드

의 위쪽에 있는 3개의 매개변수를 수정해 봅시다. p1을 from으로, p2를 to, p3를 propertyToAnimate로 수정합

니다. 그리고 int 유형을 double로 수정합니다.

6

2장에서 메서드와 매개변수에 대해 배워 봅니다.

IDE에서 메서드 스텁을 “int” 유형으로

생성할 거예요. 이것을 “double”로 바꿔

주세요. 4장에서 유형에 대해 배워 봅니다.

Page 78: Head First C# : 상상을 초월하는 객체지향 C# 학습법(개정3판)-미리보기

78    Chapter 1

using Save_the_Humans.Common;using System;using System.Collections.Generic;using System.IO;using System.Linq;using System.Runtime.InteropServices.WindowsRuntime;using Windows.Foundation;using Windows.Foundation.Collections;using Windows.UI.Xaml;using Windows.UI.Xaml.Controls;using Windows.UI.Xaml.Controls.Primitives;using Windows.UI.Xaml.Data;using Windows.UI.Xaml.Input;using Windows.UI.Xaml.Media;using Windows.UI.Xaml.Navigation;

using Windows.UI.Xaml.Media.Animation;

OK, 이 정도면 꽤 훌륭해요!

메서드를 끝내고 프로그램을 실행해 봅시다여러분의 프로그램은 실행할 준비가 거의 다 되었습니다. 이제 남은 부분은

AnimateEnemy() 메서드를 끝내는 겁니다. 아직 안 된다고 좌절하지 마세요.

아마 콤마나 괄호 같은 것이 빠져 있을 수도 있어요. 빠져 있는 부분이나 오타를

조심하셔야 합니다!

 파일의 윗부분에 using문을 추가해 주세요.

파일 맨 위쪽으로 이동합니다. IDE는 using으로 시작하는 몇 개의 라인들

을 생성해 줍니다. 아래의 리스트 밑에서 한 라인을 추가해 주세요.

1

이 줄을 조금 더 쉽게 작성할 수 있습니다. 인텔리센스 창을 이용해서 코드를 입력해 봅시다. 마지막 부분에 세미콜론을 입력하는 것을 잊지마세요.

4장에서 객체

이니셜라이저에

대해 배워 봅니다.

애니메이션에 대해서는 16장에서 배울 거예요.

 적이 움직이는 애니메이션 코드를 추가해 봅시다.

이전 페이지에서 AnimateEnemy() 메서드를 만들었습니다. 이제 코드를 추가

할 차례입니다. 적들이 화면을 가로지르며 움직이게 만들어 봅시다.

2

 코드를 살펴봅시다.

오류가 있으면 안 됩니다. 오류 목록 창이 비어 있어야 하죠. 오류 목록이 보인

다면 그 오류를 더블-클릭하세요. 커서가 오류가 발생한 부분으로 이동합니다.

3

오류 목록 창을 볼 수 없다면 메뉴에서 보기(View) > 오류 목록(Error List)을 선택하세요. 2장에서 오류 창과 코드 디버깅에 대해 배워 봅니다.

C#에서 .NET

라이브러리의

코드를 사용할

수 있는 이러한

구문들은

2장에서 배워

봅니다.

이 using 구문은 .NET 프레임워크에서 적들이 움직이는 애니메이션 코드를 사용할 수 있게 해 줍니다.

이 코드는 적이 playArea를 가로지르며 움직이게 해 줍니다. 여러분이 숫자 4, 6을 수정하면 적들을 느리거나 빠르게 만들 수 있습니다.

아직 물결 모양의 빨간색

선이 보인다구요? IDE

는 그 문제가 뭔지 알고

있습니다.

아직 물결 모양의 빨간색 밑줄이 보인다면, 그

것은 코드의 일부분이 잘못 입력되었다는 것

을 의미합니다. 이 책은 수많은 사람의 테스트

를 거쳤습니다. 잘못된 부분이 없는지 꼼꼼하

게 확인했습니다. 그러므로 프로그램이 돌아가

게 하려면 이 책과 똑같이 입력하시면 됩니다.

Page 79: Head First C# : 상상을 초월하는 객체지향 C# 학습법(개정3판)-미리보기

지금 여기예요 � 79

C# 시작하기

 프로그램을 실행해 봅시다.

IDE에서 버튼을 찾아 프로그램을 실행해 봅시다.

4

 이제 프로그램이 실행됩니다!

처음에 큰 X 표시가 몇 초 동안 보일 것입니다. 그리고 여러분의 메인 페이지가 보일 겁니다. “Start!” 버튼

을 몇 번 클릭해 보세요. 클릭할 때마다 원 모양의 도형이 캔버스를 가로지르며 움직입니다.

5

이 버튼을 누르면 프로그램이 시작합니다.

 프로그램을 멈춰 봅시다.

Alt + Tab을 눌러 IDE로 돌아와서 도구 모음(Toolbar)에 있는 버튼의 위치에 버튼으로 바뀐 모두 중

단(break), 디버깅 중지(stop), 다시 시작(restart)을 확인하세요. 디버깅 중지를 눌러 프로그램을 멈춰 봅시다.

6

화면에 큰 X 표시가 잠깐

보입니다. 마지막 장에서

깜빡이는 화면을 다르게

만들어 봅시다.

훌륭하네요! 우리가 약속했던 것처럼

오래 걸리진 않았죠? 조금만 더 작업을

해서 게임을 만들어 봅시다.

IDE에서 창을 다시 설정하고 싶을 때, 창

(Window) 메뉴 > 창 레이아웃 다시 설정

(Reset Window Layout)을 하면 됩니다.

적들이 움직이지 않거나 플레이 영역을 벗어난다면, 코드를 다시 확인해 보세요. 단어나 괄호가 빠져 있을 수도 있습니다.

Page 80: Head First C# : 상상을 초월하는 객체지향 C# 학습법(개정3판)-미리보기

80    Chapter 1

여기는 어디고, 뭘 해야 하죠?

지금까지 한 일축하합니다! 여러분은 프로그램이 돌아갈 수 있게 만들었습니다. 아직은

게임을 완성하지 않았지만, 시작이 반이라는 말도 있잖아요.

잠시 뒤를 돌아보고 무엇을 했는지 살펴볼까요?

비주얼 스튜디오는 일부 코드를 자동으로 생성해 줍니다. 자동으로 생성한 코드만으로 아무것도 할 수가 없죠. 앱을 만들기 전에 뭘 해야 할지 생각하고, 코드를 작성해야 합니다.

사용자 인터페이스를 만들며 순탄하게 시작했었죠.

그러나 앱이 실제로 동작할

수 있게 하는 C# 코드가

필요했습니다.

이 단계에서 C# 코드를 작성하며 동작하는 게임을 만듭니다.

현재 위치

XAML 메인 페이지와 컨테이너

Main pa

ge

Grid

Canva

s

Ellip

se

윈도우 UI 컨트롤

Rectang

le

Sta

ckPanel

Rectang

le

Progress

Bar

.png

Splash screen

배포 패키지

.exe

Program file

.xml

App manifest

C# 코드

Target tim

er

Enemy t

imer

틱(Tick) 이벤트 핸들러

틱 이벤트 핸들러

클릭 이벤트 핸들러

Start but

ton

methods

StartGame()

AddEnemy()

AnimateEnemy()

EndTheGame()

Page 81: Head First C# : 상상을 초월하는 객체지향 C# 학습법(개정3판)-미리보기

지금 여기예요 � 81

C# 시작하기

지금까지 사용자 인터페이스를 만들어 보면서 컨트롤이 무슨 역할을 하는지에 대한 감각을 키웠습니다. 컨트롤의 속성이 무엇을

하는지, IDE의 속성 창 어디에 있는지 찾아서 연결해 보세요.

정답

Content

Height

Rotation

Fill

x:Name

XAML 속성

컨트롤의 크기를 알 수

있습니다.

컨트롤의 각도를 설정할 수

있어요.

C# 코드로 특정 컨트롤을

조작하기 위해 사용합니다.

컨트롤의 색상

컨트롤 안에 보이는 텍스트를

바꿀 때 사용합니다.

무엇을 하죠?IDE의 속성 창 어디에서 찾을 수 있나요?

속성 창 꼭대기

Canvas 컨트롤의 이름에 “playArea”로 입력한 게

기억나나요? XAML의 “x:Name” 속성에 있습니다.

이것은 Canvas에서 C# 코드를 쉽게 작성할 수

있도록 도와 줍니다.

72페이지의 “나는 누구일까요?”의 연습문제

해답이 여기 있습니다. 앞으로 여러분에게

십자퍼즐과 연습문제에 대한 답을 제공합니다.

▹ 브러시

▹ 모양

▹ 공용

▹ 레이아웃

▹ 변형

Page 82: Head First C# : 상상을 초월하는 객체지향 C# 학습법(개정3판)-미리보기

82    Chapter 1

틱 틱 틱

타이머 추가하기게임을 동작하는 하나의 중요한 요소를 추가해 봅시다. 이 게임은 적이 계속 늘어나야 합니다.

그리고 플레이어가 사람을 목표 지점으로 이동시키는 중에 프로그래스 바가 천천히 채워져야

합니다. 타이머(Timers)로 이 두 문제를 해결해 봅시다.

윗부분에 C# 코드를 몇 라인 더 추가해 봅시다.

파일에서 여러분이 추가한 Random 라인으로 올라갑니다. 아래 3줄을 추가해 주세요.

1

여러분이 작성한 MainPage.Xaml.cs 파일에는

MainPage 클래스 코드가 포함되어 있습니다.

클래스에 대해서는 3장에서 배워 봅니다.

Random 아래 3줄을

추가하세요. 이것을 필드라

합니다. 4장에서 배워 봅시다.

타어머에 대한 메서드를 추가합니다.

IDE가 생성한 이 코드를 찾아 보세요.

커서를 맨 마지막 줄의 세미콜론 바로 뒤에 놓은 뒤, 엔터키를 두 번 칩니다. 그리고

enemyTimer.를 입력합니다(점을 포함합니다). 점을 입력하는 순간, 인텔리센스

창이 나타날 것입니다. 여기서 Tick을 선택하고 아래와 같이 입력하세요.

+=를 입력하면 아래의 팝업 상자가 뜹니다.

Tab키를 누르면 다른 상자가 나타날 것입니다.

Tab키를 한 번 더 누르면 IDE는 아래의 코드를 생성해 줍니다.

2 틱틱틱

타이머의 “tick”은 시간 간격마다 메서드를 호출합니다. 첫 번째 타이머는 몇 초마다 적들을 추가합니다. 두 번째 타이머는 시간이 만료되면 게임을 종료합니다.

(<TAB> 키를 눌러 삽입합니다.)

<TAB> 키를 눌러 이 클래스에 ‘enemyTimer_Tick’ 처리기를 생성합니다.

public MainPage(){ this.InitializeComponent(); this.navigationHelper = new NavigationHelper(this); this.navigationHelper.LoadState += navigationHelper_LoadState; this.navigationHelper.SaveState += navigationHelper_SaveState;}

void enemyTimer_Tick(object sender, object e)

{

throw new NotImplementedException();

}IDE는 이벤트 핸들러에 대한

메서드를 생성해 줍니다. 15장에서

이벤트 핸들러에 대해 배워 봅니다.

Page 83: Head First C# : 상상을 초월하는 객체지향 C# 학습법(개정3판)-미리보기

지금 여기예요 � 83

C# 시작하기

EndTheGame() 메서드를 추가합시다.

targetTimer_Tick() 메서드로 가서, IDE가 생성해 준 코드를 지우고 아래의 코드를 추가합니다.

인텔리센스 창의 목록과 조금 다르네요.

왜 progressBar에 오류가 날까요? 여러분이 컨트롤을 사용할 때, 이름이 없거나 오타가 발생할 경우 어떻

게 되는지 보여 주기 위해서 위의 코드를 입력했습니다. XAML 코드 창으로 가서(IDE의 다른 탭에 있는),

아래 줄에 추가한 ProgressBar 컨트롤을 찾아 보세요. 그리고 이름을 progressBar로 수정해 주세요.

다음, 코드 창으로 돌아가서 EndTheGame() 메서드 스텁을 생성합니다. 조금 전에 했던 AddEnemy()를

생성한 것처럼 말이죠. 여기에 메서드 코드가 있습니다.

4

MainPage() 메서드를 마무리해 봅시다.

두 번째 타이머를 위한 Tick 이벤트 핸들러를 추가해 봅시다. 네 줄의 코드

를 추가해야 합니다. 여러분이 작성한 MainPage() 메서드에서 아래와 같

이 IDE가 생성한 두 개의 메서드가 있습니다.

3

메서드를 작성할 때

괄호()를 넣습니다.

XAML 코드가 있는 디자이너 탭이 닫혀 있다면, 솔루션 탐색기 창에 있는 MainPage.xaml을 더블-클릭하세요.

gameOverText가 오류로 뜬다면, TextBlock의 이름 속성이 gameOverText로 되어 있지 않다는 것을 의미합니다. 지금 돌아가서 바로 수정하세요.

이 메서드는 타이머를

멈추고, 시작 버튼을 다시

보이게 합니다. 그리고

게임을 종료하며 “GAME

OVER” 텍스트를 플레이

영역에 보여 줍니다.

progressBar를

입력할 때 계속해서

대문자 P로

바뀌나요? IDE가

코드에 소문자 p

의 progressBar가

없어서 이와 비슷한

컨트롤 유형을 찾아

주기 때문입니다.

지금 바로 시작 버튼을 눌러 움직이는 적을

플레이 영역에 추가해 봅시다. 시작 버튼을

눌러 적을 추가하는 대신에 적을 자동으로

생성하려면 무엇이 필요할까요?

브레인 파워public MainPage(){ this.InitializeComponent(); this.navigationHelper = new NavigationHelper(this); this.navigationHelper.LoadState += navigationHelper_LoadState; this.navigationHelper.SaveState += navigationHelper_SaveState;

enemyTimer.Tick += enemyTimer_Tick; enemyTimer.Interval = TimeSpan.FromSeconds(2);

targetTimer.Tick += targetTimer_Tick; targetTimer.Interval = TimeSpan.FromSeconds(.1);}

void targetTimer_Tick(object sender, object e){throw new NotImplementedException();}

void enemyTimer_Tick(object sender, object e){throw new NotImplementedException();}

여러분이 Tab키를 눌러 이벤트 핸들러를 추가할 때마다 IDE는 여기에 코드를 생성합니다. 여러분은 타이머의 Tick마다 실행되는 코드로 수정해야 합니다.

게임을 다 만들었을 때, 여기에 있는 숫자를

바꿔 봅시다. 게임이 어떻게 바뀔까요?

Page 84: Head First C# : 상상을 초월하는 객체지향 C# 학습법(개정3판)-미리보기

84    Chapter 1

이제 얼마 남지 않았습니다

시작 버튼 동작하게 하기시작 버튼을 누르면 캔버스에 원이 나오게 만든 걸 기억하나요? 이제 진짜 게임이

시작되도록 고쳐 봅시다.

 시작 버튼이 동작하도록 만들어 봅시다.

이미 추가한 시작 버튼을 누르면 적이 생성되는 코드를 찾습니다. 다음과 같

이 수정하세요.

1

 StartGame() 메서드를 추가합니다.

메서드 스텁을 생성해서 StartGame() 메서드를 만드세요. IDE가 추가한

메서드 스텁에 다음과 같이 코드를 입력하세요.

2

EnemyTimer에 적을 추가합니다.

IDE가 생성한 enemyTimer_Tick() 메서드를 찾아서 다음과 같이 수정

하세요.

3

포탈(target)의 Rectangle과 사람(human)의

StackPanel 컨트롤의 이름 설정을 했습니다.

컨트롤의 이름을 맞게 설정했는지 확인해

보세요.

이 라인은 시작 버튼으로 적을 playArea 캔버스에 생성하는 대신 게임을 시작하게 합니다.

코드 구울 준비

이 책에서는 여러분이 작성할 많은 코드를

제공합니다.

이 책의 마지막에서 이 코드가 무엇을 하게 되

는지 알게 될 겁니다. 지금처럼 아무 생각 없

이 그냥 코드를 입력하면 됩니다.

현재 여러분이 해야 할 일은 코드를 정확하게  

입력하고,  지시에  정확히  따르는  것입니다.  

이렇게 코딩을 하면서 IDE에 익숙해질 수 있

습니다.

만약 진행이 잘 되지 않는다면 ⇒ MainPage.

xaml과 MainPage.Xaml.cs 파일을 내려 받으

세요. 혹은 각각의 메서드에 XAML과 C#의 코

드를 복사/붙여 넣기 하세요. 아래의 URL에 

있습니다.

http://www.hanbit.co.kr/exam/2165

코딩에 익숙해지면, 빠진 괄호나 세미콜론 등을 찾는 데 능숙해집니다.

이해할 수 없는 오류들이 오류 목록 창에 보입니까? 하나의 점이나 세미콜론이 잘못되었을

경우, 하나의 오류가 두 개, 세 개, 네 개 혹은 그 이상의 오류를 발생시킵니다. 모든

오타를 찾는 데 시간을 낭비하지 마세요! 아래의 웹 페이지로 가면 이 프로그램의 코드를

쉽게 찾아서 복사/붙여 넣기를 할 수 있습니다.

http://www.hanbit.co.kr/exam/2165

15장에서 IsHitTestVisible에 대해 배워 봅니다.

Page 85: Head First C# : 상상을 초월하는 객체지향 C# 학습법(개정3판)-미리보기

지금 여기예요 � 85

C# 시작하기

“Start!” 버튼을 누를 때, 버튼이 사라지고

적군들이 나타나며 프로그래스 바가 채워지기

시작합니다.

프로그래스 바가 다 찼을 때, 게임이 끝나고 Game Over 텍스트가 표시됩니다.

타깃(포탈) 타이머가 천천히 채워지면서, 적군들은 2초마다 생성됩니다. 만약 타이머가 동작하지 않는다면, MainPage() 메서드에서 추가한 모든 코드를 확인해 보세요.

플레이 영역은 움직이는 적들로 천천히 채워지기 시작합니다.

나머지 해야 할 일은 다음 페이지에 있습니다.

진행 상황을 볼까요?게임이 거의 완성되어 갑니다. 게임을 실행해서 어떻게 동작하는지 살펴봅시다.

경고! 우리의 스파이가 인간들이 방어막을 구축하고 있다고

보고했다.

게임을 완성하기 위해서 어떤 일들이 남았을까요?

브레인 파워

Page 86: Head First C# : 상상을 초월하는 객체지향 C# 학습법(개정3판)-미리보기

86    Chapter 1

이벤트

XAML 디자이너로 가서 문서 개요 창의 human을 선택합니다(기억나시죠? Circle과

Rectangle로 이루어진 StackPanel입니다). 그리고 속성 창에서 버튼을 누르면

이벤트 핸들러가 보입니다. PointerPressed 행을 찾아 빈 상자에 더블-클릭하세요.

이제 XAML 창에서 IDE가 StackPanel을 위해 무엇을 추가했는지 확인해 보세요.

메서드 스텁이 추가되었습니다. XAML 창에서 human_PointerPressed를 오른쪽 클릭합니다.

“정의로 이동”을 선택해 C# 코드로 바로 넘어갑니다.

1

그리고 코드를 입력하세요.2

플레이어가 컨트롤을 조정하는 코드를 작성해 봅시다플레이어가 사람을 포탈로 끌어야 합니다. 사람이 포탈에 닿을 때 적절한

반응을 해야 합니다. 이러한 코드를 작성해 봅시다.

4장에서 속성

창에 있는 이벤트

헨들러를 배워

봅니다.

이 상자를 더블-클릭 하세요.

디자이너에서 StackPanel을 다시 클릭하면,

속성 창에서 새로운 이벤트 핸들러 메서드의

이름이 보입니다. 더 많은 이벤트 핸들러를

같은 방법으로 추가할 수 있습니다.

속성 창에서 속성과

이벤트 핸들러가

있는 이 버튼을

이용하면 됩니다.

코드를 작성하기 전에 앱을 멈추고

IDE로 전환하세요.

문서 개요에는 [Grid], playArea, 다른 라인들의 컨트롤이 축소되어 있습니다. human 컨트롤을 찾아 확장하면 됩니다.

Page 87: Head First C# : 상상을 초월하는 객체지향 C# 학습법(개정3판)-미리보기

지금 여기예요 � 87

C# 시작하기

문서 개요 창에서 이름이 target으로 된 Rectangle을 선택합니다. 속성 창의 “선택한

요소의 이벤트 처리기(event handlers view)”에서 PointerEntered 이벤트 핸들러

를 추가합니다. 여기에 메서드 코드가 있습니다.

3

이벤트 핸들러를 바르게 추가했는지 확인하세요! 이전엔 사람 컨트롤에 PointerPressed 이벤트 핸들러를 추가했습니다. 여기에서는 타깃에 PointerEntered 이벤트 핸들러를 추가합니다.

이번에는 playArea Canvas 컨트롤에 두 개의 이벤트 핸들러를 추가합니다. 문서 개요의 오른쪽 [Grid]를 찾습니

다. 두 개가 있는데, 메인 페이지의 [Grid]가 아닌 자식 [Grid]를 선택한 후 이름을 grid로 수정합니다. 그리고 아래

와 같이 playArea에 이벤트 핸들러를 추가합니다.

4

이벤트 핸들러와 속성을 보여 주는 속성 창에서

컨트롤 이름을 바꿀 수 있습니다.

괄호가 정말 많네요! 실수하지

않게 조심하세요.

두 개의 수직 바는 논리 연산을 의미합니다. 2장에서 배워 봅시다.

이벤트 핸들러에 코드를 똑바로 입력했는지 확인하세요. 두 내용이 바뀌면 안 됩니다.

숫자 3보다 작거나

크게 해서, 감도를

높이거나 낮출 수

있습니다.

속성 창에서 이벤트

핸들러가 보인다면, 빈

이벤트 핸들러 상자에

더블-클릭하세요. IDE

가 메서드 스텁을 생성해

줍니다.

Page 88: Head First C# : 상상을 초월하는 객체지향 C# 학습법(개정3판)-미리보기

88    Chapter 1

모두 구할 수 없어요

사람과 적이 부딪히면 게임이 끝납니다사람과 적이 부딪히면, 게임이 종료되어야 합니다. 코드를 추가해서 그렇게 만들어 봅시다. AddEnemy()

메서드로 가서 끝에 한 줄의 코드를 추가합니다. 인텔리센스 창을 이용해서 enemy.PointerEntered를

입력합니다.

목록에서 PointerEntered를 선택하세요(잘못 선택해도 괜찮아요. 점(.)까지 다시 지우면 됩니다. 다시 점을

입력해서 인텔리센스 창을 띄우세요).

다음, 전에 했던 것처럼 이벤트 핸들러를 추가합니다. +=를 입력하고 Tab 키를 누르세요.

다시 Tab 키를 눌러 이벤트 핸들러를 위한 스텁을 생성합니다.

이제 새로운 메서드가 생성되었습니다. 다음 코드를 입력하세요.

AddEnemy() 메서드의 마지막

줄에 커서를 두고, 엔터키를 친 후

코드를 입력하세요.

enemy를 입력하고 점(.)을 누르면 인텔리센스 창이 뜹니다. 그리고 “Pointer”를 입력해 보세요. “Pointer…”로 시작하는 목록으로 건너 뜁니다.

PointerEventHandler UIElement.PointerEntered

포인터가 이 요소의 적중 테스트 영역에 들어가면 발생합니다.

(<TAB> 키를 눌러 삽입합니다.)

<TAB> 키를 눌러 이 클래스에 enemy_PointerEntered 처리기를 생성합니다.

15장에서 이벤트 핸들러가 어떻게 동작하는지 배워볼 거예요.

Page 89: Head First C# : 상상을 초월하는 객체지향 C# 학습법(개정3판)-미리보기

지금 여기예요 � 89

C# 시작하기

이제 게임을 할 수 있습니다게임을 실행해 보세요. 이제 거의 끝났습니다. 시작 버튼을 누를 때, 플레이 영역에서

동그란 적이 나타납니다. 그리고 사람과 포탈이 놓여 있습니다. 프로그래스 바가

가득 차기 전에 사람을 타깃으로 옮겨야 합니다. 처음엔 쉽지만, 시간이 지날수록

적이 늘어나서 게임이 어려워집니다.

사람을 안전한 곳으로 대피시켜 주세요!

… 너무 빨리 끌면 사람을 잃을 수 있어요!

시간이 가기 전에 사람을 피신시켜 주세요…

외계인들은 이리저리 움직이며 사람을 순찰합니다. 사람과 적이 부딪히는 순간 게임은 끝납니다. 외계인을 피해 인간을 잘 움직인다면, 적으로부터 일시적으로 안전합니다.

human에 적용된 IsHitTestVisible 속성을 살펴보세요. IsHitTestVisible 속성이 true일 때, human은 PointerEntered 이벤트를 차단합니다. 사람(human)의 StackPanel 컨트롤은 적군과 포인터 사이에 위치합니다.

Page 90: Head First C# : 상상을 초월하는 객체지향 C# 학습법(개정3판)-미리보기

90    Chapter 1

속성 대신 이벤트가 보

인다고요?

속성 창에 있는 토글 버

튼을 이용해서 여러분이 

선택한 컨트롤의 속성과 이벤트를 볼 

수 있습니다. 스패너와 

번개 모양의 아이콘을 

클릭해 보세요.

휘파람 부는 외계인

이미 만든 원 위에 Ellipse를 하나 더 추가합니다. Fill=“black”, width=25, height=35로 수정합니다.

그리고 정렬과 여백 설정을 다음과 같이 합니다.

그리고 기울이기를 추가합니다.

4

적을 외계인처럼…빨간색 원은 뭔가 이상합니다. 템플릿을 사용해서 빨간색 원을 조금 더

멋지게 수정해 봅시다.

이제 여러분의 적은

인간을 잡아 먹는

외계인처럼 생겼네요.

문서 개요에서 ContentControl 오른쪽 클릭 > 템플릿 편집 > 현재 항

목 편집을 선택합니다. XAML 창에서 템플릿을 볼 수 있습니다. El-

lipse 태그에서 width를 75로, Fill을 Gray로 설정합니다. 그리고

을 추가해서 바깥 테두리 선을 만듭니다. 그리고 수

평과 수직에서 다시 설정을 누릅니다. 코드는 다음과 같습니다(작업을 하

면서 실수로 추가된 속성들을 지워도 됩니다).

1

도구 상자에서 이미 만든 원 위에 또 다른 Ellipse를 추가합니다. Fill=”black”, width=25, height=35로

수정합니다. 그리고 정렬과 여백 설정을 다음과 같이 합니다.

2

속성 창에서 변형 섹션의 (기울이기)를 선택하고 다음과 같이 합니다.3

마우스나 방향키를 이용해 Ellipse를 눈으로

이동시켜 눈알을 만들 수도 있습니다. 기존에

있는 Ellipse를 복사/붙여 넣기 해서 눈 위에

놓고, 조금만 수정하면 됩니다.

Page 91: Head First C# : 상상을 초월하는 객체지향 C# 학습법(개정3판)-미리보기

지금 여기예요 � 91

C# 시작하기

깜빡이는 화면과 타일 추가하기게임을 실행할 때 큰 X자 표시가 나타납니다. 그리고 윈도우 시작

페이지로 돌아갈 때, 다시 타일이 나타납니다. 이것을 바꿔 봅시다.

여기에 새롭게 만든 적 템플릿의 XAML 코드가 있습니다.

솔루션 탐색기 창에서 폴더를 확장하면 4개의 파일이 보입니다.

각각의 파일을 더블-클릭한 뒤 그림판에서 편집하세요. 게임을 시작할 때

깜빡이는 화면은 SplashScreen.png 파일입니다. Logo.png와 SmallLogo.

png 파일은 시작 화면에 표시됩니다. 그리고 StoreLogo.png 파일은 검색

화면(혹은 윈도우 스토어)에 표시됩니다.

몇몇의 비주얼

스튜디오의

에디션은 그림판

대신 그들만의

그래픽 편집기를

제공해 줍니다.

한 가지 더 해야 할 것은…

그냥 여러분이 만든 게임을 즐기세요!그리고 복습하는 것을 잊지 마세요. 여러분은

임무를 훌륭하게 완수했습니다. 굿 잡!

XAML 코드를 참고해서 사람과 포탈, 플레이 영역과 외계인을 창의적으로 바꿔 보세요.

깜빡이는 화면과 로고를 만들기 귀찮다고요?

여기에서 다운로드할 수 있습니다.

http://www.hanbit.co.kr/exam/2165

Page 92: Head First C# : 상상을 초월하는 객체지향 C# 학습법(개정3판)-미리보기

92    Chapter 1

모든 사람이 앱을 사용할 수 있습니다

앱 배포하기여러분이 만든 앱이 재미있네요! 이제 배포할

시간입니다! 앱을 윈도우 스토어에 배포한다면,

수백만의 잠재적인 사용자가 사용할 수 있습니다. IDE

는 윈도우 스토어에 앱을 배포하는 과정을 안내해

줍니다.

앱을 배포하는 과정은 다음과 같습니다.

1 스토어(Store) > 개발자 계정

열기(Open Developer

Account...)를 선택합니다.

2 앱 이름과 연령 등급, 설명을 입력

합니다. 그리고 비즈니스 모델

(무료, 유료, 광고 표시)을 선택합

니다.

3 문제를 확인하고 해결하기 위해 윈

도우 앱 인증 키트를 사용해서 앱을

테스트합니다.

윈도우 스토어에서 앱을 배포하는 방법에 대해 여기서 자세히 알 수 있습니다.

http://msdn.microsoft.com/ko-kr/library/windows/apps/jj657972.aspx

이 책에서는 MSDN(Microsoft Developer

Network)을 통해 더 많은 정보를 찾는

방법을 보여 줍니다. 여러분의 지식을

넓히는 데 도움이 될 것입니다.

4 스토어에 앱을 제출하세요! 앱이 등

록되면, 전 세계 수백만 명의 사람

이 앱을 찾아 다운로드할 수 있습

니다.IDE의 스토어(Store) 메뉴에는 앱을 배포하기 위한 도구가 있습니다.

몇몇의 비주얼 스튜디오 에디션은 스토어 메뉴가 없는 대신, 프로젝트 메뉴 아래에 있습니다.

현재 위치

.png

Splash screen

StartGame()

AddEnemy()

Ellipse

XAML 메인 페이지와 컨테이너

윈도우 UI 컨트롤C# 코드 배포 패키지

.exe

Program file

Main

page

Grid

Canva

s

Rectang

le

StackPanel

Rectang

le

Progress

Bar

.xml

App manifest

Target tim

er

Enemy time

r

틱(Tick) 이벤트 핸들러

틱 이벤트 핸들러

클릭 이벤트 핸들러

Start butt

on

methods

Page 93: Head First C# : 상상을 초월하는 객체지향 C# 학습법(개정3판)-미리보기

지금 여기예요 � 93

C# 시작하기

사이드 로딩을 위한 원격 디버거 사용하기윈도우 스토어로 앱을 배포하지 않고 원격 컴퓨터에서 앱을 실행할 수 있습니다. 윈도우

스토어를 거치지 않고, 앱 설치하는 것을 사이드 로딩(sideloading)이라고 하죠. 사이드 로딩을

할 수 있는 가장 쉬운 방법은 다른 컴퓨터에서 비주얼 스튜디오 원격 디버거(Visual Studio

Remote Debugger)를 설치하는 것입니다.

네트워크 설정이 이상하다면 원격 디버거를 실행하는 데 문제가 있습니다.

다음 MSDN 페이지는 장치에서 원격 디버깅을 설정하는 데 도움을 줍니다.

http://msdn.microsoft.com/ko-kr/library/vstudio/bt727f1t.aspx

원격 디버거로 앱 로딩을 하는 방법은 다음과 같습니다.

★ 원격 컴퓨터가 윈도우 8인지 확인합니다.

★ 마이크로소프트 다운로드 센터(http://www.microsoft.com/ko-kr/download/default.aspx)에 가서 “Visual Studio 2013 원

격 도구”를 검색합니다.

★ 컴퓨터 아키텍처(x86, x64, ARM)를 선택해서 다운로드하고 원격 도구를 설치합니다.

★ 시작 페이지에서 Remote Debugger를 실행합니다.

★ 네트워크 설정을 바꾸고 싶다면 팝업 창에서 설정하면 됩니다(팝업 창이 뜰 것입니다). 실행할 때 Visual Studio 원격 디버깅 모니

터 창에서 볼 수 있습니다.

★ 원격 컴퓨터는 이제 비주얼 스튜디오 원격 디버깅 모니터에서 실행되고, 개발 컴퓨터에 있는 비주얼 스튜디오가 연결되길 기다리

고 있습니다.

이 책이 쓰이고 있는 시점에 여러분은“Visual Studio 2013용 원격 도구”를 찾을 수 있을 겁니다. 그러나 업데이트된 버전을 찾을 수도 있을 거예요.

“MY-SURFACE”의 컴퓨터에서 실행하고 있습니다. 조금 있다가 사용할 수 있으니, 컴퓨터 이름을 잘 기억하세요.

원격 컴퓨터에서 앱을 실행하려면 뒤로 넘겨주세요!

Page 94: Head First C# : 상상을 초월하는 객체지향 C# 학습법(개정3판)-미리보기

94    Chapter 1

이제 인류는 안전합니다

원격 디버깅 시작하기원격 컴퓨터가 원격 디버깅 모니터를 실행하고 있다면, 여러분은 비주얼 스튜디오에서

원격으로 앱을 설치한 후 실행할 수 있습니다. 컴퓨터에 있는 앱이 자동으로 사이드

로딩됩니다. 그리고 여러분이 원하는 시간에 시작 페이지에서 한 번 더 실행됩니다.

디버깅 드롭-다운 메뉴에서 “원격 컴퓨터”를 선택하세요.

원격 컴퓨터로 프로그램을 실행하기 위해서 IDE의 디버깅 드롭-다운 버튼을 사용할 수 있습니다.

여러분의 프로그램을 실행할 때 사용했던 버튼에서 이렇게 생긴 모양의 ( ) 드

롭-다운을 클릭한 뒤, 원격 컴퓨터를 선택합니다.

1

원격 컴퓨터에 여러분의 프로그램을 실행해 봅시다.

원격 컴퓨터로 여러분의 프로그램을 실행해 봅시다. 이제 버튼을 눌러 프로그램을 실행합니다. IDE는 팝업

창에서 원격 컴퓨터에 실행을 시킬 것인지 묻습니다. 만약 여러분의 서브넷에서 원격 컴퓨터를 발견하지 못했다

면, 수동으로 원격 컴퓨터 이름을 입력합니다.

2

다음 장에서는 시뮬레이터를 사용할

것입니다. 여러분은 많은 프로그램을

작성하게 되고, 프로그램을 실행하는 이

버튼이 필요하게 될 겁니다.

원격 디버깅 모니터에서 본

컴퓨터 이름을 입력합니다.

나중에 디버깅할 원격지를 변경할

때, 프로젝트 설정에서 정보를 수정할

수 있습니다. 솔루션 탐색기에서

프로젝트의 이름을 마우스 오른쪽으로

클릭한 후, 속성에서

디버그 탭을 선택합니다. 입력란이

비어 있고 원격 디버거를

다시 시작할 경우, 원격 디버거 연결을

위한 팝업 창이 다시 나타납니다.

Page 95: Head First C# : 상상을 초월하는 객체지향 C# 학습법(개정3판)-미리보기

지금 여기예요 � 95

C# 시작하기

자격 증명을 입력합니다.

원격 컴퓨터에 사용자의 이름과 암호를 입력하라는 창

이 뜹니다. 만약 원격 컴퓨터에서 인증을 피하고 싶다

면, 원격 디버깅 모니터에서 인증을 끌 수도 있습니다

(아무나 원격 컴퓨터로 들어와서 프로그램을 실행할 수

도 있으니, 이것을 권하지 않습니다).

3

개발자 라이선스를 획득하세요.

여러분은 이미 비주얼 스튜디오를 설치했을 때 무료 개발자

라이선스를 획득했습니다. 여러분은 앱을 다른 원격 컴퓨터

로 사이드 로딩하기 위한 라이선스가 필요합니다. 편리하게

도, 원격 디버깅 모니터가 라이선스를 획득하기 위한 창을

자동으로 띄어 줍니다.

4

이제... 인류를 구했습니다!

이 설정을 통해서 프로그램은 원격 컴퓨터에서 실행될 것입니다. 프로그램이 사이드

로딩된 이후 다시 프로그램을 실행하고 싶다면, 윈도우 시작 페이지에서 다시 실행

하면 됩니다. 축하합니다. 여러분은 첫 번째 윈도우 스토어 앱을 만들고 다른 원격

컴퓨터에서 앱을 실행했습니다.

5

축하합니다! 이제 여러분은 외계인의 침략으로부터 자유로워졌습니다. 그런데 왜 이게 마지막이라는 느낌이 들지 않죠?

침략 실패. 퇴각하라! 이것은 명령이다! 지구인들은

호락호락하지 않구나. 부대를 재편성하고 전략을 다시 세워야 한다!

Page 96: Head First C# : 상상을 초월하는 객체지향 C# 학습법(개정3판)-미리보기
Page 97: Head First C# : 상상을 초월하는 객체지향 C# 학습법(개정3판)-미리보기

새로운 장입니다    97

모두 다 코드에 불과하나니...2

뒤에 숨어 있는 그 무엇

언젠가 그 뒤에 무슨 일이

일어나고 있는 건지

알아내고 말 거야…

우리는 그냥 IDE 사용자가 아니라 프로그래머입니다.

IDE만 가지고도 꽤나 많은 일을 할 수 있습니다. 하지만 거기에는 한계가 있습니다. 물론 응용

프로그램을 만들다 보면 반복적인 작업을 많이 해야 하긴 합니다. 그런 일을 하다 보면 IDE에서

제공하는 기능이 정말 많이 도움이 된다는 것을 알 수 있죠. 하지만 IDE를 가지고 작업하는 것은

시작에 불과합니다. 프로그램에서 할 수 있는 일은 IDE에서 하는 일에 비하면 무궁무진합니다.

그리고 그런 일을 하려면 C# 코드를 작성해야 합니다. 일단 코딩에 대해 어느 정도 감을 잡고

나면 프로그램으로 못할 일이 없다니까요.

Page 98: Head First C# : 상상을 초월하는 객체지향 C# 학습법(개정3판)-미리보기

98    Chapter 2

이런 일을 할 때…IDE는 강력한 도구입니다. 하지만 여러분이 사용하는 도구 중 하나에 불과합니다. 프로젝트를

변경하거나 IDE에 뭔가를 끌어다 놓거나 하면 자동으로 코드를 만들어 줍니다. IDE는 일상적

으로 반복되는 코드라든가 별로 수정하지 않고 재사용할 수 있는 코드를 만드는 역할을 합니다.

보통 응용 프로그램을 개발할 때 IDE가 무엇을 처리해 주는지 한 번 들여다 봅시다.

IDE에 있는 속성 창은 MainPage.xaml 파일에 들어가는 XAML 코드를 손쉽게 편집하는 기능을 제공하여, 코딩 시간을 단축할 수 있습니다. 속성 창이 화면에서 보이지 않으면 Alt-Enter 단축키를 사용하세요.

무엇을 도와드릴까요?

윈도우 스토어 프로젝트를 만들 때

IDE에서 만들 수 있는 응용 프로그램 종류는 다양하지만 일단 지

금은 윈도우 스토어 응용 프로그램에만 초점을 맞추겠습니다. 다

른 종류의 응용 프로그램에 대해서는 다음 장에서 배우게 됩니다.

1

도구 상자에서 컨트롤을 끌어다가 페이지에 올려 놓고 더블-

클릭할 때

페이지에서 어떤 일이 일어나게 하려면 컨트롤이 필요하겠죠? 이

번 장에서는 버튼 컨트롤을 통해 C#의 다양한 부분을 살펴볼 것

입니다.

2

페이지에서 속성을 설정할 때

IDE에 포함된 속성 창은 매우 강력한 도구로, 프로그램에

포함되는 거의 모든 특성을 바꿀 수 있습니다. 페이지에 들어

있는 컨트롤의 모습, 심지어는 프로젝트 자체의 옵션도 속성

창을 통해 고칠 수 있죠.

3

여기 있는 모든 작업들은

표준적인 절차를 거쳐서

진행되며, 반복적으로

등장하는 코드가 필요합니다.

이런 부분이라면 IDE에서 잘

도와줄 수 있죠.

1장에서 새로운 프로젝트를 생성할 때, 빈 페이지를 만들기 위해서 스토어 앱 > Windows 응용 프로그램 > 빈 응용 프로그램(Windows)을 선택했습니다.

Page 99: Head First C# : 상상을 초월하는 객체지향 C# 학습법(개정3판)-미리보기