저자: 한동훈(
traxacun@unitel.co.kr)
들어가기 전에
이 글은 C#을 가르치려는 목적으로 쓰여진 것은 아닙니다. C#을 배워보고 싶거나 프로그래밍을 배워보고 싶은 분들을 위한 것이고, 특히 이러한 분들 중에서
『C# 프로그래밍』(한빛미디어, 2001)라는 도서를 선택한 분들을 위한 것입니다. 저는 이 책을 교재로 선택했고 매일 90분씩 강의를 하고 있습니다. 그러니까 이 글은 제가 강의한 내용을 정리한 것입니다. 책에는 모든 설명이 자세히 되어 있습니다. 때문에 저는 주로 개념만을 설명하고, 나머지는 책을 공부하는 형태를 따르도록 하겠습니다. 그리고 모든 코드는 직접 입력해보고 사용하기를 권하고 있습니다.
C#을 설명하지만 다른 언어들과의 비교도 자주 합니다. 주로 C, C++, 자바가 되겠지요. C# 입문서를 쓴다면 C#만 설명해도 되겠지만 강의를 듣는 사람 중에는 C를 하다가 때려친 사람, C++을 하다 때려친 사람, 자바를 하다가 때려친 사람도 있을 것이고 이미 다른 언어를 알고 있으면서 C#을 배워보려는 사람도 있을 것이기 때문입니다.(웃음) 그러니까 이 글은 지금까지 프로그램을 한 번도 작성한 분들이 없는 분을 대상으로 한 것이고 프로그래밍이란 이런 것이다라는 것, 프로그래밍이란 무엇인가를 이해시키기 위한 목표로 작성되었습니다.
사실, 교재는 두 권을 선택했습니다. 한 권은
『C# 프로그래밍』(한빛미디어, 2001)이고, 다른 한 권은
『Visual Studio .NET 웹 프로그래밍』 (대림, 2001)입니다. 한빛미디어의
『C# 프로그래밍』은 C#에 대한 기초와 닷넷 프레임워크에 대한 전반적인 개요로 되어 있는 반면
『Visual Studio .NET 웹 프로그래밍』 은 이미 C#과 HTML, XML 등에 대해서 알고 있다는 전제하에 쓰여진 책으로 주로 활용을 위한 책입니다. 그리고 아직 선택되지 않은 교재가 한 권 있습니다.
『Programming ASP.NET』(오라일리, 2002)의 번역서인데 6월에는 구경할 수 있으리라던 책이 아직 나오지 않았군요.(역자가 게으름을 피우는 것 같습니다. ^^/) 때문에 웹 프로그래밍을 시작할 때쯤에
『Programming ASP.NET』의 번역서가 나오면 번역서로, 그렇지 않다면 다른 책으로 진행할 생각입니다. 미정이지요.
예, 생각해보니 제가 한빛미디어에서 나온 책들을 많이(?) 사용하고 있더군요. 평소에 제가 봤던 책들이 주로 오라일리 책들이다 보니 그런 것 같습니다. 때문에 강의를 하고, 학습자의 반응을 잡아낼 수 있을 때, 책에서 부족한 부분들과 책에는 없지만 알아두면 좋은 개념들을 비롯하여 독자들이 쉽게 이해하지 못하는 부분이나 개념들을 정리하여 책을 구매한 분들에게도 도움이 되지 않을까 해서 이렇게 글을 남깁니다.
여러분들도 하다가 잘 안되는 코드들이나 문제가 있으면 알려주시기 바랍니다. 특히
『C# 프로그래밍』에 있는 예제 코드들 중에 안되거나 이상한 것이 있다면 제가 잡아드리겠습니다. 그런 것들은 글을 통해서 소개해 드리도록 하지요. ^^;
매시간마다 주요 개념들을 간단하게 설명하고, 지난 시간에 이해되지 않았던 부분을 질문하고 이에 대해 대답을 하는 형태로 진행해 나갈 계획입니다. 따라서 Hello World 프로그램을 작성하는 것이라든가, Console.WriteLine()과 같은 메소드 사용방법을 설명하는 경우는 없습니다. 이런 것들은 책에 잘 설명되어 있을 뿐만 아니라 거의 모든 입문서에 소개되어 있기 때문입니다.
첫날은
『C# 프로그래밍』의 1장에서 3장까지의 범위입니다. 첫날은 간단한 오리엔테이션과 함께 1장에서 3장까지 미리 읽고, 예제를 해볼 것을 당부하는 것으로 끝났으며, 진짜 강의는 둘째날부터 시작했습니다. 그럼 시작해 볼까요.
프로그래밍 언어
프로그래밍 언어란 사람이 알아들을 수 있는 말로 명령하면, 컴파일러는 이것을 기계어로 번역해주고, 컴퓨터는 기계어로 번역된 것을 실행하는 것일 뿐입니다.
언어에 대한 모든 것을 알아야하는가?
여러분은 그렇게 생각하고 있습니까? 실제로 숙련된 프로그래머들을 보면 전체 언어가 제공하는 기능들 중에 10-20% 정도 밖에 사용하지 않습니다. 책은 개발자를 위한 지침이기 때문에 언어에 대한 100%, 즉 모든 것을 설명하지만 여러분이 그것들을 모두 숙지하고 익혀야 할 필요는 없습니다. 단지, 책을 보면서 그러한 것이 거기에 있었다는 것만 알면 됩니다.
저는 강의 시간 내내 여러분에게 강조할 것입니다. 책에 있는 내용들은 외우지 말고, 읽고 이해한 다음에 잊어버리십시오.
언어는 크게 3가지 일을 한다.
현대 프로그래밍 언어들은 특수한 일부 언어들을 제외하면 크게 3가지 작업으로 나뉘어져 있습니다. 뭘까요? 이 세 가지 작업은 메모리에 값을 저장하는 배정, 메모리에 있는 데이터를 계산하는 연산, 그리고 이 두 가지 작업, 배정과 연산을 반복하는 루프로 되어 있습니다.
첫 번째는 메모리에 값을 저장하는 것입니다. 흔히, 배정(Allocation) 또는 할당이라는 용어를 사용합니다. "변수에 값을 저장한다"는 것은 배정을 뜻합니다. 즉, 디스크에 있는 데이터를 메모리로 읽어들이는 것이나 메모리에 있는 데이터를 CPU가 읽어들일 수 있게 하는 것이 이에 해당합니다.
두 번째는 연산입니다. 간단히 말해 CPU가 데이터를 가져갔으면 그 데이터를 계산하는 것입니다. 덧셈을 하든, 뺄셈을 하든, 곱셈을 하든, 나눗셈을 하든, 뭘 하든 간에 모든 작업은 연산입니다. 값을 비교하는 것도 연산입니다. 1이 5보다 큰지 작은지 비교하는 것도 연산에 속합니다.
세 번째는 앞서 얘기한 것처럼 첫 번째와 두 번째를 반복하는 루프(loop)입니다. 워드를 사용하든, 인터넷을 사용하든 간에 프로그램의 입장에서 보면 메모리에 값을 저장하고, CPU가 메모리의 값을 읽어들여서 계산하고, 이것을 무한히 반복하는 과정이 루프인 것입니다.
데이터 형식(data type)
프로그래밍 언어를 배우려고 하다보면 데이터 형식이라는 것이 등장합니다. 우리가 보고 있는 『C# 프로그래밍』이란 책에도 데이터 형식이 나와 있습니다. int, float, double, long, decimal, short, byte… 뭐뭐뭐~~
늘 얘기하는 거지만 책에 있는 데이터 형식 표에 포스트-잇을 하나 붙이고, 이런 것들은 잊어버리십시오. 대부분의 개발자들은 언어가 제공하는 것들 중에 10-20% 밖에 사용하지 않습니다. 나머지는 모두 사용 빈도가 낮은 것들 뿐입니다.
int는 정수를 저장하는데 사용합니다. 32 비트를 사용해서 데이터를 저장합니다. 8비트 = 1 바이트, 즉 4 바이트를 사용합니다. 다시 말해서 이런 형식으로 데이터를 저장한다는 것이지요.
0000 0000 0000 0000 0000 0000 0000 0000
보기 좋게 4 개 단위로 나눴습니다. 이와 같이 2진수로 32개를 기준으로 데이터를 저장한다는 것입니다. 그러니 최대로 저장할 수 있는 데이터 크기는 2
32 - 1 이 됩니다. 왜 -1이 있죠? 네… C#에서는 수가 0부터 시작한다고 생각하기 때문입니다. 그러니 당연히 1을 빼줘야 정확한 값이 될 겁니다. 사실, 골치 아프게 이 값을 계산할 필요는 없습니다.
Console.WriteLine(System.Int32.MaxValue);
Console.WriteLine(System.Int32.MinValue);
이와 같이 쓰거나 아래와 같이 쓸 수 있습니다.
int a;
Console.Writeline(a.MaxValue);
Console.WriteLine(a.MinValue);
어느 쪽을 쓰거나 해당하는 데이터 형식이 가질 수 있는 최대값과 최소값을 친절하게 표시해 줍니다.
실수를 저장하기 위해서 쓸 수 있는 형식으로는 float가 있습니다. float 보다 더 큰 데이터를 저장하고 싶다면 double을 사용할 수 있습니다. 어쨌거나 이것도 사용방법은 int와 동일합니다.
float pi;
pi = 3.14
Console.WriteLine(pi);
또는
Console.WriteLine(pi.ToString());
이와 같이 사용하면 됩니다. 첫 번째 Console.WriteLine(pi)는 사실 두 번째와 동일한 의미를 갖습니다. C#에서 알아서 ToString()을 호출해준다고 생각하면 됩니다.(사실은 implicit conversion이고, 이에 대한 정의가 포함되어 있습니다. 하지만, explicit conversion과 implicit conversion에 대해서는 나중에 클래스에 대해서 설명할 때 설명하겠습니다)
Console.WriteLine은 문자열, 즉 string 형식만 사용할 수 있습니다. 그러니 여러분은 되도록이면 변수의 끝에 ToString() 을 붙이는 습관을 가지세요. 명확하게 문자열로 사용하고 있다는 것을 지정할 뿐만 아니라 이런 식의 습관이 객체나 클래스에 대한 개념을 이해하는 데 큰 도움이 됩니다.
앞에서 어떤 수가 float 형식이라는 것을 지정하고 싶다면 끝에 f를 붙일 수 있습니다. 즉, 다음과 같이 쓸 수 있다는 것이지요.
float pi;
pi = 3.14f;
대부분의 경우에는 문제가 되지 않습니다. 하지만 C#은 실수에 대한 기본 데이터 형식으로 double을 사용하고 있습니다. 그러니 float를 쓰는 것은 다소 예외적인 경우이기 때문에 분명히 "f"를 사용하게 될 때가 있을 겁니다.
나머지 데이터 형식들은 모두 책에 잘 설명되어 있습니다. 그리고 대부분의 경우에 여러분은 그 모든 데이터 형식을 사용하지 않습니다. 대부분의 프로그램에서 여러분은 int만 사용할 겁니다. 그리고 기껏해야 실수를 쓰기 위해 float나 double을 사용할 것이고, 아주 큰 수를 표현하기 위해 long을 사용하지만, 대부분의 경우에 int도 충분히 큰 숫자이기 때문에 사용하는 데 지장이 없습니다.
그리고 문자열을 저장할 수 있는 string 형식을 빈번하게 사용하겠지요.
Console.WriteLine() 사용하기
책에 사용된 Console.WriteLine을 보면 위치를 지정하기 위해 {0}, {1}, {2}, {3}, …과 같은 위치 지정자를 사용하고 있습니다. 이와 같은 입력이 번거롭다면 다음과 같이 간단하게 사용할 수 있습니다.
Console.WriteLine("MyAge: {0}, MyWeight: {1}", age, weight);
다음과 같이 바꿉니다.
Console.WriteLine("MyAge: " + age + ", MyWeight: " + weight);
저는 두 번째가 순서대로 코드를 작성해 나가기 때문에 좋아합니다. 그러나 위치를 지정하거나 출력을 정렬하거나 금액을 표시하는 것과 같이 세 번째 숫자마다 ","를 찍어야하는 경우에는 별수 없이 첫번째 방법을 사용합니다. 마찬가지로 이런 것들은 프로그래머의 취향이고, 첫번째와 같이 형식을 지정해서 사용하는 경우는 그렇게 많지 않습니다.(음, 회계 프로그램을 작성하는 사람들은 제게 불평을 하겠지만…)
이런 내용들은 모두 잊어버리세요. 책에 설명되어 있습니다. 거기에 포스트잇 하나 붙여놓고, 금박으로 표시하세요. 그러면 "그 부분에 변수에 대한 설명이 있다"는 것을 잊어버리지는 않을 겁니다. 사실, 저도 C#에 어떤 데이터 형식이 있는지 모릅니다. 책을 봐도 나오고, MSDN을 봐도 나옵니다. 사실대로 고백하자면 VS.NET에서 코드를 입력할 때 이러한 데이터 형식에 사용하는 키워드는 파란색으로 표시해줍니다. 그래서 저는 그게 맞다는 것을 알 수 있습니다. 사실 BOOL, bool, Boolean 중에 어떤 것이 있는지 일일이 기억하지는 못합니다. 사실 매우 혼동되는 부분중에 하나지요. ^^;
불리언(boolean)이란?
C#에서는 불리언 형식에 대해서 bool 이라는 키워드를 사용합니다. 그리고 이 값들은 true 또는 false라는 값만을 가집니다. 다른 값을 가질 수 없습니다. 문자는 물론이고 숫자도 기억할 수 없기 때문입니다. 단순히 그것이 옳은지, 그른지만 알 수 있습니다.
"나의 아내는 미인이다(이쁘다)"
라는 명제에 대해서 이분법적으로 true 또는 false를 가려낼 수 있다면 참 좋은 세상일텐데요…
하여 간에 세상사라는 것이 위 문장처럼 진실(?)을 가릴 수 없는(?) 경우가 많지만, 컴퓨터의 세상에서는 0과 1의 세계, 즉 진실과 거짓만이 존재하는 세계이므로 불리언 형식을 종종 사용하게 됩니다. bool의 사용 방법은 책에 모두 나와 있습니다. 제가 그런 것들을 설명하지는 않겠지요. ^^;
데이터 형식 요약
이제 데이터 형식에 대해서 대충 설명을 끝냈으니 정리를 해보죠. (어? 지금 템포가 빠른가요?) 책에는 많은 데이터 형식이 소개되어 있지만, 그 중에 자주 사용하는 것은 int, float, double, long, bool, string 정도가 있습니다.
나중에 byte와 같은 조금 특별한 녀석들에 대해서도 설명할 시간이 있겠지만, 자주 쓰이는 것은 아닙니다. 네트워크나 디스크 파일을 다루는 프로그래머들은 절 비난하겠군요. byte는 조금 특별한 형식입니다. 네트워크나 디스크의 파일에 데이터를 저장할 때 주로 사용합니다. string과 같은 형식을 사용하지 않는 이유는 네트워크상에 전달될 때는 데이터가 중간에 손실되거나 하는 경우를 대비하여 내용이 깨지는 것을 막기위해서 입니다... 한글은 보통 2 바이트 문자로 구성됩니다. 그런데 중간에 1 바이트가 깨져버리면 다른 코드와 결합되어 깨진 한글이 나오기 쉽지요. 그 외에도 여러 가지 이유가 있지만 네트워크 프로그래밍에 제공되는 클래스의 메소드들은 byte 형식을 사용해야 하는 경우가 많습니다.
일상적으로 쓰는 데이터 형식이라는 것은 자신이 주로 프로그래밍하는 분야가 무엇이냐에 따라 달라집니다. 그러니 걱정할 필요는 없습니다. 위에 것이 너무 많다면, int, bool, string 정도만 알고 있어도 됩니다. 나머지는 필요할 때마다 책을 펴보면 됩니다.
연산
프로그램의 3 가지 중에 이제 한 가지, 배정에 대해서 살펴봤습니다. 그렇다면 이번에는 연산에 대해서 살펴보죠.
연산은 간단히 말하면 수학입니다. 사실, 컴퓨터 세상에서는 수학도 필요 없습니다. 그러니 고등학교 때의 악몽을 떠올릴 필요는 없겠죠.
가장 간단한 연산에는 +가 있습니다.
또 뭐가 있죠?
네… -가 있습니다.
또 뭐가 있죠?
*이 있고, /이 있습니다.
마찬가지로 C#에서도 +, -, *, /을 모두 연산자로 사용합니다. 이외에 나눗셈에서 나머지만을 돌려주는 %(모듈러스라고 읽죠), 논리 연산을 위한 ||, && 등도 있습니다. 하지만 이런 것들을 모두 사용하지는 않습니다. 사실, 대부분의 경우에 +만 사용합니다. 그리고 아주 가끔 ?와 *을 사용하죠.
그러면 값을 비교하는 데는 무엇을 쓰죠?
네… 부등호를 사용합니다. 둘이 같은지 비교하는 =을 사용하고, <=, >=과 같은 기호들도 사용했었고, <과 >도 사용했습니다.
C#에서는 "="대신 "=="을 사용한다는 것을 제외하면 <=, >=, <, >를 사용합니다. 여기에서 주의해야 할 사항은 "=" 대신에 "=="를 사용한다는 겁니다. 그리고 C 언어와 달리 "=="를 쓸 곳에 "="를 쓰면 컴파일이 안됩니다.(똑똑해 진건지, 원리원칙을 강조하는 건지는 아무도 모릅니다)
이야~ 『C# 프로그래밍』책을 보면 연산자 우선 순위가 나오는군요. 이런 것을 다 기억할 필요는 없습니다. 생각해 보니, 저는 My Dear Aunt Sally 라고 외웠던 기억도 있긴 하군요. "헐… 이제 수학도 부족해서 영어까지?"라고 생각하는 분들이 있군요. -_- 이것들은 모두 곱셈(Multiplation), 나눗셈(Devision), 덧셈(addition), 뺄셈(subtraction)을 순서대로 첫 글자만 따서 외우는 거지요. 흠, Sally 아줌마는 꽤 무서워서 벌써 10년도 더 기억하고 있긴 하네요. 여러분은 부디 잊어버리세요.
그리고 이러한 연산자 우선 순위를 제어하기 위해 ()를 사용합니다. 수학 시간에 사용하는 ()와 의미가 같습니다.
네, 대충 이정도면 된 것 같군요. 잠깐, 여담이지만 OSI 7 계층이라고 들어보셨나요? 네, 무슨 자격증 시험에도 나오고 하는 것 같은데, 다음과 같은 문구로 외우면 좋답니다.
All People Seem To Needs Data Processing
(모든 사람들은 데이터 처리를 필요로 하는 것 같다)
각각, Application, Presentation, Session, Transfer, Network, Data Link, Physical의 앞글자를 딴 것입니다. 하지만 정말 외울 필요는 없습니다. -_- (정말, Sally 아줌마가 무섭습니다. Sally 아줌마 덕분에 다 외우게 되었으니까요. -_-)
연산 II
그렇다면 실제 코드에서 연산을 어떻게 사용하는지 살펴보죠.
int a;
int b;
a = 5;
b = 2;
int result;
result = a + b;
Console.WriteLine("result: " + result.ToString() );
이와 같이 사용하면 됩니다. 간단하게 덧셈이 됩니다. 우리가 평소에 알고 있는 덧셈하고 같습니다. 여기 더하기 못하는 분?? 다 아시죠? ^^; 그러면 뺄셈은 어떻게 하죠? 네, + 지우고 ?만 넣으면 되죠.
result = a ? b;
곱셈은요?
result = a * b;
나눗셈은 어떻게 하죠?
result = a / b;
나눗셈이 되나요? 안되죠? a는 5이고, b는 2니까 결과는 2.5가 됩니다. 실수가 나오는데 result는 정수만 저장할 수 있는 int 형이니 안됩니다. 오류가 발생하죠. 이런 경우에 강제로 int 형식으로 맞추게 하려면 다음과 같이 쓰죠.
result = (int) a / b;
이렇게 하면 2가 저장됩니다. 마찬가지로 2.5를 저장하고 싶다면 (int) 대신에 (float)와 같이 쓰면 됩니다. 물론 result도 int result;가 아니라 float result;로 선언을 바꾸어야 겠죠. 이처럼 형식을 강제로 지정하는 것을 형식 변환 또는 타입 캐스팅(type casting)이라고 합니다.
여러분 중에 result = (int) a / b; 라는 코드를 다음과 같이 작성한 분들이 있을 겁니다.
result=(int)a/b;
위의 것과 비교해보세요. 이처럼 다닥다닥 붙여두면 스페이스바 몇 번 덜 누르는 수고는 줄일 수 있지만, 뭔가 암호처럼 보이지 않나요? 쉽게 이해가 되나요? 전 이해가 안됩니다. 그러니 좀 번거로워도 코드를 아름답게 꾸며주기 바랍니다. 아름답게 꾸미는 것은 수고가 들지만, 아름답게 꾸민 만큼 코드를 직관적으로 쉽게 이해할 수 있고, 프로그래밍도 쉽게 느껴집니다. 저렇게 다닥다닥 붙여서 암호와 같은 문장들을 만들어 버리면 단 5줄도 읽기가 어려워집니다. 심지어 저러한 암호 같은 코드로 작성한 프로그램 단 4줄을 분석하는데 6시간이 걸렸던 기억이 있습니다. 그만큼 코드를 읽기 쉽게 작성하는 것은 중요합니다.
루프(loop, 반복)
루프는 어떤 일을 반복하는 것을 말합니다. 계속해서 반복해서 수행하는 것이지요. 이미 책을 읽어보셨을 테고, 루프가 있다는 것도 아실겁니다. 메모리에 데이터를 배정하고, 데이터를 CPU로 읽어들여서 연산을 하고, 이 과정을 반복하는 데 필요한 것이 루프입니다. 루프를 위한 키워드에는 for, while, do while, foreach 등이 있습니다. 먼저 for 루프는 다음과 같은 형태를 사용하지요.
for ( int loopctr = 0; loopctr < 5; loopctr++ )
{
Console.WriteLine( loopctr.ToString() );
}
이미 책을 읽어보셨으면 잘 아시겠지만 loopctr이 0에서 5가 될 때까지 반복합니다. loopctr이 5일 때는 조건(loopctr < 5)을 만족하지 않으므로 문장을 실행하지 않고 빠져나가겠지요.
조금 다른 이야기지만 저는 여러분이 int i = 0과 같이 쓰는 것을 원하지 않습니다. i라는 것은 너무나 흔하게 쓰이고, 의미가 명확하지 않습니다. 이것은 여러분이 작성하는 프로그램을 더 어렵게 만들 겁니다. I, j, k, l, ii, jj, kk 등을 써서 작성된 프로그램을 가장 싫어합니다. 제가 괴팍한가요? 하하… 아마 여러분도 저런 것들을 싫어하시게 될 겁니다. 코드는 최대한 명확하게 작성해야 합니다. 프로그래머 스스로 어떠한 가정을 전제로 코딩해서는 안됩니다.
이러한 가정은 여러분만이 알 수 있습니다. 다른 프로그래머는 절대 알 수 없죠. 신도 아니고, 천리안도 아니고, 과거를 들여다볼 수 있는 마법 구슬도 갖고 있지 않습니다. 그러니 이러한 가정은 없애야 합니다. 초보 프로그래머인 여러분들은 분명히 어떤 가정을 갖고 프로그램을 작성하게 됩니다. 또 여러분은 그것을 깨닫지 못하죠. 하지만 여러분이 작성한 프로그램을 보면서 저는 그러한 가정들을 지적해 줄 겁니다(사실은 여러분이 작성한 프로그램이 너무 어려워서 제가 이해하지 못하기 때문에 시샘하는 겁니다. ^^/).
자, 다시 계속해서 루프 이야기를 해볼까요. for 루프는 보통 저러한 구조를 사용하고, 항상 카운터라는 변수를 사용합니다. 반면 while 이라는 것은 어떤 논리식에 따라서 루프를 반복할 때 사용합니다. while의 형식은 다음과 같습니다.
int loopctr = 0;
while ( loopctr < 5 )
{
Console.WriteLine( loopctr.ToString() );
loopctr++;
}
어떤가요? 앞의 for와 동일한 동작을 하지요? while에서는 조건을 바꾸는 부분이 while 루프 안에 있다는 사실에 주의해야 합니다. 만약 while 안에 loopctr++이 없다면 무한히 반복되는 무한 루프가 될 가능성이 있습니다. 사실 이게 while이 가지는 "악마의 달콤한 유혹"입니다. (예나 지금이나 미인은 악마 중에 훨씬 더 많습니다.)
for나 while 중에 어떤 것을 사용하는 가는 여러분의 자유입니다. 저는 for와 while을 모두 골고루 사용합니다. for로 작성한 루프는 얼마든지 while로 변환할 수 있습니다. 하지만 while로 작성한 루프는 100% for 루프로 변환할 수는 없지요. ^^;
for는 단순히 카운터에 기반해서 루프를 반복하기 때문에 정해진 횟수를 반복하고자 할 때 사용하면 좋습니다. while은 논리식에 기반한 루프입니다. 사실, while( loopctr < 5 )라는 것은 "loopctr이 5보다 작다"라는 이유로 실행되는 것이 아니라 "loopctr이 5보다 작다"라는 명제가 참(true)이기 때문에 루프가 반복되는 것입니다. 따라서 다음과 같은 방식이 가능합니다.
bool MyWifeIsTheBeauty = false;
char answer;
while ( MyWifeIsTheBeauty )
{
answer = Console.Read();
if ( answer == "y")
{
MyWifeIsTheBeauty = true;
}
else if ( answer == "n")
{
MyWifeIsTheBeauty = false;
}
}
이와 같이 특정 조건이 true인 동안에만 실행되게 할 수도 있고 특정 조건이 false인 동안에만 실행되게 할 수도 있습니다. 위는 특정 조건이 true인 동안 실행되게 하는 것이고 특정 조건이 false인 동안 실행되게 하려면 다음과 같이 쓸 수 있겠죠.
while ( !MyWifeIsTheBeauty )
실제로 이러한 형식의 while 문도 많이 쓰입니다. 한 번은 그 사용법을 고민해보세요. 이와 같이 특정 조건을 만족할 때 까지 실행하고 싶은 경우, 즉 몇 번을 실행할지는 모르지만 논리식에 따라서 반복 수행하고 싶은 경우에 while을 사용합니다. while의 또 다른 형태로는 do … while이 있습니다. 이것은 보통 다음과 같은 구조를 사용하지요.
do
{
// some codes here
} while ( loopctr < 5 );
이것은 반드시 한 번은 실행된다는 특징이 있습니다. do 블록 안에 있는 코드들이 실행된 다음에 조건을 검사합니다. 이와 같이 나중에 검사하는 것들에 대해 "사후검사"라는 말을 씁니다. 즉, 앞의 while은 "사전 검사"이고 지금 소개하는 do … while은 "사후 검사"라는 것이지요. 이러한 코드는 메뉴판을 보여주는 것과 같이 반드시 한 번은 실행되어야 하는 경우에 사용합니다. 실제로 do … while은 while로 표현할 수 있지만, do … while을 쓰는 것이 훨씬 더 간결하기 때문에 이쪽을 선호합니다.
아직도 while을 왜 사용하는지 모른다면 이런 경우를 생각해 보죠. 자판기에 1000원을 넣고 음료수를 1개 뽑을지, 자판기에 5000원을 넣고 음료수를 50개를 뽑을지는 아무도 모릅니다. 그저, 더 이상 음료수를 뽑을 만큼의 돈이 없을 때 까지 반복해서 음료수를 뽑아야 합니다. 이와 같이 "금액이 부족하다"라는 조건을 만족할 때 까지 반복해야 하는 것이 자판기입니다. 이런 경우에는 카운터에 기반해서 정확히 "몇 번을 반복해!"라고 얘기하는 for는 사용하기에 적절하지 않습니다. 그래서 이런 경우에 while을 사용하는 겁니다.
do while은 실제로 전체 루프 중에 고작 5% 정도만 사용됩니다. 아마 여러분도 거의 사용하지 않을 겁니다. 그러니 지금 당장 잊어버리세요. 외울 필요도 없습니다. 단지, 이런게 있었다라고 기억만 하고, 책에 포스트-잇 하나만 붙여두세요.
네, 제 강의에는 책과 포스트-잇만 있으면 됩니다. 그리고 기억력 좋은 머리도 필요 없습니다. 내용을, 개념을 이해할 수 있는 머리만 있으면 됩니다. 나머지는 손과 눈과 머리를 사용해서 예제를 입력해보고 시행착오를 겪어보는 것이지요. ^^/
프로그래밍 언어 별거 아니군!
네, 프로그래밍 언어라는 것은 크게 이 세 가지로 구성되어 있습니다. 지금 설명한 이것들이 프로그래밍 언어를 학습하는데 필요한 모든 것입니다.
여러분에게 정작 필요한 것은 프로그래밍 언어의 문법이 아닙니다. 문법도 중요하지만, 해당 언어가 제공하는 방대한 라이브러리에 대한 이해가 필요하고, 그러한 라이브러리에 익숙해져야 합니다.
예를 들어, 네트워크 프로그래밍을 하고 싶다면 네트워크가 어떻게 구성되어 있는지도 알아야 하고, 닷넷에서는 네트워크를 위해 어떤 것들을 제공하는지, 그 기능부터 먼저 학습해야 합니다. 마찬가지로 파일 처리에 대해서 알고 싶다면 파일의 종류에는 텍스트 파일이 있고, 이진 파일이 있고, 버퍼링해서 처리하는 파일도 있고, 메모리를 파일처럼 사용하는 방법들이 있습니다. 즉, 지금까지 당연하게 생각했던 파일이라는 것도 이와 같이 나눠야 하고, 여러 가지에 대해서 알아야 하고, 닷넷에서 제공하는 클래스들의 사용법도 익혀야 합니다. 그렇기 때문에 프로그래밍이 어렵게 느껴지는 것입니다. 하지만 이러한 것들은 꾸준히 계속 반복해서 사용하다보면 익숙해집니다. 중학교 때 처음 배우던 x 라는 개념을 위해서 수업 시간 내내 설명하고 x - 5 = 2라는 것을 설명하기도 합니다. 그때까지 5 - 2 = 3이라는 세상에 살았었는데 말이죠. ^^;
하지만, 중학교 때 이후로 계속 써오던 x 라는 개념을 특별하다고 생각하지 않게 되지요. 심지어 x도 나오고 y도 나오는 데 말이지요. 마찬가지로 방정식도 처음에는 특별하게 여겨지지만 나중에는 당연하게 생각되죠. 프로그래밍도 마찬가지입니다.
꾸준히 하면 됩니다. 백문이 불여일타라고 하죠. ^^;
다음 시간에는 객체 지향에 대한 이야기를 비롯하여 해나갈 이야기가 많습니다. 하지만 꾸준히 해 나가면 그 높던 산도 올라갈 수 있을 겁니다. 오늘은 1장부터 3장까지 학습을 하셨습니다. 다음에는 4장부터 6장까지 읽어오고, 예제를 해보시기 바랍니다. 3장까지 예제 모두 해보신 분?? 흐음, 분발해야겠군요.
실제로 해보니 4장부터 6장까지 였지만, 4장의 클래스에 대한 설명이 교육 대상자나 C 언어만 알고 있는 사람들에게는 생소하여 시간이 많이 걸리고, 실제로도 4장이나 5장까지 읽어본 사람들이 대부분이었습니다. 따라서 이 글을 읽는 여러분은 다음 시간까지 4장이나 5장까지 읽어보고, 내용을 이해하고, 예제를 해보시기 바랍니다. 이해가 안되면 안되는 데로 내버려 두십시오. 여러분이 이해하지 못하는 것들을 이해시켜 드리는 것이 제가 할 일 입니다.