개나리 연구소 C 언어 노트 (tyback.egloos.com)
프로그램을 학교 등지에서 조금이라도 배운 사람들을 위한 프로그래밍 노트 입니다. 저 역시 그 사람들 중 하나 입니다. 중고등학교 시절 학교 도서관, 새로 생긴 시립 도서관 등을 다니며 책을 보 고 정리하며 어느정도 독학으르 공부하긴 했지만, 자주 안하다 보면 금방 잊어먹고 하더라구요. 그래서, 이참에 내용도 한 번 싹~! 정리해볼까 하는 차원에 글을 쓰기 시작했습니다. ====================================================================== 이 세상에는 참 많은 언어들이 있습니다. 우리가 사용하는 모국어 한글부터 시작해서 어릴때 조기교육 이네 뭐네 하며 귀에 못이 박히도록듣는 영어와, 자장면 나라말(일리가 없지만;;;;) 중국어, 바다건너 일 본어 등등... 소수민족의 언어까지 모두 합하면 그수는 약 3,000 가지 정도가 된다고 하네요. 우리가 입으로 소리내어 말하고 쓰고 듣는 언어가 이정도인데 컴퓨터도 예외는 아닐 수 없겠죠? 아시 다시피 컴퓨터가 어느 날 하늘에서 '뚝!' 하고 떨어진 것도 아니고, 지금까지 발전하면서여러사람의 손 을 거쳐온 것 만큼 컴퓨터와 의사소통을 할 수 있는 프로그래밍 언어도 여러가지가 있습니다. 우리가 배 우고자 하는 C언어도 결국 그 프로그래밍 언어 중 하나에 불과합니다. 그럼 프로그래밍 언어 몇 가지를 아주 간단하게 소개하겠습니다. 1. COBOL (Common Business Oriented Language) =>사무용 데이터 처리를 위한 공통언어로 설계된 프로그래밍 언어. MOVE 200 TO S COMPUTE S = S / 100 DISPLAY S 2. Fortran (Formula Translator) => 1957년, 미국 IBM 사에서 수식을 그대로의 모양으로 프로그래밍 할 수 있게 개발한 최초의 과학 기술 계산용 프로그래밍 언어. S = 200 S = S / 100 WRITE (*,*) S 3. BASIC (Beginner's All Purpose Symbolic Instruction) => 미국 다트머스 대학에서 개발한 초보자용 프로그래밍 언어. S = 200 S = S / 100 PRINT S
4. PASCAL => 1968년 스위스 취리히 대학 니클라우스 위스 교수에 의해 만들어진 구조적 프로그래밍 개념의 언 어로, 데이터 구성시길이의 제약이 없고 다양한 형식과 구조를 사용한다. (if then ~ else, while ~ do 와 같은 제어구조) S := 200; S := S / 100; writeln(s); 5. C => 1973년 데니스 리치에 의해 개발된 언어. 간결한 표현양식, 풍부한 제어구조와 데이터구조, 연산 자를 가지고있다. S = 200; S /= 100; pfintf("%f", s); 6. C++ => C 언어의 확장판. 1983년 AT&T의 벨 연구소에서 개발한 언어로 객체지향을 도입했다. S = 200; S /= 100; cout << S; 7. C# => MS.net 플랫폼에서 실행되는 솔루션을 신속하고 편리하게 개발할 수 있는 최신 객체지향 언어. 웹개발이 가능하다. S = 200; S /= 100; Console.writeline(S);
8. JAVA => 1995년 5월 미국 Sun Microsystem 사가 개발한 인터넷용 프로그래밍 언어로 런타임 프로그램 만 설치하면 모든 플랫폼, OS에서 개발 및 동작이 가능하다. S = 200; S /= 100; system.out.println(s); 음... 대략 굵직한 것들은 다 나온 것 같군요... 간단한 소개와 함께 아주 짧은 코딩도 몇 줄 해봤는데 출력하는 명령어 부분만 제외하면 거의 비슷한 구조를 가지고 있는걸 확인할 수있을겁니다. 프로그래밍 언어는 몇 가지 큰 개념(객체지향, 클래스...) 을 확실히 이해하고 한 언어에 능통하다면 다른 언어를배우는데 비교적 수월한 편입니다. 누구였더 라?? 8개국어를 할 줄안다는 소녀가 있었는데 그녀도 이러한 원리로 외국어를 하나씩정복해 나갔다고 하네요. 뭐... 사람 말하고 하는건 귀가 뚫리고 말문이 트이기 시작하면 뭐든 할 수 있지만, 프로그래밍 언어는 백날 귀로 들어봐야 뭔말인지 하나도 못알아들을 뿐이죠. 무조건 해보는게 중요합니다!!! 여러분의 하드디스크를 온갖 온라인게임, 야동(응 -ㅅ-;;;;;;;;?) 으로 채워나가는게 아니라 각종 개발도 구, 프로그램 소스코드 등으로 채워나가면서 컴퓨터와 다양한 의사소통을 하는게 매우 중요합니다. 프로그래밍 언어에 대한 짧막한 소개는 이쯤에서 끝내겠습니다. 사실 더 이상 아는게 없거든요..;;;; 여기 내용은 그냥 상식으로 알아뒀다가 대학 강의시간에 아는 척 하기 딱 좋은 것들이라 생각됩니다. 그 닥 전문적인 내용도 아니고 말이죠. 계속해서 C 언어 프로그램 개발을 위한 환경조성에 대해서 알아보겠습니다. 우선, 여러분의 컴퓨터를 한 번 천천히 살펴보십시요. 지금 이 글을 보고계신 컴퓨터의 운영체제가 윈 도우인지, 리눅스인지, 아니면 맥 혹은 솔라리스 같은 것인지 말이죠. 꼭 윈도우가 아니라도 C 프로그래 밍은 얼마든지 할 수 있습니다. 대게의 프로그램이 C 언어로 만들어졌다고 해도 과언이 아니니 말입니 다. 독자중에 온라인 게임 마비노기를 즐기는 분에 대한 한마디... 큰 맘먹고 비주얼 C++ 로 어셈블 하 면 몬스터들의 행동패턴 등등을 뜯어볼 수 있다는 사실!!!! (이라 쳐도 소스코드를 볼줄알아야 뭐가 보이 죠 OTL...)
여기까지는 그냥... 군에 있던 제 동기가 해준 이야기 입니다. 진짜로 비주얼 C++ 로 어셈블 하면 소스 코드가 보이는지 어쩐지는 해본적도 없고 관심도 없고... -ㅅ-... 아무튼 어떤 운영체제이건 상관없습 니다. 프로그래밍을 꾸준히 하겠다는 의지!!! 그것만 있다면 프로그래밍을 공부하는데 있어서는 승승장 구하리라 보장하는 바입니다. C 프로그래밍의 진수를 느껴보고 싶으신 분들은 큰맘먹고 컴퓨터에 리눅스를 설치하라고 말씀드리고 싶습니다. 리눅스는 일단 공짜인데다 C 언어로 만들어진 운영체제입니다. 그 자체가 C 언어 입니다. C 언어 개발도구가 기본적으로 포함되어있고 C 언어와 함께 리눅스를 공부하면 다른 언어를 공부하는데 도 상당한 도움이 됩니다. 하지만 위에 썼듯이 정말 리눅스를 설치하는데는 큰맘먹고 해야할 필요가 있습니다. 전세계 여러 개발 자들이 함께 만드는 운영체제이긴 하지만 그만큼 아직 검증되지 않은 부분도 있고, 설치하면서 여러가 지 문제가 발생할 수 있습니다. 최악의 경우 컴퓨터 전체를 통째로 포맷을 시키고 윈도우 부터 다시 설치 해야하는 복잡한 일까지... 맥은 상황이 그나마 좀 나은가요?? 한 번 써보고 싶지만 제가 아직 거기까지는 능력이 되지않아서 말 이죠. 그래도 상용 운영체제인 만큼 프로그램 개발환경 지원도 어느정도 잘 되어있을 것입니다. 어쨌든 자신의 운영체제와 프로그래밍의 목적에 맞게 그에 맞는 개발도구 등을 준비하면 되겠습니다. 윈도우의 개발도구로는 비주얼 스튜디오가 대표적입니다. C 뿐만 아니라 자바, 베이직 까지 건드릴 수 있는 통합개발도구로 많은 곳에서 비주얼 스튜디오를 가지고 프로그래밍을 가르치고 또, 실무에서도 많 이 사용하고 있습니다. 비주얼 스튜디오의 설치에 관해서는 언급하지 않겠습니다. 어려운거 있나요?? 그냥 셋업 누르고 다음 다음 다음 누르고 시리얼 적고 다음 다음 다음... 설치과정에 시스템을 건드리내 뭐내 하는 내용은 하 나도 없으니 안심하고 빌 게이츠가 하라는대로 따라하면 됩니다. 참 쉽죠? 음...그럼 다른 방법을 알아볼까요? 만약 여러분 컴퓨터가 심하게 오래됬거나 비주얼 스튜디오 자체가 설치가 되지않거나, 설치했더라도 실행했을 때 시스템이 많이 느려지거나 하는 경우 말인데요... 그런경우에는 과감하게 비주얼 스튜디오 를 포기하는 것이 하나의 방법이 될 수 있습니다. 비주얼 스튜디오 뿐만이 아니라 C 프로그래밍을 위한 개발도구, 그 중에서도 비주얼 스튜디오에 결코 뒤지지않는 개발도구는... 자료실을 잘 찾아보세요. 지식인이 대세라는 말도 있습니다. 조금만 찾아보면 얼마든지 좋은 개발도구 들이 많이 있으니 말이죠.
Commented by 퓨리넬 at 2009/04/02 01:46 [삭제] [답글] dev cpp나 이클립스 c/c++버전일까요? 그런데 dev cpp는 이제 업데이트가 없나봐요... Commented by tyback at 2009/04/02 02:08 DEV C++ 은 업데이트가 상당히 더딘 편이랍니다... 첨부터 기대도 안했죠 -ㅅ-... 그보다 빌게이 츠가 오픈소스를 의식해서 비주얼 스튜디오를 일부기능을 제외한 Express Edition 이라는 이름으 로 내놓은지가 벌써 1년이 다 되어가는군요!!! 물론 MSDN 라이브러리까지... 오오오오 ;ㅂ;!!! (http://www.microsoft.com/express/default.aspx) Commented by tyback at 2009/04/02 02:17 예전에는 DEV C++ 많이 썼었는데... 그 외에 Codeblocks (http://www.codeblocks.org/), Eclipse (http://www.eclipse.org/) 같은 것도 있죠. 코드블록스는 이클립스에 비해서 훨씬(그럴겁니다;;;) 사용하기 쉽고 편리하고, 비주얼 C++ 이나 DEV C++ 의 프로젝트를 불러올 수 있습니다. 이클립스는 원래 자바로 만들어졌거니 와 자바 개발도구지만... 이 사람들 못하는게 어디있습니까 -ㅅ-... 하면되지... 뭣도 모르고 쓸 때는 제대로 부려먹지도 못하고 이클립스로 텍스트 파일 건드린 기억이;;;; l 딩동~! 1970년, AT&T 의 부설기관인 벨 연구소의 켄 톰슨이 B 언어를 만들었는데 이를 본 데니스 리치와 브 라이언 커니건이 개량하여 1972년에 내놓은 것이 C 언어랍니다... 라고 해커스쿨에서 배웠습니다 ;ㅂ;/... 랄라...
다들 컴파일러, 개발도구 등등은 준비하셨으리라 봅니다. (무책임;;;;;) -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- printf() printf 는 C 프로그래밍에서 데이터 값이나 문자열 등등을 출력하는 일을 하는 함수 입니다. 함수가 뭐 라고 까지 설명할 여력은 없으니 다음으로 계속 하겠습니다. 1 printf("출력할 내용"); => printf 는 이렇게 출력할 내용을 적어주면 됩니다. 2 printf("출력형식", 출력 데이터); => 혹은 위 처럼 출력형식을 적어주고 출력 데이터를 지정해주는 방법과 3 printf("출력형식1, 출력형식2,... ", 출력 데이터1, 출력 데이터2,...); => 다수의 출력형식을 적어주고 각각에 대응하는 출력 데이터를 지정해주는 방법으로 사용합니다. 그럼 출력형식은 뭘 쓰면 되는가 -ㅂ-?! %d : 10진수 정수형 %o : 8진수 정수형 %x : 16진수 정수형 %u : 부호없는 10진수 정수형 %c : 한 문자 %s : 문자열 %f : 부동소수점 (12.345) %e: 부동소수점 (1,2345E12) %g : %f 나 %e중 출력할 자릿수를 덜 차지하는 형태 조금이라도 C 언어를 만져본 이들이라면 무슨말을 하는지 알 것입니다. 당연하죠!!! 이 글은 지금... 걸음마는 땠지만 하나도 기억 안나는 이들을 위한 벼락치기 공부자료... 노트 입니다. 노트!!! 아무튼, 위의 출력형식은 다른 함수에서도 비슷하게 자주 사용하니까 대강 보고 이게 어떤 자료 형, 어떤 형식인지 정도만 알아두면 되겠습니다.
* 여기서 " ㅁ " 은 공백을 뜻합니다. printf("%-5d", 123); => 1 2 3 ㅁ ㅁ /* 즉, 5개 칸중에 왼쪽에서 차례대로 지정한 데이터를 10진수 정수형으로 출력하라는 내용 */ printf("%5d", 123); => ㅁ ㅁ 1 2 3 printf("%05d", 123); => 0 0 1 2 3 /* 이처럼 앞에 다른 문자를 집어넣어주면 공백대신 그 문자가 들어갑니다. */ 그럼... 여러문자, 여러 데이터를 받아서 출력할 때는 어떻게 할까요=ㅂ=/??? printf("%s, %s", "태연씨...", "사랑해요>ㅅ</~ "); /* 검증해본 적 없지만 대충... 콤마 쓰라는 뜻입니다...*/ 그리고... 하나 빠진게 있는데, 출력형식 %c 는 작은 따옴표를 사용한다는 점.. 즉 printf("%c", '얼음공주제시카'); 정도가 되겠습니다... 참 쉽죠?? 자리가 남으니까... 제어문자에 대해서 짚어보죠... 제어문자는 앞서 살펴봤던(그리고 다음에 알아볼) 입출력 함수들의 출력형식과 비슷한 일을 합니다. 단, 아주 특수한 일들을 몇 가지 하고 있다는 것 정도...??? \a = beep \r = 줄의 맨 첫 칸으로 \t = tab \f = 출력화면을 한 페이지 넘김 \n = 줄바꿈 \\ = \ \o = 공백문자 \" = " \b = 뒤로 한칸 후진 이 중에서 줄바꿈은 프로그래밍을 하면서(출력을 하면서) 자주 사용하게 될 것이니까 그냥 눈으로만 익혀두세요. 메모장과 같은 것들로 소스코드를 작성할 때 역슬래시는 키보드에서 을 입력하면 됩니 다. 몇 몇 개발도구에서는 키보드 을 누르면 역슬래시가 나옵니다.
scanf(); 1 scanf("입력형식", 데이터 저장 변수); 2 scanf("입력형식1, 입력형식2,...", 데이터 저장 변수1, 데이터 저장 변수2,...); 음... 여기서도 입력형식이 나오는군요. 좋습니다. 입력형식 -ㅅ-... 하지만!!! printf() 와 상당부분 같은 것들 뿐이라 정말로 초 간단하게 뭐가 있는지만 적어보자면 %d, %o, %x, %c, %s, %f 가 있겠습니다. 이게 도대체 무슨말인지 도통 기억이 나지 않으신다면 제 3화(;;;??)를 참고해 주시기 바랍니다. 그리고 또 하나... 초 간단 사용예제... char name; /* 입력받을 변수를 지정해줍니다. 변수니 함수니 하는 것들은 한~ 참 뒤에 설명하겠습니다. 어차피 한 번쯤 프로그래밍을 해본 분들이라면 알고계시겠죠?? 네.. 그럴거에요... 네...;;;; */ scanf("%s", &name); /* '&' 는 배열, 포인터를 제외한 일반적인 변수를 사용해 받을 때 반드시 써줘야 합니다. */ printf("%s", name); /* 출력할 때는 붙여줄 필요가 없죠...*/
변수 (Variable) 1 영문, 숫자, 밑줄의 조합으로 지정 2 첫 글자는 반.드.시 밑줄이나 영문자 3 특수문자, 키워드 사용금지 키워드 auto, double, int, struct, break, else, long, switch, case, enum, register, typedef, char, extern, return, union, const, float, short, unsigned, continue, for, signed, void, default, goto, sizeof, volatile, do, if, static, while 헝가리안 표기법 1 변수의 대,소문자를 구별한다. 2 특별한 접두어 사용. f ; 플래그 = char fchecked; c ; 카운터 = int cperson; l ; long 형 = long lmaxlesson; p ; 포인터 = char *pbut; u ; unsigned int 형 = unsigned int unumber; w ; word 형(unsigned short) = wdata; dw ; double world 형(unsigned short) = unsigned long dwdata; str ; 문자열 = char *strname; 자료형 문자형 char (문자형) ; 1 byte, -128 ~ 127 unsigned char (부호없는 문자형) ; 1 byte, 0 ~ 255 정수형 int (정수형) ; 4byte, -2^31 ~ {(2^31) -1} unsigned int (부호없는 정수형) ; 4byte, 0 ~ {(2^31) - 1} 정수형의 변종 short ; 2byte, -32,768 ~ 32,767 long ; 4 byte, 2^31 ~ {(2^31) -1} 실수형(부동소수점) float ; 4byte, 10^(-38) ~ 10^38 double ; 8byte, 10^(-308) ~ 10^308
상수 (Constant) 1 #define ~ ; (전처리기를 이용한 방법) #define MAX 3; #define ALPHA 'A' #define BETA (MAX - 1) 2 const 자료형 ~ ; (키워드를 이용한 방법) const int MyGirl = 1; const char Mysweetbaby = '태연'; 연산자 (Operator) 1 산술연산자 + (a + b) - (a - b) * (a * b) / (a / b) % (a % b -> a / b = x y ) - (-a) 2 비교연산자 < (a < b) > (a > b) >= (a >= b) <= (a <= b) == (a == b)!= (a!= b) 3 논리연산자 && (;and, a && b) (;or, a b)! (;not, a! b)
4 증감연산자 a = x ++; 출력후 증가 a = ++x; 증가후 출력 a = x; x = x + 1; x = x + 1; a = x; 5 비트연산자 & (and) (or) ~ (not) ^ (xor) << n (n bit left shift) >> n (n bit right shift) 6 대입연산자 = (a = 1;) += (a += 1; a = a + 1;) -= (a -= 1; a = a 1;) *= (a *= 1; a = a * 1;) /= (a /= 1; a = a / 1;) %= (a %= 3; a = a % 3;) <<= (a <<= 1; a = a << 1;) >>= (a >>= 1; a = a >> 1;) &= (a &= b; a = a & b;) ^= (a ^= b; a = a ^ b;) = (a = b; a = a b;) num1 += num2 -= data1 *= data2 /= 2; {def. num1 = num2 = 4, data1 = data2 = 3} data2 = data2(3) / 2 = 1.5 data1 = data1(3) * 1.5 = 4.5 num2 = num2(4) 4.5 = -0.5 num1 = num1(4) + (-0.5) = 3.5
7 삼항연산자 Var = (조건)? data1 : data2; 조건이 참이면 data1, 거짓이면 data2 를 처리. A = (input == + )? (x + y) : (x y); if (input == +) A = x + y; else A = x y; /*간단한 조건문을 단 한줄로 줄일 수 있다.*/ 8 형변환연산자 (자료형) var_name; int num; float data; data = 3.141592; num = (int)data; 연산자 우선순위 괄호, 배열, 구조체 ( ) [] - > 단항! ~ ++ - - 형변환연산자 * & sizeof 곱셈, 나눗셈 * / % 덧셈, 뺄셈 + -- 시프트 << >> 비교 < <= >= > ==!= 비트 & ^ 논리 && 삼항? :: 대입 = += -= *= /= %= >>= <<= &= ^=!=