Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
Upcoming SlideShare
유니티로 해보는 게임 프로토타이핑
Next
Download to read offline and view in fullscreen.

9

Share

Download to read offline

게임프로그래머에게 배우는 C#1권(버전1)

Download to read offline

게임 프로그래밍으로 배우는 C# 1권 (버전1) 입니다.
오래전에 집필했던 책인데 오프라인 책으로 출간하지 못한 책이었습니다. C#버전도 오래된 버전이지만 지금이라도 도움이 되시는 분들이 계실까봐 올려 봅니다.

Related Books

Free with a 30 day trial from Scribd

See all

게임프로그래머에게 배우는 C#1권(버전1)

  1. 1. 게임 프로그래밍으로 배우는 C# 1권 2007-01-27 문기영 소개 이 책은 새로운 프로그래밍 언어 C#을 게임 프로그래밍으로 배우는 책입니다. 게임 프로그 래밍은 프로그래밍의 꽃이라 할 정도로 매우 다양한 프로그래밍 기술을 필요로 합니다. 새 로운 언어를 공부할 때 문법을 공부하고 그것으로 프로그램을 만들게 되는데 실제로 문법을 익힌 후 프로그램을 만들어 내는 것은 매우 추상적이거나 흥미가 없게 마련입니다. 게임은 누구나 흥미롭게 접근할 수 있고 특히나 게임 프로그래밍은 다양한 프로그래밍 테크닉을 필 요로 하기 때문에 이러한 것들을 C#언어로 구현하는 방법을 습득하는 것은 C#언어를 보다 더 자세하게 알 수 있는 계기가 됩니다. 그래서 이 책을 저술하게 되었습니다. 필자가 생각하는 독자들 필자는 이 책의 독자를 두 부류로 생각하고 있습니다. 첫째: C#문법은 어렴풋이 알고 있으나 실제로 어떠한 프로그램을 만들어 보아야 하는지 모 르는 독자. 둘째: 게임 프로그래밍에 대한 기술들을 조금 더 쉽게 접근하고자 하는 독자. 소개 글에서 말씀 드린 바와 같이 문법을 알고 있다고 해서 프로그램을 바로 만들 수 있는 것은 아닙니다. 분명한 것은 프로그램을 만들어 봄으로써 문법을 더욱 더 확실하게 다지고 프로그램을 어떻게 만들 수 있는지 알 수 있다는 것입니다. 일반 응용프로그램을 만들어 내 는 것이 게임 프로그램보다 흥미가 떨어진다는 점을 생각하면(지극히 주관적이지만) 이 책 을 통해서 게임을 만들어 보고 그것을 통해서 C#이라는 언어에 대해서 좀더 세부적인 지식 과 게임 프로그래밍에 대한 기술들을 알아보는 것은 괜찮은 언어 학습법이라고 봅니다. 이 책의 구성 필자는 초기에 이 책을 1권의 책으로 저술을 하고 있었으나 내용의 방대함과 필자의 피치 못할 사정으로 인하여 2권으로 나누어서 저술하게 되었습니다. 1권의 내용은 C#문법, 윈도우 프로그래밍, 그래픽 프로그래밍으로 이루어져 있으며 2권의 경우 DirectX를 이용한 2D게임 프로그래밍, 3D게임 프로그래밍, 툴 프로그래밍, 그리고 제 가 관심있게 공부한 내용들을 다루려고 합니다.
  2. 2. 1권에서는 DirectX를 이용한 그래픽 프로그래밍은 다루지 않지만 1권에서 다루는 그래픽 프로그래밍의 내용으로 충분히 게임을 만들 수 있으며 그것은 단지 도구의 선택 문제에 있 습니다. 1권에서는 Flight라는 총알 피하기 게임과 RopePong 그리고 BMS Player를 제작 하였습니다. BMS Player는 비트매니아 혹은 Ez2DJ와 같은 리듬 게임을 C#으로 구현한 예 제입니다. C#, VisualBasic, C++ C#은 2000년 7월 닷넷 플랫폼과 함께 새로운 프로그래밍 언어로 발표된 언어입니다. 본질 적으로 닷넷 플랫폼은 윈도우 2000을 포함하는 기존 운영체제에서 제공하는 서비스들과 새 로운 API를 제공하는 개발 프레임워크입니다. 닷넷 프레임워크에서 중요한 전제사항은 “모 든 프로그래밍 언어는 (최대한)동등하게 취급하자”라는 것입니다. 닷넷 프레임워크를 구성하 는 요소들은 다음과 같습니다. C#, VB.NET, Managed C++, Jscript.NET의 4개의 공식 프로그래밍 언어 CLR(Common Language Runtime) : 모든 개발 언어가 공통으로 사용하는 윈도우 및 웹 개 발을 위한 객체중심 플랫폼. FCL(Framework Class Library) : 다양한 관련 클래스 라이브러리들 필자는 1999년에 비주얼 베이직6.0 게임 프로그래밍에 관한 책을 저술한 바 있습니다. 비 주얼 베이직은 매우 쉽고 강력했습니다. .Net플랫폼으로 오면서 비주얼베이직은 비주얼베이 직 답지 않다. 라는 인상이 매우 강했고 실제로 매우 많은 비주얼 베이직 프로그래머로부터 현재 외면을 받고 있습니다. 그도 그럴 것이 비주얼 베이직만의 장점이 사라졌다고 볼 수 있기 때문입니다. 그리고 C++역시 .Net플랫폼으로 오면서 Managed C++이 되었는데 이 로써 C계열 언어만의 장점이 사라졌다고 보여집니다. 실제로 매우 많은 게임 프로그래머들 은 하드코어 프로그래밍을 좋아하고 프로그래밍 할 때 매우 저 수준의 코드를 작성하기 때 문입니다. 그런 게임 프로그래머들에게 Managed는 별로 달가워하지 않게 되었습니다. C++이 C++답지 않다면, 비주얼 베이직이 비주얼 베이직답지 않다면 닷넷 플랫폼에 걸맞 는 C#을 배우는 것이 낫다는 결론에 이릅니다. 그래서 많은 프로그래머들이 .Net 플랫폼에 서 C#을 택하고 있는 것입니다. C#컴파일러와 .NET그리고 DirectX C#문법을 배우기 이전에 C#코드를 작성하고 실행시켜야 할 환경을 구성해야 합니다. 대부 분의 사람들은 비주얼스튜디오로 시작할 것이라고 생각합니다. 현재 필자의 경우는 비주얼 스튜디오 2005를 사용하고 있고 .NET 2.0을 지원합니다. 이 책에서 제공하고 있는 모든 소
  3. 3. 스 코드를 돌려보기 위해서는 비주얼 스튜디오 2005와 닷넷 2.0이 설치 되어야 합니다. DirectX DirectX는 Microsoft가 만든 멀티미디어 도구입니다. 도스 시절에는 비디오 메모리의 접근 에 아무런 문제점이 없었기 때문에 프로그래머가 마음만 먹으면 화면을 이리 저리 조작할 수 있었습니다. 도스 시절에 정말 큰 문제점은 그래픽 카드의 제조사가 다르면 그 구현 방 법이 달라지기 때문에 그래픽 카드에 맞게 비디오 관련 코드를 모두 작성해 주었어야 했습 니다. 프로그래머들에게 이것은 매우 어려운 작업이었는데 윈도우로 OS가 옮겨감에 따라 Microsoft는 비디오를 포함한 멀티미디어에 관련된 표준 인터페이스 DirectX를 만든 것입 니다. DirectX를 이용하면 그래픽 카드의 구현에 상관없이 하나의 코드만 작성하면 어느 하 드웨어에서도 올바르게 동작합니다. 게임 프로그래머는 화면에 매우 많은 그래픽 데이터를 그려주어야 하고 동시에 많은 사운드 도 들려주어야 합니다. 물론 사용자로부터 입력까지 말입니다. 게임 프로그램은 종합 멀티 미디어 프로그램이기 때문에 DirectX가 거의 필수로 사용됩니다. 하지만 1권에서는 DirectSound만을 이용하여 게임을 제작할 것입니다. 디자인 패턴 프로그램을 만들 때 경험 있는 프로그래머들은 만들어낼 프로그램, 사용하는 언어에 따라 주로 사용하는 어떠한 개발 패턴들이 존재합니다. 디자인 패턴이라는 것이 나오기 전까지는 그저 경험 있는 프로그래머들의 머릿속에 있는 것이었지만 GoF의 디자인 패턴이 책으로 나 오게 됨으로써 여러 프로그래머들이 배울 수 있는 학문이 되었습니다. 필자는 이 책을 집필 할 때 디자인 패턴에 대한 이야기를 하려고 생각조차 못하고 있었지만 윈도우즈 프로그래밍 에 관련된 글을 쓰다가 디자인 패턴에 대한 이야기를 하지 않을 수 없어서 몇 가지 패턴에 대해서 다루어 보았습니다. 이 책을 읽기 위해서 디자인 패턴을 꼭 알아야 할 필요는 없습 니다. 필자는 최대한 딱딱하지 않게 실제 디자인 패턴을 어떻게 사용하는지 핵심만 꼬집어 서 이야기 하였습니다. 아무래도 패턴이라 함은 실제로 프로그램을 만들면서 느껴보고 작성 해보아야 알 수 있는 것이니까요. UML UML은 프로그래머라면 한번은 들어볼만큼 매우 유명한 모델링 언어입니다. UML의 용도는 스케치, 청사진, 프로그래밍 언어로써의 용도가 있는데 필자는 스케치 용도로 UML을 이용 하여 프로그램을 이해하는데 도움이 되도록 하였습니다. 한마디 필자의 작은 팁이나 이야기
  4. 4. 부록 실제로 이 책을 쓰면서 참고했던 모든 관련 자료들은 부록에서 다루고 있습니다. 게임 프로 그래밍에 사용되는 특별한 테크닉 들이 존재하는데 이러한 것들은 모두 부록에서 다루도록 하였고 책을 읽는 도중에 참고해야 합니다. 참고문헌 필자가 이 글을 쓰면서 참고했던 문헌들을 모아놓았습니다. 참고문헌은 번호로 간단히 표기 하였고 글 혹은 각주로써 참고할 문헌들을 제시하였습니다. 감사의 말 이 책이 완성되기 까지 많은 분들이 도와주셨습니다. www.devpia.com에 여러 질문을 올려 주신 분들에게 진심으로 감사 합니다. 필자가 질문을 해결하면서 좋은 예제들을 어떻게 만 들어야 하는지 알 수 있었습니다. 그리고 Microsoft의 Visual C#을 개발하신 장희제님께 감 사 드립니다. 필자가 Visual C#을 사용할 때 모르는 부분에 있어서 물심양면으로 많은 도움 을 주셨습니다. 한국 프로그래머들의 모임 장소인 www.gpgstudy.com의 모든 회원 분들에 게 감사 드립니다. Gpgstudy는 매우 많은 질문과 알찬 답변들로 하여금 필자의 생활에 활 력소가 되었고 많은 분들의 생각을 읽어낼 수 있었습니다. www.dexgame.com의 주인장님 께도 감사드립니다. 필자가 만든 프로그램들을 거의 항상 실행해서 테스트 해주셨고 필자가 프로그램을 올릴 수 있는 공간도 마련해 주셨습니다. 참고문헌에 나와 있는 모든 저자분들 에게 감사드립니다. 이 책은 저 혼자 작성한 것이 아닙니다. 그분들의 훌륭한 서적으로 인 해서 배우고 지금의 필자가 있게 하였습니다. 교보문고, 영풍문고, 반디앤루니스의 사장님들 께도 감사드립니다. 그분들이 아니였다면 제가 책을 사서 보지 못했을 테니까요. 마지막으 로 필자를 끝까지 믿어주시고 항상 버팀목이 되어 주시는 어머니, 누나, 매형, 여자친구에게 진심으로 감사합나다. 1장. 기초학습 가장 간단한 C#프로그램 프로그래밍 언어를 학습하는 것은 영어나 일본어를 배우는것과 다를바가 없습니다. 아니 새
  5. 5. 로운 것을 배우는 것이라고 정의해도 될 것 같습니다. 필자의 학습법은 무조건 일단 돌아가 는 것을 눈으로 보거나 체험해 본 이후에야 무언가를 알 정도로 똑똑하지 않기 때문에 이 책에서도 똑같이 적용하였습니다. 일단 만들어 보자 필자는 독자의 컴퓨터에 VisualStudio 2005와 더불어 닷넷 2.0이 설치가 되어 있다는 가정 을 하겠습니다. 우선 메모장에 다음과 같은 내용을 쳐봅시다. class FirstCSharpProgram { public static void Main() { System.Console.WriteLine("안녕~ C#"); } } 이 코드를 작성하고 firstintro.cs라고 저장합니다. 사실 확장자는 중요하지 않은데 C#소스 코드는 일반적으로 확장자를 cs로 하며 비주얼베이직은 vb, C는 c, C++은 cpp와 같이 사 용합니다. 이제 이렇게 작성한 코드를 실행할 수 있는 파일로 만들어야 하는데 그렇게 하기 위해서 컴 파일러가 필요로 합니다. C#컴파일러는 csc.exe인데 도스 창에서 실행해보면
  6. 6. <그림1> 그림1과 같이 csc 실행파일을 찾을 수 없다고 나오게 됩니다. 만일 이 부분을 해결할 수 없 다면 [부록 : 환경변수 등록]을 참고 하시길 바랍니다. 자, 이제 우리는 csc를 이용해서 컴파일을 할 수 있게 되었습니다. 다음과 같이 커맨드를 써봅시다. csc firstprogram.cs 만일 코드에 아무런 오타가 없다면 다음과 같이 exe파일이 생성된 것을 보실 수 있습니다.
  7. 7. <그림2> 이제 도스 커맨드에서 firstprogram.exe를 실행해 보면 화면에 우리가 작성했던 문장이 나 오는걸 보실 수 있습니다. <그림3> VisualStudio 2005를 이용한 C#프로그램 비주얼스튜디오는 프로그래밍을 개발하기 위한 통합 환경입니다. 앞서 아무런 도구 없이 컴 파일러와 메모장만으로 프로그램을 작성해 보았는데 사실 프로그램을 만드는데는 코드와 컴 파일러 그리고 데이터만 있으면 됩니다. 하지만 이미 보셨듯이 도스 커맨드를 이용하여 컴 파일을 하기 위해서는 해야할 것들이 상당히 많습니다. 특히 대규모 프로그램의 경우에 파
  8. 8. 일이 1만 개가 넘는 경우가 허다한데 그걸 전부 도스 커맨드로 치고 있다거나 배치 파일로 만들어서 실행하기에는 잔작업이 너무 많습니다. 그리고 메모장의 경우에 C#에서 제공하는 키워드를 다른 색상으로 구분해 주거나 하는 기능이 전혀 없는데 그도 그럴것이 메모장은 파일형식에는 관심이 없고 단지 내용을 보여주기만 하기 때문입니다. 통합 환경은 프로그래머의 잔작업을 덜어주고 여러가지 강력한 기능들을 모두 사용할 수 있 으므로 메모장으로 프로그램을 만드는 것 보다는 비주얼 스튜디오를 이용하는 것이 엄청난 이득입니다. 필자는 실제 현업에서도 비주얼스튜디오를 사용하고 이 책을 쓰는데도 비주얼 스튜디오를 이용하였습니다. 아마 독자분도 비주얼스튜디오를 이용하게 될 것입니다. ☺ 자, 이제 앞서 만들었던 코드를 비주얼스튜디오를 이용해서 만들어 보기로 합시다. 비주얼스튜디오 실행 <그림4> 비주얼 스튜디오를 처음 실행하면 그림4와 같은 화면을 보실 수 있습니다.
  9. 9. <그림5> 그림5와 같이 새로 만들기를 하여 프로젝트를 생성하도록 합시다.
  10. 10. <그림6> 새로 만들기를 시도하면 그림5과 같이 프로젝트 형식을 고를 수 있습니다. 비주얼스튜디오 는 C#뿐만 아니라 다른 언어 VisualBasic, J#, C++모두 똑 같은 도구를 사용하여 프로그 램을 제작할 수 있게 합니다. 우리의 관심사는 C#이므로 C#으로 프로젝트 형식을 선택합니 다. <그림7>
  11. 11. 그림7은 그림6의 우측 메뉴의 확대 부분인데 기본적으로 제공하는 템플릿들이 존재합니다. 주로 사용하는 것은 Windows 응용 프로그램이나 콘솔 응용 프로그램입니다. 필자는 여기 에서 콘솔 응용 프로그램을 선택하였습니다. 그리고 확인을 클릭하면 다음과 같은 C#코드 가 만들어 집니다. using System; using System.Collections.Generic; using System.Text; namespace firstprogramwithvs { class Program { static void Main(string[] args) { } } } 여기까지 우리가 해준 코드 작업은 아무것도 없습니다. 현재 작성된 코드는 단지 템플릿 코 드입니다. 이런 템플릿 종류는 앞서 본것과 같이 매우 다양한데 그 이유는 만들어낼 프로그 램에 따라서 처음에 기본적인 외형은 모두 똑같기 때문입니다. 만일 템플릿이 존재하지 않 았다면 프로그래머가 처음부터 이런 코드를 항상 작성해 주어야겠지요. 그리고 더불어서 이 런 기본적인 골격을 외우기도 했습니다. 필자의 경우에도 DirectX를 처음 배울 때, Windows 프로그래밍을 처음 배울 때 골격 코드를 외우기도 했습니다. 문제는 이런 골격 코드는 거의 변하지 않는다는 점이고 저희가 만들어낼 프로그램의 핵심 부분이 결코 아닙니 다. 그렇기 때문에 이런 부분은 항상 템플릿 코드를 이용해 주는 것이 정신건강에 좋습니다. ☺ 코드 작성 자, 이제 앞서 문장을 출력하기 위해서 사용했던 코드를 그대로 사용해 보겠습니다. System.Console.WriteLine("안녕~ C#");
  12. 12. 이 코드를 어디에 두어야 하느냐가 관건인데 처음 언어를 배울 때는 무작정 그대로 따라배 우는 방법밖에 없습니다. using System; using System.Collections.Generic; using System.Text; namespace firstprogramwithvs { class Program { static void Main(string[] args) { System.Console.WriteLine("안녕~ C#"); } } } 필자는 이미 알고 있는 문제이니 Main함수 안에 넣었습니다. 이제 코드도 다 작성했고 실 행파일로 만들어야 하는데 그 방법이 다릅니다. 이전에는 도스 커맨드에서 csc파일을 이용 해서 직접 프로그래머가 실행해 주었는데 이 부분은 자동화가 가능합니다. 여기서 먼저 [부록 : 비주얼 스튜디오 2005 키보드 설정]을 참고하셔서 필자와 똑같은 단 축키 설정으로 하시는 것이 좋을 것 같습니다. 자, 부록을 읽으셨다고 가정하고 바로 F7을 눌러 보도록 하지요.
  13. 13. <그림8> 빌드했습니다. 라는 말은 말 그대로 빌드를 했다는 말입니다. 즉 컴파일이 완료 되어서 실 행 파일이 나왔다는 의미입니다. C, C++프로그래머의 경우에는 컴파일과 링크 과정을 분류 해서 설명하는데 근래에는 대부분 빌드라는 말 하나로 사용합니다. 즉, 코드를 컴퓨터가 이 해하는 기계어로 바꾼 후에 목적어 코드를 생성하고 하나의 exe파일을 만들어 내는 모든 과정이 이 ‘빌드’라는 말 하나로 압축이 됩니다. C#이나 비주얼베이직 모두 ‘빌드’만을 사용 하기 때문에 앞으로도 필자가 빌드라고 말하면 실행 파일을 얻는다. 와 같은 의미입니다. 이제 프로그램을 실행해야 하는데 이 방법에는 2가지 방법이 존재합니다. F5와 Ctrl + F5입니다. F5로 실행하면 실행 프로그램에 디버거가 붙어서 실행이 되는 경우이고 Ctrl + F5는 디버 거를 붙이지 않고 실행 프로그램을 실행한다는 의미입니다. [부록 : 디버거] 콘솔 응용 프로그램의 경우에 실행을 하면 바로 프로그램이 종료가 되어서 우리가 작성했던 문장이 제대로 화면에 나타났는지 확인할 수 없기 때문에 콘솔 응용 프로그램의 경우에는 프로그램의 마지막에 잠시 응용 프로그램을 멈추는 코드를 작성하거나 Ctrl + F5로 실행하 여 그 결과를 확인해 볼 수 있습니다. 우선 여기에서는 Ctrl + F5로 실행을 해보도록 합시 다.
  14. 14. <그림9> 프로그램을 실행하면 이전에 우리가 작성했던 문장이 화면에 나타나는 것을 보실 수 있습니 다. 이 프로그램은 비주얼스튜디오를 이용하거나 단순히 메모장을 이용해서 C# 컴파일러로 직접 컴파일하거나 결과는 동일함을 알 수 있습니다. 즉, 프로그램을 만드는데는 비주얼스 튜디오는 필수는 아니더라도 직접 경험해본바 좋은 도구를 이용하는 것이 생산성이나 가독 성인 면에서 엄청나게 많은 이득이 있다는 것을 몸소 체험하셨을 거라고 생각합니다. 필자는 앞으로 만들어낼 모든 프로그램을 비주얼 스튜디오를 이용해서 작성하였습니다. 메 모장을 이용해서 만들어 내는것도 문제는 없지만 필자는 하드코어 해커는 아닙니다. ☺ 자~ 시작이 반이라고 했습니다. C#프로그램을 콘솔단에서 만들어도 보았고 윈도우 도구를 사용해서도 만들어 보았습니다. 프로그램을 처음 하시는 분들이라면 명령어도 바꾸어 보고 개수도 늘려 보시면서 재미난 것들을 하실 수 있을 거라고 봅니다. 시작이 반이라는 속담도 있지만 반은 아직 끝은 아니란 것을 염두에 두시면서 계속 공부해 보도록 합시다.
  15. 15. 2장. C#언어 문법 데이터 타입 C#에는 내장 타입과 사용자 정의 타입이 존재합니다. 객체중심에서 사용자 정의 타입은 클 래스라고 합니다. 사용자 정의 타입은 말 그대로 프로그래머가 타입을 새롭게 정의할 수 있 는 것을 뜻합니다. 우선 현재는 클래스를 배우지 않았으므로 타입이 무엇인지에 대해서 알 아보고 내장 타입에 대해서 알아보도록 하겠습니다. 타입이란 무엇인가 컴퓨터 프로그램은 프로그래머가 입력한 명령어 대로 순서대로 명령어를 실행하는 역할밖에 하지 않습니다. 명령의 종류에는 상당히 많은데 기본적으로 조건 분기가 있습니다. 예를 들 어 현재 아군 플레이어의 동료 인공지능을 작성할 때 적군의 에너지가 내 에너지보다 더 많다면 도망간다. 우리의 관심사는 타입이므로 결국 에너지에 대해서 어떠한 형을 가지고 있느냐가 관건입니 다. 에너지가 정수인지, 실수인지, 문자인지가 중요한 이유는 바로 컴퓨터에서 사용되는 모 든 데이터는 메모리 양에 민감하게 반응하기 때문입니다. 예를 들어서 나이를 표현할 때 1,2,3살 과 같이 표현하지 3.2살 3.23살 이렇게 표현하지 않 습니다. 그러므로 나이라는 데이터를 컴퓨터에 저장하기 위해서는 실수보다는 정수형으로 저장하는 것이 메모리를 더 아낄 수 있는 것입니다. 데이터 타입을 선언할 때는 fit하다. 라 는 표현을 쓰는데 데이터 타입에 대해 데이터가 fit할 때 타입을 잘 결정했다고 말할 수 있 습니다. 예를 들어서 실수(double)형은 8byte를 차지하고 정수(int32)형은 4byte를 차지합니다. 그 리고 double은 정수형을 포함하고 있습니다. 그렇다고 모든 데이터에 대한 타입을 double 로 하면 메모리를 상당히 낭비하는 경우가 있을 수 있습니다. 예를 들어서 다음과 같이 축구 선수 데이터가 있습니다. 키 나이 체중 스피드 8byte 8byte 8byte 8byte 4byte 4byte 4byte 4byte
  16. 16. 사실 8byte를 사용해서 모든 데이터 타입을 사용해도 32byte밖에 안되고 4byte로 사용하 면 16byte밖에 되지 않습니다. 문제는 이 선수들이 몇 명이냐에 따라서 결과가 엄청나게 달라집니다. 선수가 15000명이라면 전자는 480kb를 사용하고 후자는 240kb를 사용합니다. 실제 게임 에서 사용하는 데이터는 필드가 단지 4개만 있지는 않습니다. 결국 엄청나게 많은 필드들이 사용되고 캐릭터 개수를 모두 곱하거나 주변 환경 데이터까지 고려하면 타입 하나 설정하는 것이 엄청나게 중요하다는 사실을 알 수 있습니다. 필자의 경험으로 480kb 역시 pc사용자 들은 코웃음이 나올 정도로 작은 양이지만 모바일 게임이 대략 3~500kb인 것을 감안하면 (그 안에 그래픽, 게임로직, 사운드) 결코 간단한 문제가 아닙니다.1 하지만! 프로그래밍 언어를 처음 배우는 분들에게 이런 모든 것들을 바라기에는 무리가 있 습니다. 왜냐하면 필자도 그랬고 지금 당장 언어를 배우는거 자체가 우선 순위가 가장 높기 때문이지요 ☺ 마지막으로 표를 통해서 C#에서 제공하는 타입에 대해서 알아보도록 합시다. CLR C++ C# SByte char sbyte Byte unsigned char byte Int16 short short UInt16 unsigned short ushort Int32 int int UInt32 unsigned int uint Single float float Double double double Boolean bool bool Char wchar_t char String String string Object Object object C++을 배워본 독자라면 C#이 C++과 매우 흡사함을 알 수 있습니다. C#에서는 당연히 1 필자가 만든 핀볼 게임도 용량이 3~400kb 사이였습니다.
  17. 17. CLR타입으로도 프로그래밍이 가능합니다.2 필자는 CLR타입으로 코드를 작성하는 것이 손 에 익숙하지 않아서 C#타입으로 모든 코드를 작성했습니다. 내장 타입 선택 C#의 내장 타입 목록은 다음과 같습니다. 닷넷 타입 크기(바이트) 설명 byte 1 부호 없는 8비트(0~255) char 2 유니코드 문자 bool 1 참 또는 거짓 sbyte 1 부호 있는 8비트(-128~127) short 2 부호 있는 16비트(-32768~32767) ushort 2 부호 없는 16비트(0~65535) int 4 부호 있는 32비트(- 2,147,483,648~2,147,483,647) uint 4 부호 없는 32비트(0~4,294,967,295) float 4 약 +/- 1.5 * 10-45승~ +/- 3.4 * 10의38승까지의 값을 유효숫자 7자리로 갖는 부동 소수점 수 double 8 약 +/- 5.0 * 10-324승~ +/- 1.7 * 10우ㅏ 308승 까지의 값을 유효숫자 15~16개의 자릿수 타입이란 무엇인가?에서 이미 알아보았듯이 타입 크기를 정하는 것은 메모리의 크기를 프로 그래머가 결정하는 것을 의미합니다. 예를 들어서 int Data; Data라는 변수는 부호 있는 32비트로 메모리를 차지하고 타입에서 제공할 수 있는 크기만 큼 숫자 영역을 사용할 수 있습니다. 타입의 변환 타입을 이용해서 데이터를 설정하고 이러한 데이터를 코드 로직을 통해서 컴퓨터에게 명령 을 내리거나 계산을 수행할 수 있습니다. 그런데 이렇게 데이터를 사용하다보면 언젠가는 2 닷넷 플랫폼을 지원하는 모든 언어가 가능합니다.
  18. 18. 타입 변환을 필요로 하는데 예를 들어서 자릿수를 자르고 싶을 경우 float PI = 3.141593F; int PI_Int = (int)PI; System.Console.WriteLine("PI = " + PI); System.Console.WriteLine("PI_Int = " + PI_Int); 위와 같이 가능합니다. 즉, PI_Int는 소수점이 모두 잘려나가 3이라는 값만을 가집니다. 이 것을 타입 캐스트, 타입 변환이라고 합니다. 대부분의 다른 언어도 마찬가지로 작은 데이터 타입에서 큰 데이터 타입으로의 직접 대입은 유효합니다. 예를 들어 다음의 코드 float PI = 3.141593F; int PI_Int = 5; PI = PI_Int; 의 경우는 아무런 문제 없이 실행되지만 float PI = 3.141593F; int PI_Int = 5; PI_Int = PI; 의 경우에는 다음과 같은 오류 메시지를 나타냅니다. <그림10> float에서 int로의 암묵적 타입 변환은 C#에서는 오류로 취급하고 있습니다. 왜냐하면 float 값은 3을 포함할 수 있지만 int값은 3.14를 포함할 수 없으므로 자릿수가 잘려나갈 위험성 이 있기 때문입니다. 프로그래밍을 처음 배울 때 대부분 이 타입 변환으로 인한 위험성을
  19. 19. 간과하기 쉽습니다. 왜냐하면 3.14에서 자릿수 0.14가 잘려나간다고 해도 크게 문제될 것 없이 돌아가는 프로그램도 있기 때문입니다. 하지만 해당 로직이 게이머 3천명이 접속되어 있는 서버에 있다거나, 이미 제품화되어서 패치할 수도 없는 패키지 게임이라면 이 별 것 아닌 것으로 인해서 눈물을 쏟는 경험을 하게 될지도 모릅니다. C++의 경우 경고 레벨에 따라서 이러한 경고를 오류로 분류하지만 C#은 기본적으로 오류 로 분류합니다. 만일 굳이 변환해야 한다면 명시적인 타입 변환을 해주어야 합니다. 숫자와 문자열 사이의 변환 필자가 느끼는 C#의 강력함은 기본적으로 제공하는 것들이 상당히 많다는 것입니다. 가장 최근에 나온 언어가 가장 큰 이유이기도 하지만 그만큼 많은 부분들에 있어서 편리한 부분 이 많습니다. 예를 들어서 정수를 문자열로 변환하기 위해서는 다음과 같은 코드로 해결이 가능합니다. string strText = "텍스트"; int Data = 1234; strText += Data.ToString(); System.Console.WriteLine(strText); 아마 이 코드를 보고 C++프로그래머들은 “앗! 이건 마법이다!”라고 할지도 모르겠습니다. 필자가 보기에도 충분히 마법과 같아 보이지만 익숙해지면 정말 편리한 마법이라 고마워 할 지도 모르겠습니다. ☺ C#에서 제공되는 모든 타입들은 모두 객체입니다. 심지어는 내장 타입도 객체입니다. Int의 내부를 들여다 보면 다음과 같이 구현이 되어 있습니다. using System.Globalization; using System.Runtime.InteropServices; namespace System { // 요약: // 부호 있는 32비트 정수를 나타냅니다. [Serializable] [ComVisible(true)]
  20. 20. public struct Int32 : IComparable, IFormattable, IConvertible, IComparable<int>, IEquatable<int> { public const int MaxValue = 2147483647; public const int MinValue = -2147483648; public int CompareTo(int value); public int CompareTo(object value); public bool Equals(int obj); public override bool Equals(object obj); public override int GetHashCode(); public TypeCode GetTypeCode(); public static int Parse(string s); public static int Parse(string s, IFormatProvider provider); public static int Parse(string s, NumberStyles style); public static int Parse(string s, NumberStyles style, IFormatProvider provider); public override string ToString(); public string ToString(IFormatProvider provider); public string ToString(string format); public string ToString(string format, IFormatProvider provider); public static bool TryParse(string s, out int result); public static bool TryParse(string s, NumberStyles style, IFormatProvider provider, out int result); } } 그러한 이유로 Data.ToString()과 같은 마법도 부릴 수도 있는 것입니다. 사실 알고 보면 마법도 아닌것이지요. ☺ 모든 객체에 ToString 메소드가 제공됩니다. 그 결과로 문자열 객체를 만들어 냅니다. 혹은 Convert객체를 이용해도 가능합니다. string strText = "텍스트"; int Data = 1234; strText += Convert.ToString(Data); System.Console.WriteLine(strText);
  21. 21. Convert는 static이기 때문에 모든 영역에서 사용이 가능합니다. using System.Runtime.InteropServices; namespace System { // 요약: // 기본 데이터 형식을 다른 데이터 형식으로 변환합니다. public static class Convert { // 생략 } } 문자열을 숫자로 변환하는 것 역시 간단하게 해결이 가능합니다. string strData = "1234"; int intData = Convert.ToInt32(strData); 그렇다면 다음과 같은 생각을 해볼 수 있습니다. “만일 strData가 1234가 아니라 123AAA4라면?” C#컴파일러가 컴파일 과정에서 이러한 코드를 찾아낼 수도 있지만 필자는 그 정도까지 바 라진 않습니다. ☺ 그렇다면 런타임에서 문제가 생긴다는 것인데 실제로 실행해 보면 예외가 일어납니다.
  22. 22. <그림11> 결국, 입력 문자열 형식이 잘못되었다는 예외가 발생하고 프로그래머가 Convert의 ToInt32 메소드를 호출하기 이전에 strData가 숫자형인지 검사를 하거나 다음과 같이 예외를 사용해 서 문제를 해결해야 합니다. try { string strData = "123AAA4"; int intData = Convert.ToInt32(strData); } catch (Exception e) { System.Console.WriteLine(e.Message); } 프로그램을 실행하면 콘솔에 다음과 같이 메시지가 나타납니다.
  23. 23. <그림12> 예외 사용에 대한 자세한 사항은 예외 절을 참고 하시길 바랍니다. 변수 선언과 다중 변수 변수를 선언하는 방법은 앞서 배운 예제들을 통해서 알 수 있지만 다시 한번 정리 해보도록 하겠습니다. 변수를 선언하는 방법은 기본적으로 타입 변수명; 입니다. int Data; 여기서 비주얼베이직에서 변수를 선언하는 방법을 잠시 보면 Dim DataA as integer, DataB DataA라는 변수는 integer 타입을 갖지만 DataB는 variant 타입을 갖습니다. DataA와 DataB를 모두 integer로 선언하기 위해서는 다음과 같이 Dim DataA as integer, DataB as integer 으로 선언하여야 합니다. C#에서는 C/C++과 같이 한 라인에 같은 타입으로 변수들을 설정 할 수 있습니다.
  24. 24. int DataA, DataB; 물론 C#에서는 C/C++과 동일하게 초기화 및 선언이 동시에 가능하기 때문에 다음과 같은 코드도 가능합니다. int DataA = 10, DataB = 20; 하지만 일반적으로 프로그래머들은 변수들을 선언할 때 한 행에 변수 하나씩 쓰는 것을 주 로 이용하므로 다음과 같이 작성합니다.3 int DataA = 10; int DataB = 20; [한마디] 대부분의 프로그래머들은 다중 변수 선언이 된다고 해도 실제로는 줄을 바꾸어서 선언하고 정의하는걸 더 즐겨 쓰는데 그 이유는 추후에 삭제 혹은 주석 처리가 용이하다는 장점이 있습니다. 예를 들어 int DataA = 10, DataB = 20; 에서 DataA를 주석 처리 하고 싶으면 // int DataA = 10, int DataB = 20; 과 같이 코드를 다시 써주어야 하지만 int DataA = 10; int DataB = 20; 과 같이 되어 있으면 그냥 첫번째 라인만 //로 주석처리 해버리면 문제가 간단하게 해결이 되기 때문입니다. 3 변수를 선언하고 주석을 사용하기 위해서가 아닐까 생각합니다.
  25. 25. 상수 상수(constant)는 값이 변하지 않는 수라는 의미의 변수입니다. 일반적으로 설정된 타입의 변수를 선언하고 나면 해당하는 변수에 프로그래머가 작성한 데이터가 들어가게 됩니다. 그 값은 런타임 도중에 바뀌는 것이 대부분입니다. 그 값을 수정할 수 없게 하기 위해서는 const라는 키워드를 이용하면 됩니다. 물론 A라는 프로그래머가 B라는 프로그래머에게 “sData라는 데이터 값을 절대로 바꾸면 안돼!” 라고 이야기 해도 수 많은 코드를 작성하거나 라이브러리에 뒤엉키다 보면 변수를 수정할 가능성이 존재합니다. 하지만 const라는 키워드를 사용하면 프로그램이 실행되고 난 후에 절대로 변하지 않는 수가 됩니다. 그 값을 수정하려고 하는 코드는 컴파일 과정에서 컴파일 오류를 나타내어 줍니다. 상수는 리터럴(literal), 심볼 상수(symbolic constant), 열거(enumeration)의 세 종류가 있 는데 차례대로 알아보도록 합시다. 리터럴 상수 x = 65; 위 문장에서 65라는 수는 리터럴 상수입니다. 당연히 다음과 같은 방법은 통하지 않습니다. 65 = 23; 심볼 상수 심볼 상수는 이름에 상수값을 부여합니다. 그 사용 방법은 아래와 같습니다. const 타입 식별자 = 값; 예를 들어 파이 값은 변하지 않는 수이고 이것을 만들기 위해서 다음과 같은 코드를 작성합 니다.4 4 이 책이 출판되기 몇 년 전까지만 해도 소수점 값은 float형을 자주 사용했습니다. 하지만 실제 게임에서는 특히나 물리 연산이 많이 계산되는 게임에서는 소수점 값을 double로 사 용합니다. float의 경우는 작은 연산이 누적되었을 때 오차율이 존재하기 때문입니다.
  26. 26. const double PI = 3.1415926535897;5 만일 PI라는 상수값에 값을 대입하려고 한다면 다음과 같은 오류를 얻게 됩니다. // 아무래도 아닌 것 같아. PI값을 수정하자. PI = 3.1415926535; <그림13> 친절하게 오류가 나타납니다. 열거 상수 열거는 나열자라고도 합니다. 프로그래머가 지정한 값들만 가질 수 있는 타입을 열거 상수 라고 말합니다. 사실 열거 상수는 심볼 상수와 매우 흡사한데 다음의 예를 통해서 알아보도 록 합니다. 만들고 있는 게임은 퀘이크와 같은 1인칭 FPS입니다. 이 게임에는 아머(Amor)라는 것이 존재하는데 맵 상에서 아머를 먹고 나면 일정 시간이 지나고 나서 다시 아이템이 생겨납니 다. 이 때 이 시간값은 상수값으로 정해져 있는데 노란색 아머와 빨간색 아머는 각기 다른 시간값을 가지고 있습니다. 그것을 다음의 코드를 통해서 설정해 보도록 합니다. enum AMOR_TYPE { cYellowAmor = 10, 5 파이값은 13자리까지 게임계에서 주로 사용합니다.
  27. 27. cRedAmor = 30 } 노란색 아머는 10으로 설정되어 있고 빨간색 아머는 30초로 설정되어 있습니다.6 이 값은 프로그램이 실행되고 난 후에는 변하지 않는 값입니다. 이 값을 일반 변수처럼 사용하면 됩 니다. 연산자 이제 C#에서 제공하는 연산자들에 대해서 알아보도록 할 것입니다. 연산자란 컴파일러로 하여금 어떠한 행동을 취하게 만드는 기호입니다. 연산자는 피연산자(Operand)에 작용을 가하는데 C#에서 모든 피연산자는 수식입니다. 연산자에는 다음과 같은 종류가 있습니다. 대입 연산자 산술 연산자 관계 연산자 논리 연산자 대입 연산자 대입 연산자는 할당 연산이라고도 합니다. 이미 수학시간에 배웠던 연산자인만큼 그 의미는 이미 충분히 알고 계실 것입니다. int x = 10; int타입을 갖는 x라는 변수에 상수값 10을 대입하는 문장입니다. 문장은 때로는 구문이라고 도 부릅니다. 즉 대입 연산자의 오른쪽에 있는 피연산자 값을 왼쪽에 있는 피연산자에 대입 하는 연산입니다. 이미 리터럴 상수에서 배웠듯이 다음과 같은 구문은 에러입니다. 10 = x; // 도대체 무슨 생각을… 산술 연산자 C#은 다섯 개의 산술 연산자를 제공합니다. 네 개는 사칙연산을 위해서 사용하고 나머지 6 필자가 퀘이크에 한참 빠져있을 때는 모든 시간을 외우고 있었는데 지금은 모두 까먹어 버렸습니다.
  28. 28. 하나는 나머지 값을 계산하기 위해서 사용합니다. 연산자 의미 + 덧셈 - 뺄셈 * 곱하기 / 나누기 % 나머지 나머지 연산자 사칙연산 연산자의 4가지(+,-,*,/) 연산은 너무나 일반적이라 더 이상 설명할 것이 없습니 다. 하지만 나머지 연산에 대해서는 조금 자세히 알아 보아야 합니다. 나머지 연산은 기호 (%)를 사용합니다. int nData = 10; int nMod = nData % 3; System.Console.WriteLine("나머지 : " + nMod); nData라는 변수에 10이라는 값을 넣고 3으로 나눈 나머지를 nMod에 넣었습니다. 결과는 1이라는 값이 나옵니다. 이 나머지 연산은 게임 프로그래밍에서도 매우 유용하게 사용됩니 다. 버추얼 파이터 같은 게임에서 적 케릭터가 게이머에게 상단 발차기 공격을 시도하려고 합니다. 물론 이러한 행동의 의사 결정은 AI로직이 결정하게 됩니다. 그렇다면 AI로직이 상 단 발차기를 해야 되는지를 설정해야 하는데 그것을 간단한 나머지 연산으로 실행해 보겠습 니다. Random r = new Random(); int nResult = r.Next() % 100; if (nResult >= 60) { ActionKick(); } 조금 복잡해 보입니다만 매우 간단합니다. 우선 r이라는 랜덤 클래스의 인스턴스를 얻습니 다. 컴퓨터에서 무작위 수를 구하기 위해서 Random클래스를 사용합니다. 그 이후에 Random클래스의 Next라는 메소드를 통해서 음수가 아닌 숫자 int타입 범위 안에서 숫자값 을 구합니다. 그 값을 100으로 나눈 나머지 수는 100보다 작게 됩니다. 그 값의 범위는
  29. 29. 0~100이 되는데 그 결과값이 60이상이라면 100을 100%라고 본다면 무작위 수의 결과에 서 60%이상일 때 ActionKick이라는 동작을 한다라는 의미입니다. ActionKick()은 함수인데 그것은 해당 이야기에서 다루도록 하겠습니다. 나머지 연산자를 이용하는 주된 작업 중에는 어떠한 수의 배수를 구하는 경우가 있습니다. 예를 들어, 어떤 수를 n으로 나누어서 그 나 머지 값이 0이라면 해당 수는 n의 배수가 됩니다. 구체적인 예는 다음과 같습니다. Random r = new Random(); int nData = r.Next(); int nResult = nData % 2; if (nResult == 0) { System.Console.WriteLine(nData + "는 2의 배수입니다."); } else { System.Console.WriteLine(nData + "는 2의 배수가 아닙니다."); } r인스턴스로부터 무작위 수를 얻은 후에 2로 나눈 나머지가 0이라면 2의 배수이고 나누어 떨어지지 않으면 2의 배수가 아니라는 것을 알 수 있습니다. [한마디] 앞서 변수가 0인지 아닌지를 구분하기 위해서 다음과 같은 수식을 사용했습니다. if ( nResult == 0 ) { } 만일 프로그래머가 실수로 다음과 같은 코드를 작성했다면 어떻게 될까요. if ( nResult = 0 ) { }
  30. 30. 실제로 C/C++문법에서는 이 표현식은 유효합니다. 그러므로 결과는 nResult의 값에 따라 0이 아닐 경우에 참이 되어 로직이 실행됩니다. 즉 원래 의도했던것과는 전혀 다른 제어가 되고 더군다나 nResult값까지 바뀌어 버리니 이로 인해서 얻는 버그 혹은 Side Effect는 상 상을 초월합니다. 그래서 C/C++프로그래머는 다음과 같은 형식으로 조건식을 쓰도록 방법 을 만들어 냈습니다. if ( 0 == nResult ) { } 이렇게 되면 프로그래머가 실수로 0 = nResult로 한다고 해도 리터럴값에 변수를 대입하는 것으로 컴파일 과정에서 에러를 내뱉습니다. 지금까지 긴 이야기를 하였는데 C#에서는 이 러한 걱정을 전혀 안해도 됩니다. 왜냐하면 C#에서는 if ( nResult = 0 ) 과 같은 구문이 유효하지 않기 때문입니다. 증가연산자와 감소연산자 증가연산자와 감소연산자는 프로그램을 작성할 때 매우 자주 쓰이는 연산자 중에 하나입니 다. 변수에 값을 더하고 빼는 것 그리고 그러한 결과를 동일한 변수에 써넣는 것은 매우 자 주 일어납니다. 예를 들어서 사람의 나이를 저장하는 변수가 있습니다. byte nAge = 1; nAge라는 변수는 0~255까지 숫자를 저장할 수 있습니다. 필자가 살아온 지금까지 255세 이상까지 살아온 사람은 없기 때문에 nAge를 byte로 선택했습니다.7 처음에 태어난 나이는 1살입니다. 어떠한 로직에 의해서 (실 세계에서는 시간) nAge가 변동이 된다고 합시다. 일 반적으로 1년이 지나면 우리는 한 살을 먹기 때문에 다음과 같이 될 겁니다. nAge = nAge + 1; 위의 구문은 현재의 nAge값에 + 1을 하여 그 결과값을 nAge에 넣어라. 라고 하는 말과 같 습니다. 만일 nAge에 1이라는 값이 설정되어 있다면 다음과 같이 되었겠지요. 7 타입이란 무엇인가?란에서 자세히 알아 보았습니다.
  31. 31. nAge = 1 + 1; 결과로써 nAge에는 2라는 숫자가 들어가게 됩니다. C#에는 증가 연산자와 감소 연산자를 제공하고 있는데 그것은 ++, --입니다. 이 연산은 해당 변수에 1의 단위로 피연산자의 값 을 +하거나 –합니다. 예를 들어서 위의 코드는 다음과 같이 간단하게 표현이 가능합니다. nAge++; 이제 아시겠지요? 결과는 역시 nAge가 1이라고 할 때 2가 됩니다. 2살이 설정된 상태에서 1을 줄이고 싶다면 다음과 같이 감소 연산자를 사용하면 가능합니다. nAge--; 그 결과는 1이 됩니다. 전위 연산자와 후위 연산자 증가 연산자와 후위 연산자를 사용하는데 있어서 2가지 방법이 존재합니다. 전위형(Prepfix) : ++Variable, --Variable 후위형(Postfix) : Variable++, Variable-- 증가 연산자와 감소 연산자에서 알아본 것은 바로 후위형 연산입니다. 이 두 가지는 어떻게 사용하느냐에 따라서 미묘한 차이를 불러 버그를 만들어 내는 경우도 있습니다. 가령 다음 과 같은 코드를 보도록 합시다. byte nAge = 1; byte CurrentAge = nAge++; System.Console.WriteLine("현재 나이는 " + CurrentAge); 위의 코드를 실행 시켜 보면 CurrentAge에는 1이라는 값이 들어가 있습니다. 무언가 헷갈 리지 않습니까? 그렇다면 다음의 코드는 어떻게 될까요? byte nAge = 1; byte CurrentAge = ++nAge; System.Console.WriteLine("현재 나이는 " + CurrentAge);
  32. 32. 위의 코드는 CurrentAge에 2라는 값이 들어갑니다. 이 두 가지가 바로 후위형과 전위형의 차이입니다. 결론적으로는 메시지가 출력된 이후에 nAge의 값을 1증가 시킵니다. 하지만 두 가지 형태 는 증가가 일어나는 시기가 서로 다릅니다. 전위형의 경우 ++nAge는 변수 nAge의 값을 1 증가시킨 후에 대입을 실행하고 nAge++ 은 nAge의 값을 대입한 후에 1 증가 시킵니다. 그렇기 때문에 CurrentAge에는 증가되는 시기가 다른 것에 따라 그 결과값이 1과 2로 나누어 지게 되는 것입니다. 물론 해당 구문이 끝나고 nAge의 값은 전위형과 후위형에 상관없이 1이 증가된 2가 되어 있습니다. byte nAge = 1; byte CurrentAge = nAge; nAge++; System.Console.WriteLine("현재 나이는 " + CurrentAge); 물론 위와 같이 코드를 작성해도 문제 없습니다. ☺ 산술 대입 연산자 증가 연산자와 감소 연산자는 정말로 자주 쓰이는 연산이기에 따로 설정된 연산자이고 어떠 한 산술적인 연산을 하고 그 결과를 변수에 대입하는 연산을 쉽게 하기 위해서 C#은 아래 와 같은 연산자를 제공하고 있습니다. 식 의미 += n 해당 변수에 n을 더하여 변수에 대입 -= n 해당 변수에 n을 뺄셈하여 변수에 대입 *= n 해당 변수에 n을 곱하여 변수에 대입 /= n 해당 변수를 n으로 나누고 그 결과를 변수에 대입 %= n 해당 변수를 n으로 나눈 나머지를 변수에 대입 <<= n 해당 변수를 왼쪽으로 n번 쉬프트 하여 그 결과를 변수에 대입 >>= n 해당 변수를 오른쪽으로 n번 쉬프트 하여 그 결과를 변수에 대입 &= n 해당 변수와 n을 and연산하여 그 결과를 변수에 대입 |= n 해당 변수와 n을 or연산하여 그 결과를 변수에 대입 ^= n 해당 변수와 n을 베타적 Or(XOR)연산 하여 그 결과를 변수에 대입
  33. 33. 비트 연산자 비트 연산자는 C언어에서 유래한 것입니다. 비트 연산자는 두 개의 변수를 비트 단위로 AND, OR, NOT연산을 수행하여 결과 값을 만들어 냅니다. 식 의미 & 비트 단위 And | 비트 단위 Or ~ 1의 보수 ^ 베타적 Or >> 오른쪽 쉬프트 << 왼쪽 쉬프트 byte타입의 변수값은 8개의 비트값을 가지고 있습니다. 0 0 0 0 0 0 0 0 8개의 비트로 표현할 수 있는 값은 255입니다. 예를 들어서 모든 비트 플래그가 On으로 되 어 있다면 1 1 1 1 1 1 1 1