글수 49
제가 오래전 부터 글을 쓰고 있고, 아직도 완성하지 못한 씨언어 강좌를 올리겠습니다.
아직 오자와 오류, 허점 투성이 이지만 그래도 많은 사람에게 공개하여 오점과 오류를 고쳐나간다면 좋은 강좌가 될 수 있을 것 같습니다...
틀린것을 발견한다면 바로 바료 지적해 주세요...그래서 다른 사람에게 함정을 빠지지 않게 도와주세요..
지금 까지 11과 까지 섰는데, 한 20~30 과 까지 나올 것 같내요...
===============================================================================
#00.초보가 쓰는 C 언어 강좌
(머리말)
머리말 :
보통 시중에 나와 있는 C 언어는 전문가 쓴 책이 많습니다. 전문가들의 책은 빈틈없고 잘 쓰여져 있습니다. 다만 처음 배우는 사람에 대한 배려가 부족하다고 느껴집니다.
내가 씨 언어를 배운지 얼마 되지 않았지만 이런 강좌를 쓰는 이유는 씨 언어를 처음 배울 때 느끼는 막막함을 아직도 기억하기 때문입니다. 어떤 학문을 배우다 스스로 깨닫는 경우가 있습니다. 그 때, 처음 가르치는 사람이 배울 때부터 내가 이해했던 방식으로 설명했다면 쉽게 이해할 수 있었다고 느껴집니다.
물론, 내가 얻었던 깨닫음만 가르친다고 해도 다른 사람이 쉽게 이해할 수 있다는 건 아닙니다. 사람마다 ' 아 이거다.' 하면서 깨닫게 되는 과정이 다르고, 그 전부터 알고 있는 배경지식이 다르기 때문입니다. 그렇더라도, 어느 정도 효과적으로 가르칠 수 있다고 믿습니다. 그런 면에서는 아직 초보인 내가 유리하다고 생각합니다. 전 , "아하" 하면서 느꼈던 감정들이 아직 남아있습니다.
처음 배우는 사람에게는 모든 것이 낯설 수밖에 없죠. 익숙해지기까지 어느 정도 인내심을 갖고 자세히 배워야 합니다. 프로그래밍 언어를 배운다는 것은 외국어를 배우는 것과 마찬가지이므로 충분한 시간을 투자해서, 많은 연습을 통해 열심히 배워가야 합니다.
여기에 있는 내용은 절대적인 것이 아닙니다. 제가 실수 할 수도 있고, 컴파일러마다 다르게 나타날 수도 있습니다. 여기 있는 게 꼭 맞다고 생각하지 말고 모두 다 의심하면서 공부하기 바랍니다. 이 강좌를 다 읽고 나서 다른 책이나 강좌를 보시기 바랍니다. 책 하나를 추천한다면 Teach Yourself C 라는 책입니다. 유명한 시리즈입니다. 출판사 2곳에서 번역되어 시중에 나와 있습니다. 번역서이므로 번역상태를 비교하면서 사시기 바랍니다.
00.01 프로그래밍이라?
프로그램을 짠다는 말이 무엇일까? 프로그램을 만든다는 말이죠. 그럼 프로그램은 뭔가요? 간단히 말한다면 컴퓨터를 동작하게 만드는 것이죠.
그러면 컴퓨터를 동작하게 하려면 어떻게 해야 할까요? 컴퓨터와 대화할 줄 알아야 하며, 효율적으로 일을 시켜야 합니다. 컴퓨터는 오직 0,1 밖에 모릅니다. 이런 컴퓨터와 대화하기 위해선 컴퓨터와 인간을 연결하기 위해서 여러 단계가 필요합니다. 우리는 씨 언어 하나만 알면 충분합니다. 나머지는 컴퓨터로 자동화 되어 있으니까요, 사람이 씨 언어를 쓰면 그 언어를 다시 기계가 알 수 있는 이진수로 바꾸어 줍니다. 이 과정 속에도 여러 단계가 있지만 이 정도 개념만으로도 충분할 것 같군요,
씨언어도 사람들이 쓰기 편리한 언어가 아니죠. 컴퓨터 언어도 계속 발전하고 있습니다. 언젠가는 인간이 쓰는 언어로 컴퓨터를 동작하는 일이 있겠죠. 그 때 까지는 불편하더라도 씨 언어를 사용해야 합니다. 물론, 그런 날이 와도 씨 언어가 사라지지는 않습니다. 지금도 기계어라 불리는 어셈블리어도 사용되는 것 보면 그 때도 씨는 계속 유용한 언어로 남아 있을 것입니다.
씨언어에서 기계가 알아먹을 수 있는 이진수로 바꾸어 주는 과정을 컴파일 한다고 합니다. 우리가 소스를 짜게 되면 이 프로그램을 컴파일 해야 합니다. 그러기 위해서는 컴파일러라고 불리는 프로그램이 필요합니다. 여러 가지 종류가 있습니다. 그 중 추천하는 것은 MS 사의 Visual C++ 입니다. 윈도우 환경에서 이 프로그램을 쓰신다면 이 프로그램을 추천합니다. 그런데 상용 버전입니다. 이 컴파일러를 구한다면 기본 씨 이외에 MFC라고 불리는 윈도우 프로그래밍도 할 수 있습니다.(물론 그 것도 배워야 프로그램을 만들 수 있겠죠.)
또, 추천하는 프로그램은 Dev_c++ 입니다.(GCC를 기반으로 돌아가는 컴파일러입니다. ) http://www.bloodshed.net/ 이 사이트에 가면 구할 수 있습니다. 다행히 공짜로 구할 수 있습니다. 그리고 윈도우 환경에서 프로그래밍 할 수 있습니다. 만약 리눅스를 쓰신다면 대부분 배포판에 기본적으로 깔려있는 GCC 컴파일러를 쓰시기 바랍니다. 이 프로그램은 컴파일만 하므로 따로 에디터가 필요합니다. Vi(또는 Vim ), 이맥스가 좋은 에디터입니다. 그것도 대부분 기본적으로 깔려 있습니다.
다른 컴파일러는 TC, Boland C가 있습니다. 또, 내가 모르는 많은 C 컴파일러가 있습니다. 미안하지만 강좌는 MS 사의 Visual C++ 6.0을 기준으로 하겠습니다. 될 수 있으면 Dev_c++에서도 실행 가능한지 확인하겠습니다. (Dev_c++ 에서 돌아 간다는 이야기는 gcc 에서 돌아 간다는 이야기겠죠. )
00.02 C 언어의 역사.
처음에 'CPL(Combined Programming Language) 이라는 언어가 있었고 그 언어에서 'BCPL(Basic CPL) 이라는 언어가 나왔다고 합니다. 그리고 그 언어에서 B언어가 나왔고 그 다음 C 언어가 만들어 졌다고 합니다.
C 언어는 1989에 ANSI(미국표준협회 American National Standards Institute) 라는 곳에서 표준이 만들어졌습니다. 그 것을 ANSI C라고 부릅니다.(또는 C89라고 부르기도 합니다.) 거의 그대로 다시 1990 년에 ISO (국제표준화기구, International Organization for Standardization) 표준이 되었습니다. 그 걸 ISO C 라고 부릅니다.(또는 C90이라고 부르기도 합니다.) 그래서 ANSI C 나 ISO C 거의 구별 안 합니다. 그리고 1995년 조금 확장되었습니다. 이 확장을 Amendment 1(AMD1)라고 부르고 C90과 AMD1을 합쳐 C95라고 부르기도 합니다. 1999년에도 더욱 개정되었는데 그걸 C99 라고 합니다. (Visual C++ 6.0 은 C95 까지 지원하는거 같군요.)
C언어는 여러가지 일에 사용합니다. 마이크로 프로세스라는 곳에서도 사용될 수 있고, 핸드폰 안의 프로그램에서 사용될 수 있습니다. 그래서 그 환경마다 C를 지원하는 환경이 다를 수 있습니다. 심하게는 ANSI C 표준도 지키지 못 할 수 있습니다. 그런 경우는 C 보다는 어셈이 어울리는 환경입니다. 그런 환경에서는 그 컴파일러의 메뉴얼을 찾아서 공부하는 방법 밖에 없겠죠. 이 건 아주 안 좋은 환경에 대한 이야기이고 보통 최소한 ANSI C 정도는 지원합니다.
00.03 컴퓨터의 기본적인 구조
프로그램을 만든기 위해서는 기본적인 컴퓨터 구조 정도는 알아 두어야 합니다. 컴퓨터 구조는 연산장치, 입출력장치, 저장장치로 나눌 수 있습니다.
연산장치는 CPU를 말하고 연산이라는 것은 쉽게 말해 여러가지 계산입니다. 우리가 알고 있는 사칙연산(덧셈, 뺄셈, 곱셈, 나눗셈)과 나머지 연산( 5 나누기 3 할 때 몫이 1이고 나머지가 2일 때 이 나머지 2를 찾는 연산입니다.), 숫자의 대소판별(크고 작음), 논리연산(나중에 배울 and, or, xor 등의 연산) 등의 연산이 있습니다. 이런 계산을 하는 부분이 연산장치 입니다.
입출력장치는 우리가 원하는 방향으로 컴퓨터를 조절할 수 있게 해 주는 키보드, 마우스 등의 입력장치와 결과를 보여주는 모니터, 프린터 등의 장치인 출력장치를 일컫는 말입니다.
저장장치는 계산과 관련된 데이터를 일시적으로 저장하는 메모리와 영구적으로 저장하는 하드디스크를 생각하면 됩니다.
이 정도는 이해하고 있어야 프로그래밍 하는데 편합니다.
다음 내용은 Hello, world 라는 유명한(?) 프로그램을 짜 보고 실제로 컴파일 하는 방법을 배우겠습니다. 컴파일러를 구하시기 바랍니다. 그리고 그 사용법도 익히시기 바랍니다. 대부분 인터넷에서 배우실 수 있습니다. Visual C++ 만 간단한 사용법을 가르쳐 드리겠습니다. 다른 컴파일러 사용자들은 사용법을 익히신 후 프로그램 소스가 돌아가나 확인하세요. 컴파일러 사용법외에는 소스는 크게 차이 나지 않습니다. 표준을 지키려고 노력하겠습니다.
덧글(덧붙이는 글) : 이 글을 쓰기 시작한 지 벌써 몇 년이 지났다. 그런데 내가 이 글을 완성하지 못한 상태에서 군대에 갔다 와 버렸다. 그래서 본이 아니가 다시 C 언어 초보가 되었다. 그 사이 시대는 변했다. Dev-CPP 는 더이상 버전업을 안해 주고 있고, Visaul Stdio 는 나날이 버전업이 되어버렸다. 그리고 C99 가 대세로 조금씩 자리잡고 있다. 그래서 Dev-Cpp 대신 이클립스 + CDT 를 이용해 C 프로그래밍을 하는 방법을 넣어야 하지 않을까 고민도 된다. 또 좀더 높은 버전 Visual Stdio 사용 법으로 고쳐야 하는지도 고민된다. 그러나 이 글 자체는 컴파일러와 대한 내용보다 C언어 자체에 대해 다루고 있다. 그리고 Visaul Stdio 6.0 에서 된다는 것은 그 보다 높은 버전에서 무리없이 컴파일 된다는 것을 증명해 준다고 생각한다.(물론 낮은 버전에서 된다고 높은 버전에서 되는 것은 아니지만 ANSI C 만 지켜준다면 가능하다고 생각한다.) 그래서 이 환경에서 프로그램 해도 기초적인 내용은 문제 없다고 생각합니다.
작성자 : 한밀(승룡)
버전 : 0.1.5
이 글은 계속 고쳐지고 있습니다.
2003년 4월 어느 봄날
최종 수정일 : 2007년 7월 하순, 날씨가 더워 잠을 못 자고 있는 어느 날
***** ljh131님에 의해서 게시물 복사 + 카테고리변경되었습니다 (2007-08-03 14:17)
아직 오자와 오류, 허점 투성이 이지만 그래도 많은 사람에게 공개하여 오점과 오류를 고쳐나간다면 좋은 강좌가 될 수 있을 것 같습니다...
틀린것을 발견한다면 바로 바료 지적해 주세요...그래서 다른 사람에게 함정을 빠지지 않게 도와주세요..
지금 까지 11과 까지 섰는데, 한 20~30 과 까지 나올 것 같내요...
===============================================================================
#00.초보가 쓰는 C 언어 강좌
(머리말)
머리말 :
보통 시중에 나와 있는 C 언어는 전문가 쓴 책이 많습니다. 전문가들의 책은 빈틈없고 잘 쓰여져 있습니다. 다만 처음 배우는 사람에 대한 배려가 부족하다고 느껴집니다.
내가 씨 언어를 배운지 얼마 되지 않았지만 이런 강좌를 쓰는 이유는 씨 언어를 처음 배울 때 느끼는 막막함을 아직도 기억하기 때문입니다. 어떤 학문을 배우다 스스로 깨닫는 경우가 있습니다. 그 때, 처음 가르치는 사람이 배울 때부터 내가 이해했던 방식으로 설명했다면 쉽게 이해할 수 있었다고 느껴집니다.
물론, 내가 얻었던 깨닫음만 가르친다고 해도 다른 사람이 쉽게 이해할 수 있다는 건 아닙니다. 사람마다 ' 아 이거다.' 하면서 깨닫게 되는 과정이 다르고, 그 전부터 알고 있는 배경지식이 다르기 때문입니다. 그렇더라도, 어느 정도 효과적으로 가르칠 수 있다고 믿습니다. 그런 면에서는 아직 초보인 내가 유리하다고 생각합니다. 전 , "아하" 하면서 느꼈던 감정들이 아직 남아있습니다.
처음 배우는 사람에게는 모든 것이 낯설 수밖에 없죠. 익숙해지기까지 어느 정도 인내심을 갖고 자세히 배워야 합니다. 프로그래밍 언어를 배운다는 것은 외국어를 배우는 것과 마찬가지이므로 충분한 시간을 투자해서, 많은 연습을 통해 열심히 배워가야 합니다.
여기에 있는 내용은 절대적인 것이 아닙니다. 제가 실수 할 수도 있고, 컴파일러마다 다르게 나타날 수도 있습니다. 여기 있는 게 꼭 맞다고 생각하지 말고 모두 다 의심하면서 공부하기 바랍니다. 이 강좌를 다 읽고 나서 다른 책이나 강좌를 보시기 바랍니다. 책 하나를 추천한다면 Teach Yourself C 라는 책입니다. 유명한 시리즈입니다. 출판사 2곳에서 번역되어 시중에 나와 있습니다. 번역서이므로 번역상태를 비교하면서 사시기 바랍니다.
00.01 프로그래밍이라?
프로그램을 짠다는 말이 무엇일까? 프로그램을 만든다는 말이죠. 그럼 프로그램은 뭔가요? 간단히 말한다면 컴퓨터를 동작하게 만드는 것이죠.
그러면 컴퓨터를 동작하게 하려면 어떻게 해야 할까요? 컴퓨터와 대화할 줄 알아야 하며, 효율적으로 일을 시켜야 합니다. 컴퓨터는 오직 0,1 밖에 모릅니다. 이런 컴퓨터와 대화하기 위해선 컴퓨터와 인간을 연결하기 위해서 여러 단계가 필요합니다. 우리는 씨 언어 하나만 알면 충분합니다. 나머지는 컴퓨터로 자동화 되어 있으니까요, 사람이 씨 언어를 쓰면 그 언어를 다시 기계가 알 수 있는 이진수로 바꾸어 줍니다. 이 과정 속에도 여러 단계가 있지만 이 정도 개념만으로도 충분할 것 같군요,
씨언어도 사람들이 쓰기 편리한 언어가 아니죠. 컴퓨터 언어도 계속 발전하고 있습니다. 언젠가는 인간이 쓰는 언어로 컴퓨터를 동작하는 일이 있겠죠. 그 때 까지는 불편하더라도 씨 언어를 사용해야 합니다. 물론, 그런 날이 와도 씨 언어가 사라지지는 않습니다. 지금도 기계어라 불리는 어셈블리어도 사용되는 것 보면 그 때도 씨는 계속 유용한 언어로 남아 있을 것입니다.
씨언어에서 기계가 알아먹을 수 있는 이진수로 바꾸어 주는 과정을 컴파일 한다고 합니다. 우리가 소스를 짜게 되면 이 프로그램을 컴파일 해야 합니다. 그러기 위해서는 컴파일러라고 불리는 프로그램이 필요합니다. 여러 가지 종류가 있습니다. 그 중 추천하는 것은 MS 사의 Visual C++ 입니다. 윈도우 환경에서 이 프로그램을 쓰신다면 이 프로그램을 추천합니다. 그런데 상용 버전입니다. 이 컴파일러를 구한다면 기본 씨 이외에 MFC라고 불리는 윈도우 프로그래밍도 할 수 있습니다.(물론 그 것도 배워야 프로그램을 만들 수 있겠죠.)
또, 추천하는 프로그램은 Dev_c++ 입니다.(GCC를 기반으로 돌아가는 컴파일러입니다. ) http://www.bloodshed.net/ 이 사이트에 가면 구할 수 있습니다. 다행히 공짜로 구할 수 있습니다. 그리고 윈도우 환경에서 프로그래밍 할 수 있습니다. 만약 리눅스를 쓰신다면 대부분 배포판에 기본적으로 깔려있는 GCC 컴파일러를 쓰시기 바랍니다. 이 프로그램은 컴파일만 하므로 따로 에디터가 필요합니다. Vi(또는 Vim ), 이맥스가 좋은 에디터입니다. 그것도 대부분 기본적으로 깔려 있습니다.
다른 컴파일러는 TC, Boland C가 있습니다. 또, 내가 모르는 많은 C 컴파일러가 있습니다. 미안하지만 강좌는 MS 사의 Visual C++ 6.0을 기준으로 하겠습니다. 될 수 있으면 Dev_c++에서도 실행 가능한지 확인하겠습니다. (Dev_c++ 에서 돌아 간다는 이야기는 gcc 에서 돌아 간다는 이야기겠죠. )
00.02 C 언어의 역사.
처음에 'CPL(Combined Programming Language) 이라는 언어가 있었고 그 언어에서 'BCPL(Basic CPL) 이라는 언어가 나왔다고 합니다. 그리고 그 언어에서 B언어가 나왔고 그 다음 C 언어가 만들어 졌다고 합니다.
C 언어는 1989에 ANSI(미국표준협회 American National Standards Institute) 라는 곳에서 표준이 만들어졌습니다. 그 것을 ANSI C라고 부릅니다.(또는 C89라고 부르기도 합니다.) 거의 그대로 다시 1990 년에 ISO (국제표준화기구, International Organization for Standardization) 표준이 되었습니다. 그 걸 ISO C 라고 부릅니다.(또는 C90이라고 부르기도 합니다.) 그래서 ANSI C 나 ISO C 거의 구별 안 합니다. 그리고 1995년 조금 확장되었습니다. 이 확장을 Amendment 1(AMD1)라고 부르고 C90과 AMD1을 합쳐 C95라고 부르기도 합니다. 1999년에도 더욱 개정되었는데 그걸 C99 라고 합니다. (Visual C++ 6.0 은 C95 까지 지원하는거 같군요.)
C언어는 여러가지 일에 사용합니다. 마이크로 프로세스라는 곳에서도 사용될 수 있고, 핸드폰 안의 프로그램에서 사용될 수 있습니다. 그래서 그 환경마다 C를 지원하는 환경이 다를 수 있습니다. 심하게는 ANSI C 표준도 지키지 못 할 수 있습니다. 그런 경우는 C 보다는 어셈이 어울리는 환경입니다. 그런 환경에서는 그 컴파일러의 메뉴얼을 찾아서 공부하는 방법 밖에 없겠죠. 이 건 아주 안 좋은 환경에 대한 이야기이고 보통 최소한 ANSI C 정도는 지원합니다.
00.03 컴퓨터의 기본적인 구조
프로그램을 만든기 위해서는 기본적인 컴퓨터 구조 정도는 알아 두어야 합니다. 컴퓨터 구조는 연산장치, 입출력장치, 저장장치로 나눌 수 있습니다.
연산장치는 CPU를 말하고 연산이라는 것은 쉽게 말해 여러가지 계산입니다. 우리가 알고 있는 사칙연산(덧셈, 뺄셈, 곱셈, 나눗셈)과 나머지 연산( 5 나누기 3 할 때 몫이 1이고 나머지가 2일 때 이 나머지 2를 찾는 연산입니다.), 숫자의 대소판별(크고 작음), 논리연산(나중에 배울 and, or, xor 등의 연산) 등의 연산이 있습니다. 이런 계산을 하는 부분이 연산장치 입니다.
입출력장치는 우리가 원하는 방향으로 컴퓨터를 조절할 수 있게 해 주는 키보드, 마우스 등의 입력장치와 결과를 보여주는 모니터, 프린터 등의 장치인 출력장치를 일컫는 말입니다.
저장장치는 계산과 관련된 데이터를 일시적으로 저장하는 메모리와 영구적으로 저장하는 하드디스크를 생각하면 됩니다.
이 정도는 이해하고 있어야 프로그래밍 하는데 편합니다.
다음 내용은 Hello, world 라는 유명한(?) 프로그램을 짜 보고 실제로 컴파일 하는 방법을 배우겠습니다. 컴파일러를 구하시기 바랍니다. 그리고 그 사용법도 익히시기 바랍니다. 대부분 인터넷에서 배우실 수 있습니다. Visual C++ 만 간단한 사용법을 가르쳐 드리겠습니다. 다른 컴파일러 사용자들은 사용법을 익히신 후 프로그램 소스가 돌아가나 확인하세요. 컴파일러 사용법외에는 소스는 크게 차이 나지 않습니다. 표준을 지키려고 노력하겠습니다.
덧글(덧붙이는 글) : 이 글을 쓰기 시작한 지 벌써 몇 년이 지났다. 그런데 내가 이 글을 완성하지 못한 상태에서 군대에 갔다 와 버렸다. 그래서 본이 아니가 다시 C 언어 초보가 되었다. 그 사이 시대는 변했다. Dev-CPP 는 더이상 버전업을 안해 주고 있고, Visaul Stdio 는 나날이 버전업이 되어버렸다. 그리고 C99 가 대세로 조금씩 자리잡고 있다. 그래서 Dev-Cpp 대신 이클립스 + CDT 를 이용해 C 프로그래밍을 하는 방법을 넣어야 하지 않을까 고민도 된다. 또 좀더 높은 버전 Visual Stdio 사용 법으로 고쳐야 하는지도 고민된다. 그러나 이 글 자체는 컴파일러와 대한 내용보다 C언어 자체에 대해 다루고 있다. 그리고 Visaul Stdio 6.0 에서 된다는 것은 그 보다 높은 버전에서 무리없이 컴파일 된다는 것을 증명해 준다고 생각한다.(물론 낮은 버전에서 된다고 높은 버전에서 되는 것은 아니지만 ANSI C 만 지켜준다면 가능하다고 생각한다.) 그래서 이 환경에서 프로그램 해도 기초적인 내용은 문제 없다고 생각합니다.
작성자 : 한밀(승룡)
버전 : 0.1.5
이 글은 계속 고쳐지고 있습니다.
2003년 4월 어느 봄날
최종 수정일 : 2007년 7월 하순, 날씨가 더워 잠을 못 자고 있는 어느 날
***** ljh131님에 의해서 게시물 복사 + 카테고리변경되었습니다 (2007-08-03 14:17)
