일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 연속스펙트럼
- laue
- 라만 분석
- X선의 발견
- X선 공학
- 빛의 손실
- drude
- 재료과학
- 고체물리학
- 전기장이 가해진
- von laue
- X선
- 전자의 속도
- 흡광
- 륀트겐
- 바일 페르미온
- 바일 준금속
- Raman
- 웨일 페르미온??
- 3 o'clock things
- 라만 현상
- 특성스펙트럼
- 그루데 이론
- 결정구조학
- X선 기초
- 라만 분석기
- 에너지 역학
- 에디슨의 패배
- 화합물 반도체
- 일상
- Today
- Total
공머생의 공부노트
C# 프로그래밍, 그 시작과 기초 본문
프로그램에 관심이 있고 많이 활용하는 사람들은 C언어를 일상에서 많이 들어본적이 있을겁니다. C, C++, C#언어들은 서로 비슷한 줄기를 가지고 있고 실제로 활용하다 보면 많이 유사함을 느끼게 되는데, 특히 C언어는 컴퓨터의 첫 역사를 함께한 유서깊은 언어이기도 하며 현재 돌아가는 윈도우 기반 앱의 기반이 되는 유용한 언어입니다.
하지만 C언어를 다뤄본 사람도 (보통 C++ 까지) C#을 실제로 다뤄본 경험은 많지 않을 겁니다. 또한 C언어와 C++, C# 모두 훌륭한 언어이며 같은 기원을 가지고 있지만 세 언어가 추구하는 방향은 서로 상이하게 다르기에 어쩌면 한 언어를 쓰는 사람이 다른 언어를 접근하기는 쉽지 않을 수도 있습니다.
그럼에도 C#에 관심이 있는 사람이라면 이번 기회에 조금이라도 C#의 매력에 대해 알아보는 것을 추천합니다. 프로그램에 기초가 있는 분들이라면 조금은 상이한 구조의 벽만 넘어선다면 훨씬 더 많은 것들을 이룰 겁니다.
1. 컴퓨터는 어떻게 돌아갈까??
C#을 주로 구동하는 환경은 윈도우 기반의 시스템이 많습니다. 그렇기에 윈도우에서 돌아가는 경우를 앞으로 상정하고 생각하겠습니다.
가장 기본적인 접근부터 해보겠습니다. 우리가 사용하는 컴퓨터, 스마트폰 등의 종류는 천차만별이지만 생각을 해내는 방식은 놀랍도록 유사합니다. 아주 기본적인 원리까지 파고 들었을 때 하드웨어가 받아들일 수 있는 정보는 0 or 1 둘중 하나밖에 없죠
만일 우리가 프로그램 창에 적절한 명령어를 입력하고 이를 컴퓨터가 받았다고 하더라도 그 자체로는 컴퓨터가 할 수 있는 일이 없습니다.
컴퓨터는 그저 트렌지스터로 구성된 계산기이라고 생각해도 무방합니다. 컴퓨터가 가장 기본적인 unit에서 해내는 일은 0 or 1로 된 정보를 받아들이고 다시 0 or 1을 내뱉는 것 밖에 없으니까요.
그렇다면 여러분이 직접 0과 1을 사용하여 기계가 이해하는 언어로 기계에게 말을 걸어본다면 이해할까요?? 물론 가능합니다. 보통 프로그램이 이해하는 수준에서 0과 1을 집어 넣어서 프로그램 하는 방법도 있습니다. 오래된 마이크로 프로세서들은 프로그래밍 하기 위해서 어셈블리를 직접 00001101 00100111 같이 집어넣어 로딩하는 경우도 있습니다.
실제로 영화 마션에서 와트니가 로버의 시스템을 해킹하기 위해 NASA에서 보내준 2진수 숫자들을 직접 로버에 입력해 교신에 성공해내는 장면도 있습니다. 하지만 실제로 이런 기계어를 사용하는 것은 사실상 매우 많은 시간이 듭니다. (아마 마션에서도 와트니가 뒤에서 욕 많이 했을겁니다) 아주 예외의 상황을 제외하고는 (특히 컴퓨터를 사용할때는) 기계어를 사용할 일이 없을겁니다.
그렇기에 컴퓨터에서는 인간의 언어를 해석하여 자동으로 기계어를 생성해주는 구조들이 존재합니다. 그렇기에 우리는 C#의 간단한 문법을 가지고 기계에게 원하는 명령을 내릴수 있는 것이죠.
여러분이 C#의 문법으로 작성한 코드는 어셈블러에게 들어가 중간 언어(IL)로 해석됩니다. 이런 중간언어는 최종적으로 기계어를 해석해주는 Compiler에게 들어가 컴퓨터가 최종적으로 이해하는 실행파일(기계어)로 만들어져 CPU가 이를 처리하게 해줍니다. 조금 더 간단하게는 여러분의 말을 해석해주는 비서가 2명 있다고 생각하면 쉽습니다. 언어와 기본 구조마다 어셈블리, 컴파일러 대신 인터프리터(interpreter)등이 존재하기도 하지만 결국 기계어로 변환하는 것은 거의 같습니다.
2. C# 프로그램은 어떻게 돌아갈까??
C#의 아키텍쳐는 아까 설명한 기본적인 컴퓨터 공학보다는 조금 복잡합니다. 굳이 프로그램의 구조를 이해해야 하는지 의문이 드는 분들도 계시겠지만, 기본적인 구조를 아는 것은 해결하기 어려운 문제에 봉착했을때 예상못한 해결책을 가져다 줄 수 있습니다.
앞서 설명했던 어셈블리와 컴파일러를 통해 실행파일을 생성해 내는 것은 동일하지만 아래에는 Common Language Runtime과 .NET Framework라는 생소한 구조가 존재합니다. C#언어가 생성해낸 실행 파일 코드는 운영체제가 직접 구동시키지 못합니다. 이때 Common Language Runtime(일명 CLR)이 나서서 생성해낸 실행코드를 다시 한번 해석하고 운영체제와 하드웨어에 알맞는 네이티브 코드를 제출하여 구동하게 됩니다.
실행 파일에서 바로 코드가 수행되지 않고 중간 언어로 전사되는 이유는 편의성에 있습니다. .NET은 호환성으로 유명한 구조입니다. C, C++, C# 같이 윈도우스에서 설계한 기본적인 프로그램의 경우에는 모두 같은 중간 언어로 전사됩니다. 그렇기에 다른 언어로 작성된 코드도 바로 참조할 수 있고, 중간언어로 변역해주는 확장 프로그램이 있다면 파이썬이나 자바같은 언어도 마치 C#에서 작성된 코드마냥 참조가 가능합니다. 이러한 방식을 Just in time 방식이라고 합니다.
또한 C#은 CLR 코드를 활용함으로서 프로그램의 부하를 획기적으로 줄입니다. 후에 C#을 설명하며 자연스럽게 나오겠지만 C#은 프로그램이 돌아가며 쓸데없이 자리를 차지하는 프로퍼티나 변수들을 자동으로 비워버립니다. 앞으로 소개될 C#의 획기적인 기능들은 대부분 이러한 구조 덕분입니다.