메뉴 바로가기 검색 및 카테고리 바로가기 본문 바로가기

한빛출판네트워크

IT/모바일

C#과 프로그래밍 언어

한빛미디어

|

2001-08-28

|

by HANBIT

11,903

천천히 한 2년 동안 C#만 써볼까하는 생각도 든다. -_-+(워낙 게을러서 말이죠... ) 다시 쓰기로 시작한 느낌이군요. C#은 프로그래밍 언어다. MS에서 새롭게 만들어낸 언어이다. 프로그래밍 언어는 저급언어와 고급언어로 나뉩니다. 저급 언어는 말 그대로 수준이 상당히 낮은 언어입니다. 컴퓨터나 프로그래밍에 관심을 가졌던 분들이라면 어셈블리라는 용어를 들었을 것입니다. 이러한 언어들은 정말 하찮을 정도로 수준이 낮아서 프로그래머가 컴퓨터와 이야기를 하려면 손짓발짓을 해가면서 컴퓨터가 말하는 용어를 익혀야 합니다. 반면에 고급언어는 우리가 사용하는 언어와 비슷한 구문을 사용해서 컴퓨터와 대화할 수 있도록 해줍니다. 하드웨어나 CPU가 무엇인지 알지 못해도 됩니다. 정말 멋있게 들리나요? 하지만 고급 언어도 아직까지는 한계가 있어서 정말 우리가 말하는 것처럼 얘기할 수는 없습니다. 그래서 대화하기 위해 꼭 필요한 단어와 영어의 5형식과 비슷한 꼭 필요한 문법만을 가지고 컴퓨터와 대화할 수 있을 뿐입니다. 고급 언어로는 대표적으로 베이직(BASIC)이 있습니다. 하지만 베이직이외에 우리가 많이 들어본 대부분의 프로그래밍 언어들, 그러니까 자바, 스몰토크, COBOL, Python 등등은 대부분 고급언어에 속합니다. C언어나 C++는 저급언어와 고급언어의 중간 수준 정도의 언어입니다. 그래서 프로그래밍을 쉽게 할 수 있으면서도, 하드웨어의 세세한 것을 컨트롤할 수 있다는 장점 때문에 C/C++가 널리 사용되었고, 사랑받았었습니다. 이제 새롭게 시작하는 여행의 주제는 C#입니다. 씨-샵이라고 읽습니다. C#은 고급 언어입니다. 그래서 프로그래밍 하기가 쉽습니다. 정말? 뭐... 이제부터 두고 보도록 하지요. 순진하고 철없는 텍스트 파일이 어떻게 프로그램이 되는가? 어디서 많이 본 제목이죠? 예, 제가 C 언어를 쓸 때 썼던 제목 그대로입니다. 하지만 이것만큼 좋은 주제는 없는 것 같습니다. 하지만 C 언어와 C#은 완전히 다른 특징을 갖는 언어입니다. C 언어는 구조적 프로그래밍의 대표적인 언어이지만, C#은 객체 지향 언어랍니다. 객체 지향 언어가 무엇인지는 나중에 설명드릴께요. C# 개발 주기 개발 주기는 제 나름대로의 생각입니다. 꼭 정해진 방법은 아닙니다. 반드시 이렇게 해야 한다는 것은 아니지만 나름대로 이렇게 생각하는 것은 어떤가 싶습니다.
  1. 프로그램에 대한 아이디어를 구상한다.
  2. 프로그램에서 쓰일 클래스를 설계한다.
  3. 클래스를 이용해 소스 코드를 작성한다.
  4. C# 컴파일러를 사용하여 프로그램을 컴파일한다.
  5. 에러에 대해 애통의 눈물을 흘린다.(선택 사양)
  6. 프로그램을 실행하고 테스트한다.
  7. 버그에 대해 머리카락을 쥐어뜯는다.(선택 사양)
  8. 다시 시작한다.(필수 사양)
이것을 외울 필요는 없습니다.(외우면 바보~!) 하지만 대부분의 개발자들은 이러한 과정을 거치고 있습니다. 여기서 가장 어려운 것은 1단계와 2단계입니다. 나머지는 저절로 된답니다. 소스 코드 소스 코드는 디스크에 저장되어 있는 순수한 텍스트를 말합니다. 도스의 에디터나 메모장으로 바로 읽어볼 수 있습니다. 소스 코드 파일은 cs로 끝납니다. 파일 이름의 확장자가 cs라는 말이지요. 컴파일러 소스 코드를 작성하고 디스크에 저장한 다음에 이것을 컴퓨터가 읽어들일 수 있게 만들어주는 것이 컴파일러입니다. 컴파일러는 먼저 여러분이 작성한 소스코드의 문법을 검사합니다. 문법에 오류가 있으면 컴파일이 되지 않습니다. 문법의 오류가 아닌 프로그램의 논리상의 오류는 컴파일러가 알지 못합니다. C#은 컴퓨터가 이해할 수 있는 기계어로 컴파일되지 않습니다. 중간 언어(IL - Intermediate Language)라는 것으로 컴파일 되며, 실행시에 실시간으로 기계어로 번역되어 실행됩니다.
문법 오류? 논리 오류?(lexical error, logical error)
문법적인 오류는 프로그램을 작성시에 잘못 입력했거나 괄호가 빠졌거나 ";"을 미처 입력하지 않는 등의 오료를 말합니다. 이러한 오류는 컴파일시에 컴파일러가 감지해내고 사용자에게 친절하게 알려줍니다.반면에 논리 오류라는 것은 무한 루프, 실행 시간에 발생하게 되는 오류를 말합니다. 즉, 문법상으로는 아무 문제가 없지만 논리상으로는 오류가 있는 경우를 말합니다. 이런건 어떨까요? I don"t know English. ^_^
실행하기 C#으로 컴파일된 프로그램은 CLR(Common Language Runtime)환경에서 실행됩니다. CLR은 여러가지 구성 요소로 이루어져 있습니다. 여기서 C#으로 컴파일 된 언어는 VEE(Virtual Execution Engine)에서 실행하게 됩니다. Java의 VM(Virtual Machine, 가상 머신)과 비슷합니다. C#으로 컴파일된 프로그램이 실행되면, 먼저 중간 언어로 번역된 코드를 읽어들입니다. 그리고 코드가 보안상 문제가 없는지 보안 검사를 한 다음에 기계어로 실시간 번역되어 실행됩니다.
실시간 컴파일러(Just-In-Time Compiler)와 pre-JIT(사전 JIT)
중간 언어(IL code)로 번역된 코드를 실행시간에 실시간으로 기계어로 번역해주는 컴파일러를 JIT 컴파일러라고 합니다. 이와 같이 중간 언어로 변환한다음에 실행시간에 기계어로 번역하게 되므로, C#으로 작성한 프로그램은 CLR이 구현된 곳이면 다른 OS에서도 실행될 수 있다는 장점이 있습니다. 이글을 쓰는 시점에서는 CLR은 윈도우에서만 구현되어 있고, FreeBSD에서도 구현을 한다고 발표했습니다. 예, 이상적으로 Write Once, Run Anywhere를 주장했던 Java도 플랫폼에 따라 어느 정도의 커스터마이징이 필요했던 것처럼 C#로 그러지 않을까라는 생각을 하고 있습니다. 하지만 이런 성급한 결론을 내리기 전에 FreeBSD용 CLR이 나오는 것을 천천히 구경하는 것은 어떨까요? ^_^JIT는 실제로 컴파일된 프로그램을 실행시키는 것만큼 아주 빠르게 실행시켜 주지만, 매번 실행되며 자주 컴파일 되는 것들은 실시간으로 컴파일된 코드를 이미지로 저장하여, 다음에 다시 컴파일하지 않고 사용할 수 있습니다. C#에서 가장 많이 쓰이는 System.DLL과 같은 파일들이 이와 같이 사전 컴파일(pre-JIT)이 되어 있습니다. 이와 같은 것을 확인하려면 NT/2000 환경에서 "실행"을 클릭한 다음에 "start %windir%₩assembly"라고 하시면 여러가지 이미지들을 볼 수 있는데 그중에 pre-JIT라고 되어 있는 System.DLL을 볼 수 있습니다. 이와 같이 필요한 경우에는 사전 컴파일된 이미지를 저장하여 둘 수도 있습니다.
C# 프로그래밍을 위해서 준비해야할 것. C#으로 프로그램을 작성하기 위해서는 .NET Framework이 필요합니다. 이것은 MS 홈페이지에서 쉽게 다운받을 수 있습니다. http://www.microsoft.com/net 입니다. Java 프로그래밍을 하기 위해서 JDK(Java Development Kit)을 다운 받는 것과 마찬가지로 C# 프로그래밍을 하기 위해서는 .NET Framework을 다운 받아서 설치합니다. 전통적인 첫 C# 프로그램 작성하기 고대 로마 시대 이후로 모든 프로그래밍 책에서 가장 먼저 만들게 되는 프로그램이 있습니다. 그 관습이란 바로 이것입니다.

이름 : Hello.cs

class Hello
{
  public static void Main(string [] args)
  {
    System.Console.WriteLine("Hello, cruel world!");
  }
}
이런! 제기랄! 뒤로 물러나서 눈을 깜빡거려 보세요. 하지만 앞으로도 이런식으로 프로그램은 제시될 것입니다. 그러니 여러분은 이것에 익숙해져야겠지요. 이것을 보면 즉시 무슨 뜻인지 이해할 수 있어야합니다. 뭔가 익숙한 것 같지 않나요? 넹~ A부터 Z까지인데 대부분이 소문자로 되어 있고, 가끔 대문자가 섞여 있습니다. 그리고... 또... 괄호나 { 또는 }와 같이 키보드에서 본적있는 것들이 있습니다. args와 같은 것들을 제외하고는 여러분들이 본적이 있는 것들입니다. 저장, 컴파일, 링크, 실행! C#으로 작성된 소스 코드를 컴파일하려면 보통 이 4단계를 거쳐야합니다. 대부분의 경우에 링크는 컴파일러가 알아서 해주기 때문에 우리는 저장, 컴파일, 실행, 이 세가지만을 하게 됩니다. 특별한 경우에는 직접 링크를 하기도 합니다. 소스 코드를 모두 작성했으면 저장하고, 컴파일하고, 실행해보세요.

삽질이 요구되는 고뇌들 원래 제목은 "편집과 재컴파일에 요구되는 고뇌들"입니다. 하지만 이상하게 다들 이것을 "삽질"이라고 하는군요. 예... 강좌에 쓰기에는 어쩌면 적당하지 않은 용어인지도 모릅니다. 하지만! 이것도 그런대로 좋은 것 같습니다. 처음부터 제대로 된 C# 프로그램을 만들수는 없습니다. 자칫하면 WriteLine이 아니라 WirteLine이나 WriteLnie이라고 할 수도 있으니까요. 이런 경우에 컴파일러는 에러를 뱉어내고 프로그램은 만들어지지 않습니다. 망가진 프로그램을 고치려면 대개 다음과 같은 두 단계를 밟아야합니다.
  1. 소스 코드를 재편집하고 수정된 파일을 저장합니다.
  2. 소스 코드를 재컴파일하여 수정된 최종 프로그램 파일을 만듭니다.
이들 역시 프로그램 개발 주기에 들어갑니다. 여러분은 이러한 경우를 되도록이면 피하고 싶겠지만, 실제로는 이런 경우가 빈번하게 일어납니다. 이제 자신이 생겼으면 다른 프로그램으로 만듭니다. 위 프로그램의 다른 부분은 건드리지 말고, Hello, cruel world 부분만 다른 단어로 바꿔서 디스크에 저장합니다. 다시 컴파일하고 실행해봅니다. 저는 이 부분을 "안녕, 내 사랑 운령!"이라고 바꿨습니다. 여러분도 이렇게 바꿔주시겠어요?(웃음) 에러의 고통 에러는 있을 수 있는 일입니다. 아니, 늘 있는 일이라는 게 정확하지요. 리처드 스톨만, 빌 게이츠, 리누스와 같은 사람들도? 그들 역시 어마어마한 에러를 만들어낸다는 사실을 알고 있다면 웃음이 나올 걸요. 그러니까 에러가 나온다 해도 전혀 당황할 필요가 없습니다. 요즘 나오는 컴파일러는 옛날의 컴파일러보다 상당히 똑똑해서 오류가 어디서 발생하는지 상당히 정확하게 알려줍니다. 그러니까 몇 년 전에 웹 프로그래밍을 했을 때인데, 그 때는 프로그램에 에러가 있으면 "Internal Server Error(내부 서버 오류)"라는 한 마디만 툭 내뱉었거든요. 아주 무엄하기 짝이 없었지요. 그런데 요즘은 "Line 240, Column 40에서 틀렸어요"라고 나와요. 옛날에는 에러가 있으면 프로그램을 처음부터 다시 보면서 틀린곳을 찾기 위해서 몇 시간을 소비해야했는데, 요즘은 즉시즉시 에러를 찾아서 고칠 수가 있답니다. 그래서 꽤 똑똑해졌다고 생각합니다. 헉! 에러! 하지만 자살하기 전에...... 여기 새로운 프로그램 Error.cs가 있습니다. 이것은 고의적으로 에러를 갖고 있는 프로그램입니다.

이름 : Error.cs

class Error
{
  Public static void Main(string [] args)
  {
    System.Console.WriteLine("I have an error!!")
  }
}
이제 여러분이 할 일은 이것을 편집기에서 입력하고, 저장한 다음에 컴파일하는 겁니다. 불행히도 이 프로그램은 에러가 발생합니다. 에러 처리하기 C# 컴파일러로 컴파일하면 다음과 같은 에러 메시지를 만날 수 있습니다.
E:₩works>csc Error.cs
Microsoft(R) Visual C# Compiler Version 7.00.9254 [CLR version v1.0.2914]
Copyright (c) Microsoft Corp 2000-2001. All rights reserved.

Error.cs(3,10): error CS1585: "static" 멤버 한정자는 멤버 형식과 이름 앞에 와야 합니다.
잠시 뒤로 물러나서 에러 메시지를 힘껏 째려보세요. 그래도 말을 안 들으면 때려보세요.(웃음) Error.cs(3, 10)이라고 되어 있는 부분을 보세요. 에러는 Error.cs 소스 코드의 3번째 줄, 10번째 칸에서 발생했다는 것을 알려줍니다. Error CS1585는 일반적으로 정해져있는 에러 번호입니다. 이 에러번호에 대한 보다 자세한 설명은 MSDN Library에서 찾아볼 수가 있습니다. 하지만, 우리는 그렇게 전문적인 설명까지는 필요하지 않습니다. 소스 코드로 가서 컴파일러가 알려진 곳을 확인합니다. 3번째 줄, 10번째 칸이면 Public class의 c를 가리킵니다. 예, 사실은 컴파일러가 그렇게 똑똑하지는 못하네요. 우리가 틀린 부분은 Public입니다. 이 부분은 public과 같이 모두 소문자로 작성해야 합니다. 컴파일러는 똑똑하지 못해서 에러가 발생하기 전에는 알아내지 못합니다. 그저, 에러가 발생한 다음에야 틀린 곳을 알려줄 수 있다는 것을 기억하세요. 이제 소스 코드를 저장하고 다시 컴파일을 해보세요.
E:₩works>csc Error.cs
Microsoft(R) Visual C# Compiler Version 7.00.9254 [CLR version v1.0.2914]
Copyright (c) Microsoft Corp 2000-2001. All rights reserved.

Error.cs(5,50): error CS1002: ;이 필요합니다.
이런 다시 에러가 발생하는군요. 하! 이런 기가막힌 일이... 하지만 이제는 어디가 잘못된 것인지 무엇이 필요한지 알 수 있습니다. 예, 우리는 문장의 끝에는 항상 ";"을 붙여야합니다. 그런데, 이게 없네요. 이 부분을 다음과 같이 고칩니다.
System.Console.WriteLine("I have an error!!");
이제 다시 컴파일을 해보세요. 잘 되는 것을 확인할 수 있죠? 예, C# 컴파일러는 아주 치명적인 에러가 발생했다고 판단하는 경우에는 소스 코드 전체를 검사하지 않습니다. 에러가 발생한 지점에서 검사를 멈추고, 에러를 뱉어냅니다. 그래서 우리가 아주 잘못한 경우라면, 위와 같이 소스 코드를 수정하고, 수정된 것을 저장하고, 다시 컴파일하는 과정을 반복하게 됩니다. 하... 정말 지겹지만 어쩔 수 없습니다. 언젠가 이런 경우가 빈번하게 일어나는 경우와 이러한 일이 일어나지 않기 위해서 해야할 것이 무엇인지에 대한 현직 개발자들과의 인터뷰를 하고 싶습니다. 그들의 노하우를 듣고 싶습니다. 아! 조만간 삽질의 대가이신 Shovel Co, ltd.의 창립자이신 해코님과 부당수이신 파팅님, 디카님에게서 좋은 인터뷰를 하지 않을까 싶습니다. 마치면서 이번에는 간단히 C#으로 프로그래밍을 하는 것에 대해서 알아보았으며, 저급 언어와 고급 언어에 대해서 알아보았다. 프로그래밍을 하는 것은 영어를 공부하는 것과 같은 아주 길고 긴 마라톤이라고 생각합니다. 그러니 처음부터 성급하게 너무 많을 걸 하려고는 하지 말자구요. 자~ 이제 커피 한 잔 마시면서 퀴즈를 풀어볼까요? ^_^ "옛! 마님~ 여기 매실차 있습니다. /(^_^)" 퀴즈
  1. C#은 뭐라고 읽는가?     a. 그냥 "씨~"라고 읽는다.     b. "씨와 샵"이라고 읽는다.     c. "씨 샵"이라고 읽는다.     d. 여자가 발음하고 나면 입모양이 모아져서 이쁘다!
  2. 에러를 처리하는 방법은?     a. 잘못한 게 없으므로 컴퓨터를 째려본다.     b. 살살 달랜다.     c. 비디오 게임을 하다가 화가 났을 때 처럼 한다.     d. 소스 코드 파일을 수정하고, 다시 컴파일한다.
  3. C# 프로그램을 작성할 때 가정 먼저하는 것은?     a. C#의 신에게 재물을 바친다.     b. 연구실을 확보한 다음 피자, 카페인 음료, 감자칩을 쌓아둔다.     c. 텍스트 파일을 만든다.     d. 아이디어를 구상하고 클래스를 설계한다.
  4. 다음 메시지를 내보내는 C# 프로그램을 작성해 보세요.     C#의 세계에 오신 것을 환영합니다.
TAG :
댓글 입력
자료실

최근 본 책0