1. C#에 대한 소개
1. 프로그래밍 언어란 무엇인가
사람마다 본인이 쓰는 언어가 있다. 한국인들은 거의 대부분 한국어를 쓸 것이고, 일본인들은 거의 대부분 일본어를 쓸 것이다. 각자 다른 언어를 쓰기는 하지만, 사람들이 이와 같이 언어를 쓰는 가장 주된 이유는 ‘소통’을 하기 위해서일 것이다. 하지만 한국인이 일본인에게 일본어로 말을 걸기 어렵고, 일본인이 한국인에게 한국어로 말을 걸기 어렵듯이 언어가 다른 사람들끼리 서로 소통하는 것은 만만치 않은 일이다. 이를 해결하기 위해서는 여러 가지 해결책을 쓸 수 있는데, 이 중에서 가장 단순한 해결책은 바로 서로의 언어를 배우는 것이다. 그러나 이 해결책은 가장 단순하면서 가장 어려운 해결책으로, 이를 실제로 해내기 위해서는 지나치게 많은 노력을 쏟아 부어야 할 것이다. 더 간단한 해결책으로는, 그냥 번역가를 사이에 두고 대화를 하는 것이 있겠다. 한국인이 한국어로 말하면, 번역가는 한국어를 일본어로 번역해서 일본인에게 전달하는 형식으로 대화를 이어가면, 화자가 말한 것에 대한 의미의 왜곡이 일어날 수는 있겠으나, 대화에 참여하는 당사자가 들여야 하는 노력은 훨씬 감소할 것이다.
인간과 컴퓨터 사이에서도 마찬가지의 일이 일어난다. 우리는 컴퓨터가 어떤 작업을 처리하도록 하기 위해 컴퓨터에게 ‘명령’을 내리는데, 이 또한 ‘소통’의 과정이라고 할 수 있을 것이다. 하지만 위의 한국인과 일본인의 예시처럼, 인간이 쓰는 언어와 컴퓨터가 쓰는 ‘언어’는 거리가 멀다. 인간이 쓰는 언어는 상당히 추상적인 개념으로 이루어진 것인 반면, 컴퓨터가 사용하는 언어는 0과 1의 비트로 구성되는, 매우 정량적이고 수학적인 기계어이기 때문이다. 그래서 인간은 컴퓨터의 언어를 배우거나, 아니면 ‘번역가’를 고용하거나 둘 중 하나의 선택을 해야 하는데, 과거에 컴퓨터가 개발되고 얼마 되지 않았을 때에는 전자의 방법을 선택했다. 그저 인간이 기계어로 컴퓨터와 대화를 시도한 것이다. 하지만 이는 지나치게 비효율적인 방법이었고, 인간은 전자와 후자의 방법 그 중간에 있는 제 3의 방안을 생각해서 채택하기로 결심한다. 그것은 인간이 그나마 이해하기 쉬운 제3의 언어를 만들고, 이 제3의 언어를 기계어로 번역해 주는 변역기까지 함께 만들어서 사용하자는 것이었다. 이때 제3의 언어를 프로그래밍 언어(Programming Language)라고 하며, 번역기를 대강 말해 컴파일러(Compiler)라고 부른다.
그림 1 프로그래밍 언어를 기계어로 바꾸는 과정
2. Low-Level과 High-Level 프로그래밍 언어
인간의 언어는 역사성이라는 특성을 가지고 있는데, 그것은 바로 시간이 지나면서 언어는 변화한다는 것이다. 프로그래밍 언어도 마찬가지로 시간이 지나면서 변화하고 발전하게 된다. 프로그래밍 언어는 Low-Level에서 차근차근 High-Level을 향해 발전하게 되는데, Low-Level일수록 컴퓨터가 사용하는 기계어에 가까운 모습을 보이고, High-Level일수록 인간의 언어에 가까운 모습을 보이게 된다.
이런 Low-Level 언어 중 끝판왕이라고 부를 수 있는 것은 바로 어셈블리어이다. 기계어보다는 접근성이 높지만, 아무래도 쓰기에는 불편한 언어이다. 다음은 1 + 1을 계산하는 코드이다.
Data
var1 DWORD 1
var2 DWORD 1
.code
mov eax, var1
add eax, var2
상당히 어려운 언어라 아무래도 쓰기엔 불편했다. 그래서 존 배커스(John Backus)라는 사람은 IBM에 입사해서 사람의 언어에 가까운 최초의 프로그래밍 언어 포트란(Fortran)과 컴파일러를 개발했다. 포트란으로 위와 똑같이 1+1을 계산하면 다음과 같이 쓸 수 있다.
a = 1 + 1
다음과 같이 훨씬 간단하고, 직관적으로 쓸 수 있음을 확인할 수 있다.
포트란과 함께, 그리고 그 이후로 상대적으로 인간의 언어에 가까운 프로그래밍 언어들이 나오기 시작했다. 베이직 언어가 미국 다트머스 대학의 존 케머니와 토마스 커츠 교수에 의해 탄생했으며, 마이크로소프트의 창업주로도 널리 알려진 빌 게이츠와 폴 앨런이 개발한 베이직 인터프리터가 보급되면서 베이직 언어 또한 많은 사람들의 손에 쓰였다.
포트란이 개발된 거의 동시기에 MIT 공대와 벨 연구소, 그리고 GE는 멀틱스라는 운영체제의 개발을 시작했다. 이 개발은 실패로 돌아갔으나, 이는 벨 연구소 소속이었던 데니스 리치와 켄 톰슨에게 소중한 경험이 되었고, 이 경험을 살려 그들은 벨 연구소에서 유닉스를 개발하였다. 그러나 새 컴퓨터로 유닉스 버전을 개발하는 데에 켄 톰슨이 만든 B언어는 역부족이었다. 그래서 데니스 리치는 현재 가장 널리 쓰이는 프로그래밍 언어 중 하나인 C언어를 개발하였다.
1979년, 벨 연구소의 비야네 스트로스트럽 교수는 객체 지향 프로그래밍이 가능한 언어 C++를 개발한다. 이 언어는 C언어와의 호환성이 높아 많은 프로그램 개발자의 선택을 받을 수 있었다. 그리고 나중에, 이에서 한 발짝 더 나아간 언어 C#이 마이크로소프트 사 소속 앤더스 해일스버그에 의해 만들어졌다. 그리고 1990년대 말, 마이크로소프트가 .NET 비전을 발표하면서 C#의 기기 호환성을 높였다. 이 비전은 사업적으로는 실패하였으나, 마이크로소프트 사의 어마어마한 지원으로 C#을 선택하는 개발자가 점점 증가하면서 성과를 어느 정도 보이고 있다.
이렇게 프로그래밍 언어가 발전하면서, 그 모습이 점점 인간의 언어를 닮아가고 있다.
3. C#으로 프로그램 만들기
C#으로 프로그램을 개발할 때에는 주로 마이크로소프트 사에서 개발한 비주얼 스튜디오라는 툴을 이용하게 되는데, 이 툴로 아래와 같이 작성하고 컴파일해보자.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace HelloWorld
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Hello World!");
}
}
}
프로젝트 명을 HelloWorld로 하고, 다음과 같이 작성한 뒤 컴파일하면 다음과 같은 결과창이 뜨게 된다.
그림 2 콘솔 결과 창
위의 코드를 뜯어보면 여러 가지를 찾아볼 수 있는데, 이에 대해 알아보도록 하자.
처음에는 using System; 등등의 using이 앞에 붙은 문구가 있음을 알 수 있다. 이것은 우리가 코드에서 사용할 ‘요소’들을 불러오는 창고들의 역할을 하는데, 정확히 말하면 System이라는 네임스페이스 안에 있는 클래스를 사용하겠다는 뜻을 가진다.
다음에는 방금 전에 등장한 ‘네임스페이스’라는 단어가 등장한다. 비유적으로 설명하면 이것은 비슷한 종류의 물건을 담는 창고들을 하나로 묶어 이야기하는 것이라고 말할 수 있다. ‘당근’이라는 것을 찾고 싶으면, ‘청과물’이라는 이름을 가진 네임스페이스를 향해 가야 하는 것이다. 여기서 네임스페이스의 이름은 아까 생성한 프로젝트의 이름과 같게 설정된다.
네임스페이스 안에는 ‘클래스’가 담긴다. 클래스는 C# 프로그램을 구성하는 기본 단위로, 데이터와 데이터를 처리하는 기능으로 이루어진다. 이 코드의 경우 Main()이라는 메소드가 데이터를 처리하는 기능을 하고 있다.
class Program에는 static void Main(string args[])라고 적힌 부분이 포함돼 있다. 앞의 static은 한정자로서, Main과 같은 메소드나 변수 등을 수식하는 역할을 한다. static으로 수식되는 코드는 프로그램이 처음 구동될 때부터 메모리에 할당되게 된다.
void는 이 메소드가 반환하는 값이 어떤 형식을 지니는지에 대해 말해주며, 여기서는 아무것도 반환하지 않을 거라는 의미를 담고 있다. 괄호 안의 string[] args는 매개 변수라고 부르는데, 이는 후에 서술하도록 한다.
또, 메소드의 이름이 Main인 경우, 프로그램은 가장 먼저 이 메소드에 대해 실행을 하게 되며, 이 메소드가 종료되면 프로그램 또한 종료되도록 설정되어 있다.
Main 안에는 그 메소드의 내용이 있는데, 이 코드의 경우 Console.WriteLine이 적혀 있다. 이것은 괄호 안의 문자열을 콘솔 창에 출력하는 함수이다.