1. 변수란?

 변수라는 이름은 그 정의라고 할 수 있는 '변경 가능한 수'의 줄임말이다. 그러나 이름 그대로 이해를 하면 나중에 이해하기 어려운 부분이 생길 수 있도록 우리는 다르게 외워두도록 한다.

 변수란?
 Data를 저장하기 위하여 임의로 잡은 메모리 공간에 붙인 이름


 이렇게 외워두어야 추후 배열이나 포인터를 배울때 이해하기 쉽다.

 변수에는 여러가지 종류가 있다. char형, int형... 기본적으로는 C에서 제공하는 자료형이라는 녀석을 이용해 선언한다. 이 자료형이라는 녀석은 추후 다시 공부할 계획이므로 간단하게만 알아두도록 한다.

문자형 자료형 : char  (char형은 정수형 자료형으로도 사용된다.)
정수형 자료형 : int
실수형 자료형 : float, double

이 3가지만 알아두어도 아직까지는 사용하는데 별 문제가 없을 것이다.

다음으로는 변수의 선언에 대하여 알아보자.
변수의 선언은 기본적으로 다음과 같은 형태를 따른다.
[자료형] 변수명;
그렇지만 변수의 선언은 같은 자료형을 동시에 선언을 할 수도 있고, 선언과 함께 초기화 할 수도 있다.  그 예시는 아래의 그림과 같다.

참고로 여기서 초기화란 지정된 메모리에 Data를 입력해주는 작업을 의미한다. 여기서 초기화를 해주지 않으면 변수는 쓰래기값(아무 의미 없는 값)을 가지고 있게 된다.


위의 그림을 보면
int형은 두줄로 나누어
char형은 한줄에 전부 선언한 것을 볼 수 있다.

b와 c의 경우 선언과 동시에 초기화 되었고
a와 d의 경우 아래에서 선언과는 별개로 초기화 시켜 주었다.

char형인 d의 경우 문자 'a'로 초기화 시켜 주었다.

위의 예제를 실행시키면 다음과 같다.


a, b, c, d, 모두가 숫자로 나오고
마지막줄에 d만 다시 문자로 출력되었다.
이는 문자형이라고 설명하였던 char형 변수에 문자를 저장할때 문자 고유의 코드 번호(C에서는 ASCII 코드를 사용함)로 저장하였다가 출력할때 코드와 비교하여 출력하기 때문이다..

따라서 printf()에서 출력할때 %d를 사용하느냐. %c를 사용하느냐에 따라서 char형 변수가 숫자로 출력되느냐 문자로 출력되느냐가 결정되어진다. 이에 대한 내용은 추후 printf()와 scanf()장을 통하여 설명하도록 하겠다.

또한 변수에 저장되는 값은 변경 될 수 있다. 그 예시는 아래와 같다.

위의 예시에서 value값은 10으로 초기화 되어 있다가 20으로 변경되었다.
C언어는 순차적 언어(위에서부터 아래로 읽어내리는 순서대로 동작한다는 의미)이기 때문에 10으로 초기화된 6번줄에 의해서 8번째 줄의 printf에서 value의 값은 10이 되고, 10번째 줄에 의해 12번째 줄의 printf의 value값은 20이 되게 된다.

위의 소스 코드를 코딩하여 출력하면 다음과 같다.





2. 변수를 선언하는데 있어서 주의해야 할 점
 변수를 선언하는데 있어 주의해야 할 사항들을 알아보도록 하자.

 1) 함수 내에서 변수를 선언할 경우 가장 먼저 등장해야 한다.
   - C언어에서는 변수의 선언이 함수의 가장 첫 부분에 와야만 한다.
      즉 아래와 같은 경우는 원칙적으로 허용되지 않는다.

   ※ 이는 C언어에서만 해당되는 것으로 C++에서는 해당되지 않는다.
       따라서 일부 C/C++컴파일러에서는 이와 관계없이 정상적으로 작동하는 경우도 있다.
       다른 일부의 컴파일러에서는 소스코드의 확장자를 .c로 해놓았을때에만 해당되는 경우도 있다.
       (앞으로 연습을 위해 코딩할때는 확장자를 꼭 c로 적용하도록 하자.)

 2) 변수의 이름을 짓는 방법
  - 변수의 이름은 알파벳, 숫자, 언더바(_)로 이루어진다.
  - C언어는 대소문자를 구분하므로 VALUE 변수와 value 변수는 다른 변수로 구분된다.
  - 변수의 이름은 숫자로 시작할 수 없고, 변수의 이름에 공백이 포함 될 수도 없다.
  - 키워드를 변수의 이름에 사용할 수 없다.
 여기서 키워드라는 것은 컴파일러가 이미 사용하고 있는 단어들이다. 예를 들면 여기서 자료형으로 사용하고 있는 int가 그 대표적인 예가 되겠다. 만약 int라는 변수의 이름이 허용된다면 컴퓨터는 int라는 녀석을 자료형 int로 보아야할지 변수이름 int로 보아야 할 수 없기 때문이다.

변수의 이름을 저장하는데는 위의 제약조건 말고는 특별히 제약하고 있지 않다. 하지만 대개는 프로그램의 가독성(소스코드를 보고 어떻게 돌아가는지 보는것)을 좋게 하기 위해서 변수의 이름은 그 용도나 쓰임에 맞는 이름을 사용하기 마련이다.
또한 언더바(_)로 시작되는 변수의 이름은 헤더파일(stdio.h와 같은 미리 함수등을 저장해놓은 파일)이나 시스템에서 많이 사용되므로 자제하도록 하자.

변수는 이정도만 일단 알아두고 넘어가도록 하자.
다음장에서는 연산자에 대해서 알아보도록 하겠다.




이번장을 처음 쓴게 2008년 12월 28일...
오늘이 2010년 6월 6일이다.

그 사이 개인적으로 피치 못할 사정이 있기는 했으나
간격의 텀이 너무 길었던 것 같다. 앞으로 좀 더 자주 업로드 하도록 노력하도록 하자.
Posted by 청음
 자. 여러분 어느것을 공부하든간에 공부를 할 때에는 가장 기초가 되는 단계가 있습니다. C언어에서는 Hello World가 바로 그 예이다. 이 Hello World는 그냥 창에다 Hello World라는 문장을 적게 만드는... 다소 바보스러운 프로그램이다. 그러나 일단 이 프로그램을 코딩해 봄으로서 C언어의 가장 기초가 되는 구성을 알아볼 수 있을 것이다.

Hello.c
(위 코드는 VirtualBox를 이용해 CentOS에서 작성한 소스입니다.)

 무려 빈줄 1줄을 포함하여 8줄밖에 안되는 프로그램이다. 일단 이 프로그램을 짜서 실행을 해 보자. 왜냐하면 이 프로그램을 구동해봄으로서 C언어가 어떤 느낌의 언어인지를 알 수 있고, 기본적인 작성 방법을 익힐 수 있기 때문이다.

 먼저 이 프로그램을 크게 4부분으로 나누어서 생각해 보도록 하자. 먼저 함수의 형태를, 다음으로 헤더파일에 대하여 그리고 마지막으로 프로그램을 작성할때 중요한 주석 작성에 대해서 간략하게나 알아보게 될 것이다.

1. 함수의 형태

 이 프로그램은 main이라는 단 하나의 함수로 구성되어 있다. 이 main이라는 함수는 콘솔기반의 C언어에서 정말 중요한 역할을 하게 되는데 코딩을 통해 작성된 실행파일을 구동하면 이 main함수를 처음부터 끝까지 수행하고 이 메인함수가 끝남과 동시에 프로그램을 끝내기 때문이다. 따라서 C언어로 작성된 프로그램은 main함수로 시작해서 main함수로 끝나는 것이 보통이다.

 초등학교 중학교정도의 수학을 공부한 사람이라면 응당 함수가 어떤 개념인지를 알 것이다.
그래도 잘 모르는 사람을 위하여 살짝 사전적 정의를 찾아보자.

 <수학> 두 개의 변수 x, y 사이에서, x가 일정한 범위 내에서 값이 변하는 데 따라서 y의 값이 종속적으로 정해질 때, x에 대하여 y 이르는 말. y가 x의 함수라는 것은 y=f(x)로 표시한다. ≒따름수.

 즉 입력값인 x에 따라 출력값 y가 변하는 녀석을 함수라고 한다. 프로그래밍에서의 함수도 이와 같다. 다만 입력값이나 출력값이 없어도 함수가 작동한다는 것과 함수의 결과만이 프로그램 전체에 영향을 끼치는 것이 아니라 그 과정적인 부분에서도 프로그래밍 방법에 따라 프로그램 전체에 영향을 끼친다는 점 정도를 다르다고 할 수 있겠다.

일단 기본적인 함수의 형태는 이러하다.
[반환형] 함수의이름([입력형])
{
//함수의 몸체
}

 여기서 반환형과 입력형은 입력되어지는 Data의 Type을 의미하며 이 Type들은 이미 C언어에 의해서 정의되어 있다.
char : 1byte의 문자를 저장할 수 있는 자료형
int : 4bytes 크기의 정수를 저장할 수 있는 자료형
double : 8bytes 크기의 실수를 저장할 수 있는 자료형
위의 3개의 자료형은 C언어에서 가장 대중적으로 사용하는 자료형들로 이 외의 자료형에 대해서는 추후 다시 설명하도록 하겠다.

 함수의 이름은 함수를 구분하게 도와주는 식별자이다. 함수는 이 이름을 이용해 호출을 하게 된다.
함수의 몸체는 함수를 사용할때 처리하는 프로세스적 알고리듬을 기입하는 부분이다. 예를 들어 위의 Hello.c 파일의 경우 main함수가 호출되면 printf라는 함수가 호출되게 되고 0이라는 숫자를 반환하면서 종료하게 된다.

 이때 printf()의 호출, return등의 연산을 수행하는 모든 문장들의 뒤에는 ;(세미콜론)을 붙여 문장의 끝을 나타내게 된다. 그리고 return으로 반환되는 값은 수학적 함수에 비교하면 y에 비교할 수 있는 것으로 함수의 결과값을 반환하는 것이다.
(함수의 이름인 printf와는 달리 printf()는 printf함수라고 읽는다.)

 이 외에도 함수의 선언과 정의, 함수의 호출등의 내용이 있지만 이는 추후 다른 장을 통해 따로 설명하도록 하겠다.

2. 헤더파일이란?

 헤더파일이란 자주 쓰는 함수의 집합과도 같은 것이다.
 우리가 프로그래밍한 Hello.c 파일에는 printf()라는 기입되는 함수가 사용되고 있다. 이 함수는 화면에 전달된 내용을 작성하는 함수로 이 프로그램을 수행을 했을 경우 다음과 같은 결과가 나오게 된다.


 위의 그림과 같이 printf함수는 우리가 직접적으로 작성하지 않았지만 실제로 "Hello C World \n"이라는 인자값을 전달받아 출력하고 있다. 그렇다면 이 printf()는 어디에 작성되어 수행되어지고 있는 것일까? 이 함수는 바로 stdio.h라는 헤더파일에 작성되어 있고, #include <stdio.h> 라는 헤더파일 포함을 알리는 선언에 의해 프로그램에 속해 있어 printf()를 사용할 수 있게 되는 것이다.

 이러한 헤더파일을 선언할때에는 한가지 주의해야 할 점이 있는데 헤더 파일의 포함을 알리는 선언은 프로그램 작성시에 가장 먼저 등장해야만 한다는 점이다.
(printf()에 대해서는 다음에 다시 설명하도록 하겠다.)

3. 주석의 작성

 주석은 프로그램을 작성할때 해석을 다는 것으로 파일의 첫부분, 헤더파일과 전역변수 위, main을 제외한 각각의 함수 위에 다는것이 보편적인 방법이다. 주석처리된 부분은 컴파일 과정에서 컴파일러에 의해서 자체적으로 무시되어진다. 주석을 다는 방법은 크게 두가지 부분으로 나눌 수 있다. 여러줄 주석과 한줄 주석이 바로 그것이다.
 여러줄 주석은 주석의 시작과 끝 사이의 모든 내용을 주석화 시키는 것이다.

ex)
/* 여기는 주석 부분입니다.*/
/*
이 주석은
여러줄에 걸쳐서도
사용이 가능합니다.
*/


위의 두가지 경우가 여러줄 주석을 이용한 방법이 되겠다. 반면에 한줄 주석은 //기호부터 그 있는 모든 글을 주석화한다.

ex)
이곳은 한 줄 주석부분에 포함되지 않습니다. //이곳은 한 줄 주석부분에 포함됩니다.
이곳은 한 줄 주석부분에 포함되지 않습니다.


오늘 작성한 Hello.c 파일에서는 여러줄 주석과 한줄 주석 두가지 방법의 주석이 모두 사용되었다. 이를 참고하는것도 한가지 방편이 될 것이다. 이 주석은 두가지를 섞어 사용할 수 있는데 단 여러줄 주석의 경우 중복하여 사용할 수는 없다.

ex)
/* (<- 주석의 시작 부분입니다.)
이곳은 주석에 포함됩니다.
//이부분은 주석에 포함됩니다.

/* (<- 이 주석의 시작 부분도 주석처리 되어버립니다.)
이곳은 주석에 포함됩니다.
//이부분은 주석에 포함됩니다.

*/ (<- 이 기호에 의해 주석이 마쳐집니다.)
이곳은 주석에 포함되지 않습니다.
//이부분은 주석에 포함됩니다.

*/  (<- 주석 여는 부분부분 없이 주석닫는부분만 있으므로 오류가 납니다.)

오늘은 Hello.c 파일을 통해서 C언어의 기본적인 부분을 살펴보았다. 컴퓨터 프로그램에 관한 지식이 없는 상태에서 이 프로그램을 보고 있으면 C언어라는 언어가 생각보다 복잡한 형식을 가지고 있는 언어라는 것을 알 수 있을 것이다. 그렇지만 포기하지 말자. 앞으로 C언어를 더 배우다보면 언젠가 "심심한데 C언어로 프로그램이나 한번 짜볼까?"라고 말하고 있는 자신의 모습을 볼 수 있을 테니까!
Posted by 청음
이번 실습은 PUTTY를 얼마나 능숙하게 사용하느냐를 연습하는 부분입니다.

일단 다운받은 PUTTY를 켭니다.

HOST_NAME에
http://computer.kpu.ac.kr
을 친 뒤 open 버튼을 누릅니다.
이때 connect type은 SSH에 맞춰주도록 합니다.

검은창에
login as :
라는 글이 보일 것입니다.
학교에서 받은 아이디를 입력합니다.

입력 후
아이디@computer.kpu.ac.kr's password :
라는 글이 보일 것입니다.
패스워드를 입력합니다.
(패스워드를 입력할 시에는 화면에 아무런 변화도 나타나지 않습니다.)

제대로 로그인이 되었다면
computer%
라는 문구가 보일 것입니다.

이 상태부터 실습을 시작합니다.

1. 현재의 자신의 폴더 위치를 확인합니다.
$ pwd
를 입력합니다. ($ 는 커멘드 상태라는것을 의미합니다. 실제 명령어는 'pwd'만 입력하면 됩니다.)

2. programing 폴더를 작성합니다.
$ mkdir programing

3. programing 폴더로 이동합니다.
$ cd programing

4. programing 폴더 안에 오늘 날자로 폴더를 만듭니다.
$ mkdir 081225

5. 오늘 날자로 만들어진 폴더로 이동합니다.
$ cd 081225

6. 현재 자신의 폴더 위치를 확인합니다. (실행 뒤 1번과 비교해 봅시다.)
$ pwd

7. 임의의 폴더 test를 작성합니다.
$ mkdir test

8. 현재 폴더에 test디렉토리가 생겼는지 확인해 봅시다.
$ ls

9. test폴더를 지워봅시다.
$ rmdir test

10. 현재 폴더에 test디렉토리가 남아있는지 확인해 봅시다.
$ ls

11. 임의의 프로그램 1.c를 작성해 봅시다.
$ vim 1.c

12. vim 에디터를 이용해 다음의 내용을 작성해 봅시다.
(vim 에디터 사용법은 유닉스 책을 보시고 공부하시기 바랍니다.)

#include <stdio.h>

int main(void)
{
printf("Hello World! \n");
return 0;
}

13. 작성한 1.c 파일의 내용을 확인해 봅시다.
$ cat 1.c

14. 작성한 1.c 파일을 코딩해 봅시다.
$ gcc 1.c

15. a.out 파일이 있나 확인해 봅시다.
$ ls

16. a.out 파일을 실행해 봅시다.
$ a.out
($ ./a.out 을 입력해야 하는 경우도 있습니다.)

17. a.out 파일을 삭제해 봅시다.
$ rm a.out

18. 현재 디렉토리 위치를 확인합니다.
$ pwd

19. 상위 디렉토리로 이동해 봅시다.
$ cd ..

20. 현재 디렉토리 위치를 확인합니다.
$ pwd

위의 20단계를 거치시면 유닉스의 아주 기본적인 사용법을 익히게 됩니다.
vim편집기의 사용법은 살자쿵 복잡하므로 생략하도록 하겠습니다.
vim편집기 사용법도 몇가지만 익히시면 쉽게 사용하실 수 있습니다.
Posted by 청음
 제가 처음 C언어를 배운것은 2007년 3월. 제가 한국산업기술대에 갓 입학한 이후입니다. 제가 학교를 들어올 시기인 2007년도에는 전국적으로 JAVA열풍이 불었습니다. 그래서인지 C언어에 대해 중요성을 빠뜨리기도 하고, 되지 않는 JAVA를 하겠다고 헛바람이 든 친구들이 C언어를 버리고 샛길로 새다가 2학기가 되니 딴학교로 새고 보이지 않게 되었습니다. 제가 이 강의를 작성하게 된 것은 결코 제가 남들보다 C언어를 특출나게 잘하거나 남을 가르칠 실력이 있다고 생각하기 때문은 아닙니다. 다만 후배 한분한분이 C언어에 조금 더 친숙하게 다가갔으면 하는 작은 바람에서 작성하게 되었습니다.

 이 강의는 제가 처음 공부한 C언어 교재인 열혈강의 C프로그래밍과 A Book on C라는 학교에서 사용하던 교재를 가지고 작성하게 될 것입니다. 물론 제가 공부해온 노하우대로 작성이 될 것이지만 프로그래밍 언어라는 것이 처음할때에는 누구나 다들 어려움을 격게 되는지라 그저 따라 익히는 수 밖에 없는 것 같습니다. 여러분도 이 스터디와 또 과제실에 올라갈 과제들을 따라하며 자신의 C언어 스킬을 끌어올리길 바랍니다.

 이 강의는 프로그래밍 언어를 처음 배우는 것을 가정하고 작성되어 있습니다. 컴퓨터 공학과를 들어와 자신이 생각했던것과는 다른... 프로그래밍 언어를 보고 한숨을 쉬고 있을 후배님들께 이 강의가 작은 도움이 되었으면 좋겠습니다.

2008년 12월 24일
청음

이 블로그에 올라간 C언어 스터디의 모든 게시물은 그 권리가 청음에게 있음을 알려드립니다.
스크랩, 펌등을 금지하고 있사오니 유의해 주시기 바랍니다.
Posted by 청음


C 언어의 배열을 이용한 스택 구조


1. 스택 구조란?
스택 구조는 (First In Last Out)형식의 프로그램으로 데이터를 저장했다 출력할대 사용합니다.
[ ][ ][ ][ ][ ][ ][ ][ ][ ][ ]
10개의 칸이 있다고 할 때

1개의 데이터를 인풋해줄 때마다 앞에칸부터 데이터가 차 갑니다.
[a][ ][ ][ ][ ][ ][ ][ ][ ][ ] <- 빈 스택에 a를 입력한 후의 모습
[a][b][ ][ ][ ][ ][ ][ ][ ][ ] <- a가 입력된 스택에 b를 입력한 후의 모습
(a,b를 차례대로 입력할때의 스택이 차는 모습)

반면 1개의 데이터를 인풋해 줄 때에는 뒤에칸부터 데이터가 출력됩니다.
[a][ ][ ][ ][ ][ ][ ][ ][ ][ ] .... 출력 b <- a,b가 입력되 있던 스택을 1회 출력한 모습
[ ][ ][ ][ ][ ][ ][ ][ ][ ][ ] .... 출력 a <- a가 입력되어 있던 스택을 1회 출력한 모습
(a,b가 채워져 있는 스택을 차례대로 출력할때 스택이 비워지는 모습. 출력값은 b,a가 된다)

이러한 구조는 함수의 재귀호출에서 가장 마지막에 호출된 함수가
가장 먼저 처리되는 것과 매우 유사한 모습을 보입니다.


2. 과제
C언어와 배열을 이용하여 스택 구조를 만들어라.

제한 : 단 1개의 변수만을 전역 변수로 사용할 수 있음
         input은 char형 인자 하나를 변수로 받아 배열에 집어 넣어야함
         pop은 char형 인자 하나를 반환받아 화면에 출력해야 함.
         스택구조에 대한 책을 참조하지 않고 작성할것

힌트 : 함수는 main, input, pop 세개면 충분함
         첨부 파일을 보고 최대한 모방할것. (미리 작성해 놓은 것이라 윈도우 버전임)


3. 제출할 목록
 - c로짠 원본 소스
 - gcc로 코딩한 실행파일

4. 제출기한
 7월 6일 정오까지

5. 제출장소
 이메일 (sjm8824 네이버)
Posted by 청음
이전버튼 1 이전버튼