반응형

사실 C언어 포스팅 하려니 시간이 너무 오래걸리고 귀찮아서... 안쓴감은 있지만 오랜만에 다시 C언어책을 보니 강좌를 계속 이어가야 겠다는 생각이 들었습니다.

 

이번에는 이론적인 면을 짚고 넘어갈까 합니다. 여태까지 너무 실습 위주로 하다 보니 정작 중요한 C언어 내의 이론적인 면에는 너무 소홀하지 않았나 합니다.

 

앞으로 배워야할 조건문, 반복문, 구조체 등등... 을 알고 실습하기 위해서라도 이론이 탄탄해야 한다는 생각이 더욱 듭니다.

 

그래서 당분간은 이론적인 면에 치중할 계획입니다.

 

-------------------------------------------------------------------------------------------

 

이번 시간에는 변수와 자료형에 대해서 짚고 넘어가겠습니다.

 

제가 여태까지 글을 쓰면서 int라던지 float을 사용하였는데 이런것이 정확히 어떤것이며 무슨 역할을

하는지는 필수적으로 짚고 넘어가야 합니다.

 

그리고 잠시 언급했던 C언어에서 기초중의 기초 변수에 대해서도 당연히 짚고 넘어가야 합니다.

 

 

1) 변수란 무엇인가?

 

프로그램은 반드시 데이터를 저장할 공간이 필요합니다.

 

컴퓨터는 제가 계속 지겹도록 말하지만 정말 멍청한 도구라서 미리 정해놓은게 없으면 아무것도 할줄

아는게 없습니다.

 

그래서 변수를 통해 데이터를 저장하고 그 저장된 데이터를 가지고 이리저리 갖고 놀면서 원하는 것을 얻어내야 하는데요.

 

예를 들어 학생들의 평균을 구하고 싶습니다.

 

A라는 학생은 80점 / B라는 학생은 90점 / C라는 학생은 100점이라고 칩시다.

 

그럼 이 각각의 점수들은 어떻게 해야 할까요?

 

각각 변수에 저장을 해서 그것을 연산하여 평균을 내야 합니다.

 

변수를 빈 상자라고 생각하면 쉽습니다. 각각의 상자에 학생 한명의 점수를 각각 보관한다음 그걸 연산 하는 겁니다. 그래서 결과적으로는 90점이라는 결과가 도출됩니다.

 

 

간단하게 그림으로 설명하겠습니다. 위에 있는 그림을 보면 i라는 상자에 12라는 숫자가 담겨져 있습니다.

 

이것은 이름이 i라고 지정된 변수에 12라는 숫자가 담겨 있는 겁니다.

 

이렇듯 변수에는 데이터가 담기게 됩니다.

 

하지만 원래 데이터는 메모리에 담겨져야 합니다. 우리가 생각하는 램(RAM)이 그 메모리입니다.

 

그래서 램의 용량이 클수록 버벅임이 덜하고 부드러워지는 것도 이런 이유입니다. 램의 용량이 크면

 

데이터를 담을 공간이 커짐으로써 처리하기가 한결 편해지는 것입니다.


하지만 메모리에 직접 데이터를 저장하는 것은 매우 불편합니다.

 

메모리에는 각 구역마다 주소가 존재 하게 되는데 만약 직접 데이터를 거기다가 저장하려고 하면

 

예를 들어 "300번지에 정수 30을 저장하라"와 같이 주소를 직접 지정해줘서 데이터를 저장해줘야 하는데 주소값이 매우 복잡하고 접근하는것이 변수를 이용하는것보다 간단하지가 않습니다.

 

하지만 C언어에서는 변수를 통해서 데이터를 변수에다가 넣으면 변수가 알아서 자동으로 메모리 주소에 배치되기 때문에 훗날 '포인터'를 사용하는 경우를 제외하고는 메모리 주소에 직접 접근할 필요가 없습니다.

 

- 메모리 안의 주소 0~4번지에 데이터를 직접 저장하는 경우 -



2) 변수와 상수(Variable and Constant)

 

제가 이전 강의 때 언급했었습니다. 변수라는 것은 변하는 숫자입니다.

 

변수는 예를 들어 13이라는 숫자를 저장했다 해도 때에따라 얼마든지 10이나 100등 다른 값으로 변경이 손쉽게 가능합니다.

 

예를 든다면 원의 면적을 구할때 원의 반지름은 때에 따라 변하기 때문에 원의 반지름을 변수로 둘수 있습니다.

 

상수는 변하지 못하는 숫자입니다. 프로그램이 실행되는 동안에는 값이 절대 변경되지가 않으며 프로그램이 끝나고 사용자가 임의로 숫자를 바꾸어 줘야 변경이 가능한 것이 상수입니다.

 

원의 면적을 구하는것을 예를 든다면 원주율은 절대불변의 숫자입니다. 3.141592.... 이죠.

 

원주율은 절대 변하지 않습니다. 그렇기 때문에 이런 숫자는 상수로 두면 됩니다.

 

상수는 변수가 아니기 때문에 따로 둘 필요 없이 비주얼 스튜디오 내에서 그냥 숫자만 적으면 됩니다.

 

원의 면적을 구하는 프로그램 코드를 직접 보여 드리며 설명을 할게요.

 

 

 

 


위의 코드는 원의 반지름을 입력하여 원의 면적을 구하는 프로그램의 예시입니다.

 

radius와 area는 변수로 지정되어 있습니다. 이것은 각각 반지름과 면적의 값을 저장하는데 쓰이구요.


원의 반지름을 float(소수점형)으로 두어 소수점 이하로도 값을 표현할수 있게 하였습니다.


그리고 area는 area = 3.14 * radius * radius 로 되어있는데 이것은 원의 면적 구하는 공식인


원의 면적 = 반지름 * 반지름 * π 를 이용한 겁니다.


scanf는 입력을 받는 함수인데요. &radius를 통해 변수 radius에 값을 입력하는 것입니다.


그래서 scanf를 통해 입력받은 radius 값을 밑의 area 공식의 radius에 넣는겁니다.


여기서 3.14는 상수입니다. 누가봐도 프로그램 실행되는 동안에는 숫자가 딱히 변할수가 없어 보이네요.


이렇듯 상수와 변수는 각각 쓰임새가 다릅니다. 적당한 변수와 상수의 활용은 프로그램 코드를 좀 더 효율적으로 만들어줍니다.


상수도 마찬가지로 메모리에 저장이 되며 다만 변경이 안된다고 일종의 태그가 붙어있는것 뿐입니다.


3) 자료형


자료형이라는 것도 이전에 살짝 언급을 했습니다. 자료형은 데이터의 종류를 지정해주는 것입니다.


데이터의 종류는 무궁무진 합니다.


8과 같은 정수도 있을 것이고 3.14592 같은 소수도 있을 것이며 A라는 문자도 있을 것이며 심지어 "Hello, World!" 라는 문자열도 있습니다.


하지만 문제점은 데이터가 종류마다 저장하는데 필요한 메모리 공간이 전부 다르다는 것입니다.


컴활이나 워드프로세서를 공부하셨던 분이라면 영어는 1byte, 한글은 2byte 라는것 정도는 아실겁니다.


그리고 단순히 생각해봐도 8이라는 숫자와 3.14592라는 숫자를 각각 저장하는데 필요한 공간이 다를겁니다.


왜냐하면 당연히 3.14592라는 숫자가 더 길기 때문에 더 큰공간이 필요할것이기 때문입니다.


그렇지만 메모리의 양은 한정되어 있습니다. 여러분들의 컴퓨터들은 일반적으로 램의 용량이 4GB나 8GB 정도 됩니다.


예를 들어 큰 공간을 할당한다음에 고작 1이라는 숫자를 저장한다고 하면 메모리 공간의 낭비가 매우 심각합니다.


그래서 메모리 공간을 효율적으로 사용하여 타이트하게 조여주는 것이 필요한데 이것이 바로 우리가 흔히 알고 있는 "최적화" 입니다.


최적화가 잘된 게임은 낮은 사양의 컴퓨터에서도 부드럽게 잘 돌아갈수 있겠지만 최적화가 제대로 안된 게임 흔히 말하는 발적화가 된 게임들은 높은 사양의 컴퓨터에서도 버벅이는 현상이 발생할것입니다.


흔히 우리가 물건을 정리할때 상자의 크기를 작은것부터 큰것까지 나누어서 물건을 담아내는것과 비슷하다고 생각하면 됩니다.


만약 물건을 크기가 작은데 우체국 택배 박스 가장 큰곳에다가 집어넣는다면 공간 낭비이며


물건의 크기가 큰데 우체국 택배 박스 가장 작은곳에다가 집어넣으려면 안들어갑니다.


C언어에서도 저장되는 데이터 크기에 따라 메모리 필요량이 달라지는데 이런 것 때문에 다양한 자료형이라는 것이 존재하게 됩니다.


즉 정수만을 담당하는 자료형, 실수만을 담당하는 자료형 등 적절한 자료형을 통해 메모리를 절약하고 실행속도를 빠르게 할수 있습니다.


자료형을 간단히 표현하자면 데이터의 종류라고 표현할수 있습니다.

변수는 특정한 자료형으로 생성되는데 예를 들면 int box 라는 변수를 지정할때 box는 변수 이름 int는 자료형입니다.


int는 정수만을 저장하게 하는 자료형입니다. 그렇기 때문에 int box에는 데이터가 오로지 정수여야만 합니다.


즉 int box = 1 은 제대로된 표현이지만 int box = 3.14 는 올바르지 못한 표현입니다.


자료형은 종류가 다양한데 크게 정수형 / 문자형 / 부동소수점 형으로 나눌수 있습니다.

 

정수형에는 정수 / 문자형에는 하나의 문자 / 부동소수점형은 실수 타입의 데이터를 저장합니다.


 

위의 그림이 결국 이번 파트의 핵심입니다.

 

저 표를 보시면 short, int, long 등 자료형이 있으며 각각의 역할 그리고 공간, 숫자 범위가 있습니다.

 

예를 들어 int 라는 자료형을 설명하겠습니다.

 

int는 정수형이며 메모리의 공간을 4byte를 할당합니다.

 

예를 들어 램의 용량이 8기가 바이트라 치면 8기가 바이트는 어림잡아 86억바이트이기 때문에

 

86억바이트 중에서 int는 4바이트를 할당받는 겁니다.

 

그리고 int는 숫자를 무한대로 표현할수가 없습니다. 약 -21억 ~ +21억의 숫자 정도를 표현할수 있는데

 

이것은 메모리 공간 4바이트가 이정도 밖에 표현을 못하기 때문입니다.

 

만약 더 큰 숫자를 표현하고 싶다면 자료형 double을 쓰면 거의 무한대의 숫자를 표현할수 있습니다.

 

 

 

하지만 저렇게만 봐서 못미더운 분들이 계실 겁니다. 정말 int가 4바이트 맞는건가? 라고 한다면 자료형의 크기를 프로그램으로 알아보는

방법이 있습니다.

 

함수 sizeof를 이용하면 됩니다. sizeof는 변수나 자료형의 크기를 바이트 단위로 변환시킵니다.

 

예를 들어 x라는 변수의 크기를 알고 싶다면 sizeof(x)

 

double의 크기를 알고 싶다면 sizeof(double)

 

이라 쓰면 됩니다.

 

그럼 그 크기를 한번 출력해보겠습니다.

 

 


정말 간단하죠? 이렇게 써서 표현해보니 int 자료형인 변수 x는 int형이니 크기가 당연히 4바이트며

 

int형은 4바이트니까 4 / double 형은 8바이트니까 8이라고 숫자를 띄워주네요.

 

 

-------------------------------------------------------------------------------------------

 

이것으로 변수와 자료형 첫번째 파트를 마치겠습니다.

 

되도록 쉽게 풀어 쓰려 했는데 쉬웠는지 잘 모르겠네요.

 

제가 쓴 글로 많은 도움이 되길 바랍니다.

 

혹여나 이 부분에 대해 이해안가는 것이 있다면 덧글로 달아주세요.

 

이것으로 포스팅 마치겠습니다. 


반응형

안녕하세요. C언어 오랜만의 포스팅입니다. 

 

본가에 돌아가긴 했었지만 좀 바빠서 포스팅을 못했었는데요.

 

포스팅을 안한지 오래됐더니 순번에서 밀렸나... 블로그가 죽어가고 있더라구요

 

내가 어떻게 살린 블로그인데... ㅠㅠ

 

가만히 두고볼수도 없는 일이고 그래서 이번에는 책은 없지만 입력기능에 관해 간단히 알아보고

 

그것을 이용하여 프로그램을 만들어 볼 계획입니다.

 

누구나 쉽게 C언어에 다가기 위한 목적으로 하는 포스팅인만큼 '전문 용어'를 최대한 배제시켜서

 

작성하도록 하겠습니다.

 

------------------------------------------------------------------------------------------

 

여러분은 이전까지 프로그램을 제작해왔습니다.

 

단순히 출력을 하는 프로그램과 '변수'를 지정하여 출력을 시켜주는 프로그램 제작 입니다.

 

그렇지만 굉장히 심심하지 않으신가요?

 

프로그램이라는건 역시 키보드로 내가 원하는 걸 입력해서 엔터를 딱 치면 원하는 결과값이 나오는

 

그 맛 아닌가요?

 

그래서 이번에는 어쩌면 C언어의 재미를 높일수 있는 입력기능을 이용하여 프로그램을 제작해보도록

 

하겠습니다.

 

우리가 만들 프로그램은 이것입니다!

 

 

 

뭔가 기대가 되지 않나요?

 

이렇게 무언가를 입력 함으로써 원하는 결과값을 얻을수 있는 방법에 대해 알아 보고자 합니다.

 

출력만 하다가 갑자기 내 손으로 입력을 해야 하는 과정을 만들어 줘야 하니 많이 번거로울것 같나요?

 

걱정하지 마세요. 생각보다 코드는 굉장히 간단합니다.

 

그 코드 아래에 공개를 하겠습니다

 

 

생각보다 많이 간단하죠?

 

개념 자체는 그렇게 새로운 것이 많이 없습니다만 역시 코드 해석을 한번 해야 할것 같습니다.

 

 

1. 입출력 프로그램의 코드를 분석 해보자.

 

 

여러분은 이전에 printf의 개념을 배우셨고 변수를 이용한 프로그램 제작도 해보았습니다.

 

처음듣는 내용이고 잘 모르겠다구요? 저런... 그렇다면 이걸 말고 제가 썼던 이전의 글을

 

한번씩 차근히 읽어보시고 오시기 바랍니다.

 

코드 자체는 생소하지 않습니다.

 

무언가 내용이 많아진것 같지만 결국에는 printf가 많이 쓰인것 뿐입니다.

 

printf는 여러분들에게 충분한 설명을 하였습니다. 출력 하는데 필수 함수라고 하였습니다.

 

그럼 입력을 담당하는 코드는 어디있을까요?

 

코드를 보시면 생소한 함수가 하나 있는것을 보실수 있습니다.

 

scanf 라는 함수인데요.

 

scan이라는 말은 무슨 의미인가요? 우리가 흔히 쓰는 스캐너(Scanner)와 유사한 의미입니다.

 

scan이라는 의미 자체가 훑어보다, 조사하다 뭐 이런 뜻이 있지만요.

 

컴퓨터 용어에서는 Scan이라는 의미는 컴퓨터에 데이터를 넣는 걸로 대충 보시면 되요.

 

즉 scanf는 (Scan Fuction)의 줄임말로써 함수를 스캔한다고 보시면 됩니다.

 

printf의 말 의미도 아시겠나요? printf는 Print Fuction으로 함수를 출력한다는 의미가 되죠.

 

이렇듯 함수의 이름도 대충 지어진것이 아닌 의미가 있습니다.

 

입력을 하는데에 scanf라는 함수만 쓰인다고 장담을 할수 없습니다만

 

적어도 키보드로 데이터를 입력하는데는 scanf가 굉장히 많이 쓰입니다.

 

int a,b 를 통해서 a와 b라는 변수를 선언했구요.

 

printf를 통해 "두수를 입력하시오 : "라는 문구까지 썼습니다.

 

그 말 바로 뒤에 커서가 깜빡이게 되는데 원래는 여기서 끝이지만 scanf 함수를 바로 다음줄에

 

이어서 작성하게 되면 입력까지 할수 있는 기능이 추가가 되는 겁니다.

 

scanf("%d %d",&a,&b) 라는 의미는

 

첫번째로 입력하는 숫자는 변수 a에 담으라는 뜻이고 두번째로 입력하는 숫자는 변수 b에 담으라는 뜻입니다.

 

그런데 왜 %d가 쓰였을까요?

 

제가 썼던 글 04.변수를 이용한~ 의 글을 보시면

 

형식 제어 문자열이 있는데 거기서 %d는 무조건 정수만을 받을수 있습니다.

 

그래서 숫자입니다. 그럼 만약에 정수가 아닌 다른 값 예를 들어 문자를 입력하면 어떻게 될까요?

 

그럼 알수 없는 이상한 값을 컴퓨터는 출력하게 되는데 이것을 우리는 '쓰레기 값' 이라 부릅니다.

 

이 쓰레기 값에 관한 중요한 말이자 명언이 있는데

 

GIGO 라고 (Garbage In, Garbage Out)이라는 말인데 쓰레기 값을 넣으면 쓰레기값이 나온다.

 

라는 말입니다.

 

너무나 당연한 말이지만 컴퓨터가 융통성이 정말 없다는걸 잘 보여주는 말이기도 합니다.

 

쓰레기 값 넣으면 쓰레기 값 밖에 나오지 않습니다.

 

우리는 %d를 이용해서 숫자를 입력하기로 약속해놨는데 거기에 문자를 넣으려 했으니

 

컴퓨터 입장에서 문자는 단지 하나의 '쓰레기 값'일 뿐입니다. 그러니 형식제어 문자열

 

잘 지켜서 입력해주시길 바랍니다.

 

이러면 이번에 설명해야 할 내용은 끝이 났습니다.

 

더이상 새로운 것이 없습니다.

 

우리는 scanf 함수를 이용해서 &a, &b 를 넣어줌으로써 변수 a와 b에 숫자(데이터)를 넣어

줬구요.

 

그 a와 b를 받은 컴퓨터는 다음 printf 여러줄에서 시키는 명령을 수행 하는 겁니다.

 

예를 들어 a에 30 이라는 숫자 b에 50이라는 숫자를 받았습니다.

 

그래서 컴퓨터는 메모리 한공간에 a=30, b=50 이라는 값을 저장해놓고 있었는데요.

 

printf("덧셈 결과는 : %d \n",a+b); <ㅡ 이 명령어를 통해 a와 b를 더한 값을 출력을 시켰습니다.

 

그래서 덧셈 결과값이 80이 나오게 되는 거고 위의 gif 스샷 결과대로 나오는 겁니다.

 

%d는 형식제어문자열 \n는 출력 글자를 다음줄로 넘기는 기능인거는 저번 시간에 알려드렸습니다.

 

이것을 이용해서 a-b, a*b , a%b, a/b 등등 여러 산술 연산을 수행하였고

 

우리는 순식간에 사칙연산 계산기를 만들어 낸 것입니다!

 

이것으로 코드 해석은 끝이 납니다.

 

간단히 정리 하자면

 

1) scanf 함수를 이용하여 입력 기능을 수행 할수 있다


2) 변수를 지정하고 scanf 함수내에 &a,&b와 같이 지정해준다


3) 뒤에 그 저장받은 값을 이용한 연산을 출력 시키기 위한 printf 구문을 작성한다

 

이렇게 됩니다.

 

당연한 말이지만 변수와  scanf 안의 지정변수는 똑같아야 한다는건 알겠죠?

 

변수가 a,b로 지정했는데 scanf 안에서는 &c,&d 같이 다른 변수를 지정하면 오류 납니다.

 

 

2. 입출력 기능을 하는 프로그램 코드 내의 숨겨진 C언어 규칙 

 

코드를 다시 한번 잘 보시면 scanf 함수에서 %d와 %d 사이에 스페이스바 한칸 띄운것을 보실수 있습니다.

 

왜 굳이 번거롭게 이렇게 했을까요?

 

사실 안 띄워도 됩니다만 보기 좋게 만들기 위한 목적도 있습니다.

 

위의 gif 파일을 보면 저는 30을 쓰고 띄운다음 50을 썼습니다.

 

이제 감이 오시나요? %d와 %d 사이에 스페이스바를 띄워놨으니

 

입력값도 숫자 띄우고 숫자를 입력해야 하는겁니다.

 

그렇다면 %d%d 처럼 붙여놓으면 어떻게 될까요?

 

3050 이렇게 써야 하는데 컴퓨터가 구분을 할까요? 누누히 말했지만 컴퓨터는 굉장히 멍청합니다.

 

당연히 이걸 구분해줄리가 없습니다.

 

그래서 30을 쓰고 바로 엔터를 친다음 50을 입력해야 합니다.

 

 

이렇게 결과가 나오는데 이게 보기가 좋나요? 취향 차이겠지만 열에 아홉은 이게 보기가 안좋다고

할겁니다.

 

코딩을 잘 해서 원하는 프로그램을 뚝딱 만드는 것도 중요하지만 보기 좋게 만드는 기술도 필요합니다.

 

여러분들이라도 당연히 보기 좋은 프로그램을 쓰고 싶지 않겠나요?

 

이런 세심한 주의도 기울여주시면 좋을것 같습니다.

 

 

 

이것으로 입출력을 이용한 프로그램 제작 과정을 모두 마쳐보도록 하겠습니다.

 

코드 내용은 좀 길었지만 사실 새로운 내용이 scanf 말고는 없어서 설명할것이 없었던게 사실입니다.

 

이렇듯 점점 배워나가면 써먹었던것에 살을 붙이는 형식이다 보니 익히는데 속도가 붙으리라

 

생각이 드네요.

 

혹시나 애매하거나 모르는 내용이 있으면 덧글로 달아주세요. 확인 후 답변 하도록 하겠습니다.

 

 

다음 시간에는 뭘 해야 할지 고민입니다. 실습을 이만큼 했으니 이제 이론을 해볼까 합니다.


제가 중간중간에 약간 야매(?) 형식으로 C언어 규칙들을 알려주었습니다만 이렇게 하면


수박 겉핥기 식이기도 하고... 산술기호나 형식등등을 해볼까 합니다.

 

그 뒤에는 C언어를 포함한 모든 프로그래밍 언어의 꽃이라 불리는 반복문에 대해 이야기를

해보도록 하겠습니다.

 

그럼 다음시간에 뵙도록 하겠습니다, 끝!


반응형

안녕하세요. 오랜만의 포스팅입니다.

 

C언어 강좌 포스팅을 하면서 참 걱정을 많이 했습니다. 저보다 훨씬 더 잘아시는 분이 이 내용 맞지도

않고 이런걸 강좌라고 내놓냐! 라는 비판의 글이나 설명 드럽게 못한다 라는 말이 나올까봐

 

걱정 참 많이 했는데 생각보다 많은 분들이 좋게 봐주셔서 저도 기쁠 따름입니다 ^^

 

그래서 이번에는 좀 더 심화된 내용을 가지고 이번 포스팅을 다룰까 합니다.

 

 

우리 이전에 배웠던 내용으로 C언어로 화면에 글자 출력하기를 배웠습니다!

 

이제 여러분은 C언어 코드 작성을 하실줄 아는 분이 되신거에요. 이제 부터는 특별한 내용이 있기

보다는 알고리즘! 알고리즘에 따른 좀더 화려한 내용을 다루는 것일 뿐입니다.

 

알고리즘이라 하면 일종의 어떠한 문제를 해결하기 위한 방법을 컴퓨터에게 제시하는 과정!

 

이라고 생각하시면 편합니다. ㅎㅎ 예를 들어 1+2 =3 이다라는걸 컴퓨터 한테 가르쳐 주기 위해서

 

알고리즘을 짜야 하는거죠. 결국 원하는 결과를 도출하기 위해 작성하는 그 중간과정이


모두 알고리즘이 된다는 겁니다.

 

그래서 우리는 덧셈 뺄셈 등등 사칙연산 결과를 출력하는 프로그램을 짜볼겁니다.

 

모두들 비주얼 스튜디오 2010 켜주시고 셋팅 다 해주세요.

 

 

 

연산 프로그램을 한번 제작해보도록 합시다.

 

 

이런 프로그램을 한번 작성해볼거에요.

 

예? 너무 쉬운거 아니냐구요?

 

저번에 출력에 관해 배웠으니 printf 3줄 쓰면 될텐데 뭐 그리 어렵게 하냐구요?

 

저런... 그렇게 쉬울것 같으면 포스팅 안올리죠 ㅎㅎㅎ 저 그렇게 날로 먹는 사람 아닙니다

 

결론적으로 printf에 기대서는 안된다는 겁니다!

 

작성해 보라고 하면 배운것도 없는데 뭐 어떡하라고! 가 될테니 저번 시간처럼 정답을 공개하고

 

한번 그 소스코드를 분석 해볼게요

 

정답은....

 

 

 

바로 이겁니다. printf 쓴것은 똑같은데 뭔가 이질적인게 느껴지나요?

 

x , y, sum은 대체 뭐지? 라고 느끼실 겁니다.

 

지금 부터 분석 하도록 하겠습니다.

 

 

 

1. 덧셈 해주는 프로그램 소스 코드 분석을 해보자

 

예전에 제가 #include <stdio.h>와 int main(void)에 대해서 설명을 다 했습니다.

 

그러니 이편에는 넘어가구요.

 

우리는 int x, int y, int sum에 대해 주목할 필요가 있습니다!

 

이런 문장들을 변수를 정의하는 문장이라 합니다. 변수?

 

변수란 프로그램이 사용하는 데이터를 일시적으로 저장할 목적으로 사용하는 메모리 공간입니다.

 

왠 뜬금없이 메모리 공간이냐구요?

 

모든 프로그램들의 데이터는 일시적으로 메모리에 저장이 됩니다. 메모리에 저장이 되서

 

그걸 CPU가 꺼내가서 처리하는 구조 입니다.

 

CPU <ㅡ 메모리 <ㅡ 프로그램, 데이터

 

 순서로 되는겁니다.

 

모든 프로그램은 제어장치인 CPU의 통제를 받게 됩니다. CPU가 데이터를 받아서 처리하고 연산을

 

하는 구조로 이루어집니다.

 

그런데 갑자기 많은 양의 데이터를 CPU한테 몰아서 주면 CPU가 일을 처리할수 있을까요?

 

사람의 예로 들죠. 아무리 일을 잘하는 사람이라도 책상 앞에 갑자기 엄청나게 많은 서류를

 

던져주며 결재 하라고 하면 사람이 할수 있을까요? 진이 빠져서 못할겁니다.

 

그렇다면 이 많은 서류를 한번에 처리하지는 못하니까 어디에 보관해뒀다가 자신이 처리할수 있는

 

만큼만 꺼내서 처리한다면 좀더 효율적이겠죠?

 

여기서 사람 = CPU , 보관할 장소 = 메모리 , 서류 = 데이터 라고 생각하시면 편합니다. 

 

메모리 공간이 바로 변수 입니다.

 

메모리 공간 중에 한 부분을 떼어내서 그 부분을 x라고 지정합니다.

 

이것이 바로 int x 즉 변수 선언이죠.

 

그리고 x 앞에 int는 자료형으로써 나중에 설명을 드리고 그 전에 3편에서 설명을 드렸지만

 

int는 정수형의 데이터만 받겠다는 겁니다. 즉 분수나 소수가 아닌 정수로만 받겠다는 겁니다.

 

그렇기 때문에 만약 int x; 라고 변수를 할당 했을때 그 데이터를 100.3 이런 식으로


할당하면 오류가 납니다.


왜냐하면 정수가 아니고 소수니까요.


이렇듯 자료형의 선언은 정말 중요합니다.

 

누차 말하지만 컴퓨터는 정말 멍청한 도구입니다. 밥 떠서 입안에 안넣어주면 모를 놈이죠.

 

이제 변수에 대해 알았고

 

저 코드를 해석하면 우리는 변수 x,y,sum을 선언했습니다.

 

변수를 선언했는데 내용이 비었죠?

 

변수를 선언해놓고 안에 내용을 넣어주지 않으면 마치 빈 박스와 같이 아무역할도 하지

 

않습니다.

 

그래서 변수 안에다가 데이터를 넣어야죠.

 

마치 상자안에다가 물건을 넣는것 처럼 말이죠.

 

그래서 위의 코드를 보면 x라는 변수에 데이터 100, y라는 변수에 데이터 100을 넣었습니다.

 

sum 이라는 변수는 x와 y의 합을 저장하는 데이터를 넣은겁니다.

 

우리가 이렇게 변수를 선언하는 것은 데이터의 변경을 자유롭게 하기 위해서입니다.

 

솔직히 말해서 x y 대신에 100이라는 숫자를 넣어줘도 됩니다.

 

그렇지만 그렇게 하면 sum은 어떻게 해야 하나요?

 

숫자 변경 할때마다 sum의 내용도 변경해야 하는 불편함이 생기는 겁니다.

 

그런데 전부 변수로 선언하고 sum을 그의 합으로 하면

 

예를 들어 x에 100대신에 200을 넣으면

 

sum은 자동으로 x+y 니까 200+100이 되서 300이라는 값으로 변경이 됩니다.

 

이건 나중에 복잡한 프로그램을 만들때도 매우 유용하기 때문에 왠만해서

 

변수로 설정하는 버릇을 길들여야 합니다.

 

아! 그리고 변수 대신에 100이나 200같이 고정된 숫자를 상수 라고 부릅니다.

 

상수가 아주 안쓰이는건 아니고 상수도 필요할때가 있습니다.

 

변수와 상수는 서로 반대되는 말이니 꼭 기억해두세요.

 

이제 int x 같은 변수 선언도 끝이났고

 

x=100, y=100 이 부분을 설명해야 하는데 위에 설명을 거의 다했으니

 

간단하게 설명을 하겠습니다.

 

x=100 이라는 부분은 수학적으로 생각하면

 

x는 100이다! 라고 생각합니다.

 

그렇지만 컴퓨터 언어로 생각하면 좀 달리 생각해야 합니다.

 

x는 100이다 가 아니고 100을 x에다 대입합니다. 라고 생각하셔야 해요.

 

무슨 말장난 하냐구요? 그렇지만 이것도 잘 구분해두셔야 나중에 헷갈리지 않습니다.

 

제가 왜 이걸 강조하는지 나중에 가시면 알게 됩니다. 꼭 기억하세요.

 

이제 마지막으로

 

printf("x의 값은 %d...... ", x,y,sum);

 

이부분을 해석해야 합니다.

 

이것은 변수 값을 출력해주는 겁니다. printf는 앞서 설명했다시피 출력을 해주는 함수입니다.

 

변수의 값을 띄워도 printf를 안 해주면 화면에 절대 뜨지 않습니다.

 

변수값을 출력 할때는

 

printf(형식 제어 문자열, 변수);

로 이루어져 있는데요.

 

%d가 중요합니다. %d를 출력하라는 의미가 아니고 출력 형식을 지정한다는 의미입니다.

 

즉, 변수의 값이 %d의 위치에서 정수형으로 출력된다는 것입니다.

 

이런것을 형식 지정자라고 부르는데 표로 종류를 나열 하자면 다음과 같습니다.

 

 %d

 정수 형태로 출력    ex) 100

 %f

 실수 형태로 출력    ex) 3.1411

 %c

 문자 형태로 출력    ex) B

 %s

 문자열 형태로 출력 ex) Hello

 

 

우리는 100이라는 숫자를 출력하고 그의 합도 마찬가지로 200인 정수이기 때문에

 

%d를 사용하여 출력을 해주는 것입니다.

 

만약 출력해줄 값이 3.14112 같은 실수(정수를 제외한 나머지 숫자)라면?

 

%f를 써야 합니다. 만약에 %f가 아닌 %d를 사용할 경우 어떻게 될까요?

 

그럼 컴퓨터가 소수점 뒤를 인식을 못해서 3 이라는 정수만 출력합니다.

 

어마어마한 오류가 나는거죠.

 

그렇다면 만약 정수를 썼는데 %c 같이 문자 지정자를 쓴다면?

 

이건 아스키코드라고 있는데 너무 헷갈리니 좀 더 심화되면 다룰 문제입니다.

 

외울게 너무 많죠? 걱정하긴 이릅니다. 앞으로 외울건 더 많습니다.

 

컴퓨터 언어 하나를 익히는데도 굉장한 노력이 들고 저또한 C언어를 완벽하게

 

마스터 했다고 장담을 못합니다.

 

그래서 회사에서는 컴퓨터 언어를 하나라도 제대로 익히는 사람을 굉장히

 

선호하며 찾는다고 합니다.

 

그렇지만 그 하나의 언어도 자유자재로 다루는 사람이 우리나라에는 드문게 현실입니다.

 

여튼 여기까지 이야기 하고

 

코드를 보면 printf 안에 "%d"가 세개가 있고 뒤에 ,(콜론)을 사용하여 변수를 3개 나열했습니다.

 

그러니 이걸 해석하면

 

첫번째 %d에는 x를


두번째 %d에는 y를


세번째 %d에는 sum의 변수 값을 대입해서 대신 출력시키는 겁니다.

 

 

여기까지 하면 코드의 해석은 모두 끝이났습니다.

 

여태까지 해석한것을 요약하자면

 

1) 변수 x,y,sum을 선언한다


2) 그 변수에 각각의 데이터를 집어넣는다(100,100,x+y)


3) printf를 통해 출력을 한다


4) 출력하는 방식은 형식지정자를 선언하여 %d 로써 출력한다.

 

 

 

입니다. 이해가 가시나요?

 

이해가 가신다면 저야 더할나위 없이 좋죠

 

이해가 가지 않으신다면 댓글로 달아주시면 제가 성심성의껏 답변을 하겠습니다. 

 

 

2. 덧셈을 해주는 프로그램 코드 내의 숨겨진 C언어 규칙 

 

이 코드내에서도 C언어의 규칙은 엄연히 존재합니다. 

 

그것은 

 

 1) 변수의 선언은 항상 함수 내에서 가장 먼저 해줘야 한다는 점

 

2) return 0;가 안들어 있다는 점입니다.

 

그 중에 가장 중요한것은 변수의 선언 위치입니다.

 

제가 01. C언어의 개론 편에서 설명했지만

 

C언어는 절차지향적 언어입니다.

 

즉 순서에 따라서 코드를 실행한다는 것인데요.

 

이 말은 첫번째 줄부터 순차적으로 읽어가면서 해석한다는 것입니다.

 

그런데 만약에 변수를 선언하는 것이 첫번째로 하지 않고 뒤에 선언을 한다?

 

그렇게 되면 오류가 납니다.

 

예를들어

 

x= 100;

y= 100;


int x,y;

 

같이 순서를 뒤집어서 코드를 짰다고 가정합시다.

 

C언어는 항상

 

 

이렇게 가장 위에서 아래로 순서대로 코드를 읽어 나가는데

 

x라는 변수가 없는데 x =100 이라고 먼저 선언을 해버리니

 

컴퓨터는 "x라는 변수가 없는데!! 100이라는 데이터를 어떻게 x에다 담으라는거야!!"

 

라고 오류를 뿜어냅니다.

 

이것은 마치 박스도 없는데 물건을 어디다가 담으려고 하는 짓거리와

 

똑같다는 겁니다.

 

그래서 C언어는 항상 절차를 중요시 하는바 변수 선언 같이 가장 먼저 해줘야 하는것은

 

가장 처음에 작성을 해야 합니다.

 

이점 꼭 명심해 두시고

 

 

return 0;를 안쓴것에 대해 말씀드리겠습니다.

 

이전 03 편 강좌에서 return 0를 쓴다는 것은 운영체제(윈도우 os)에게 컴퓨터가 별 이상없이

 

종료했습니다. 라고 신호를 보내는 일종의 규칙이라고 했습니다.

 

그렇지만 return 0;를 안써도 실행이 되는 경우가 있습니다.

 

지금의 코드와같이 버그가 전혀 없고 너무 완벽하면 굳이 return 0를 통해 반환을 안해줘도

 

실행 자체는 무리 없이 잘 되고 문제가 없습니다.

 

물론 여러분은 return 0;를 꼭 써주세요.

 

사실 쓰는걸 깜빡했습니다

 

죄송합니다.... 그렇지만 이런 경우도 있다는것 기억하시고 return 0는 꼭 써주세요!!!

 

 

이상으로 4번째 강좌를 모두 마치겠습니다.

 

지금까지 출력에 관한 C언어의 내용에 대해 배워봤습니다.

 

그렇지만 이렇게 출력만 하고 내가 뭐 건드리는거 하나도 없으니까 심심하시죠?

 

예, 그래서 다음 강좌는 입력에 대해서 다뤄보겠습니다.

 

그러니까 처음부터 100을 코드에 넣어서 짜는것이 아니라


여러분에 프로그램에서 직접 키보드로 무언가를 쳐서 결과를 뽑아내는


진정한 프로그램 다운 프로그램을 만들어보겠다는 겁니다.


이제부터 슬슬 헷갈리고 어려울 겁니다. 앞으로도 잘 따라와주시면 너무 감사하겠습니다.


그럼 다음에 봐요.


반응형

지난 시간에 이어 C언어를 이용한 간단한 프로그램 제작 쭉 이어 나가겠습니다. 

 

 

그 전에 저번 시간에 배웠던것을 한번 떠올려 봅시다.

 

 이전 시간에 C언어를 컴퓨터로 해석해주는 컴파일러인 '비주얼 스튜디오 시리즈'의 설치방법

에 대해 배웠습니다.

 

또한 C언어로 프로그램을 작성하기 위한 비주얼 스튜디오 2010 셋팅도 다 끝이 났습니다.

 

이제 우리는 C언어를 이용해 프로그램만 짜면 되는 것입니다.

 

가장 간단한 프로그램으로 C언어에서 빠질수 없는 '글자 화면 출력' 프로그램을 제작해보겠습니다.

 

이 후부터 C언어 간단강좌에서는 오로지 '비주얼 스튜디오 2010' 으로만 진행을 합니다.

 

그 외의 다른 버전으로 인한 호환성 문제, 프로그램 상호간 충돌문제에 관해서는 답변을 해드리기가

 

어렵습니다.

 

 

 

1. Hello, World! 프로그램 제작

 

우리는 가장 첫번째의 프로그램으로 ' Hello World!' 단어를 출력할 도스 프로그램을 제작합니다.

 

C언어를 배운다면 전통적으로 가장 처음으로 작성하는 프로그램이 되었습니다.

 

이유는 저도 잘 모르겠습니다 ^^;; 저도 대학교 들어와서 처음으로 출력했던것이

 

'Hello, World!' 였습니다. 처음에는 우와 신기하다고 했죠

 

단어를 출력할 도스프로그램을 제작한다니 감이 안잡히시나요? 바로 아래와 같이 만들 예정입니다.

 

 

 


이제 감이 잡히시나요?

 

자, 이제 한번 제작해보세요. 라고 하면 처음 C언어를 겪는분들은 엄청 당황할수 밖에 없겠죠?

 

그래서 일단 정답부터 공개하고 시작하겠습니다.

 


 

바로 위와 같이 코드를 작성하고 Ctrl + F5키를 누르게 되고 '이 프로젝트는 만료되었습니다' 라는 ㅁ

말을 상큼하게 무시하고 예를 눌러주면  도스창에 글자가 출력됩니다.

 

어떤가요? 원리가 이해가 되나요? 뭔가 알듯 하지만 살짝 아리송한가요?

 

그렇다면 저와 같이 저 소스 코드를 분석해보도록 합시다.

 

 

2. 'Hello, World!' 소스 코드 분석하기

 

가장 첫줄에 보이는

 

#include <stdio.h>

 

이 한 줄, 정말 중요합니다. C언어의 특징이기도 하며 절대 빼먹어서는 안되는 것인데

 

#으로 시작하는 문장, 이런것들을 ' 전처리기(preprocessor)' 라고 부릅니다.

 

간단하게 해석하면 미리 무언가를 처리한다는 것입니다.

 

#include 라는것은 include가 ~을 포함하다라는 뜻을 가지고 있으니

 

일단 어떤것을 포함하는것을 처리하라!! 라고 생각하시면 무방합니다.

 

그렇다면 위의  문장의 뜻은 무엇일까요?

 

해석하면 <stdio.h>를 먼저 포함시켜라

 

가 될것입니다.

 

여기서 stdio.h 같이 확장자가 .h로 이루어지는 파일을 헤더 파일(header file)이라 부릅니다.

 

헤더 파일은 컴파일러가 필요로 하는 정보를 가지고 있습니다.

 

그럼 왜 쓸데없이 stdio.h라는 헤더파일을 포함시키라고 하는 것일까요?

 

그것은 밑에 있는 printf 때문입니다.

 

여기서 좀 더 쉽게 알아가려면 함수(function)이라는 것을 알아야 합니다.

 

함수는  "특정한 작업을 수행하는 코드의 집합" 이라고 할수 있습니다.

 

우리는 지금 글자를 화면에 출력하는 프로그램을 제작합니다.

 

그럼 출력하는 작업을 수행하는 코드가 필요하겠죠?

 

그것을 바로 함수가 한다는 것입니다.  함수가 있어야 작업을 지시할수 있습니다.

 

int main(void)

{

 

 // 작업을 지시하는 문장

 

}

 

위의 문장은 실제로 main() 함수를 정의 하는 문장이 됩니다.

 

main()이라는 함수를 만들어 놓고 그 안에

 

출력의 기능을 수행하는 printf() 함수를 넣음으로써

 

main 함수는 출력의 기능을 수행하는 함수가 되었습니다.

 

이해가 좀 안되신다구요?

 

예를 들어 설명하겠습니다.

 

 

main() 이라는 빈 박스가 있다고 가정 합시다.

 

하지만 여기에 아무것도 들어있지 않기 때문에 그냥 빈 박스 일뿐입니다.

 

여기에 화장품을 넣으면 화장품 박스가 되는 것이고, 노트북을 넣으면 노트북 박스가 됩니다.

 

이렇듯 main() 함수에 아무것도 넣지 않으면 그냥 main 함수 그 자체 입니다.

 

그렇지만 그곳에 printf() 라는 출력을 수행하는 기능이 있는 함수를 넣었기 때문에 main 함수는

 출력의 기능을 수행하는 함수가 되었습니다.

 

 

그럼 처음으로 돌아와서 왜 printf() 때문에 #include <stdio.h>를 써야 하는가 하면

 

stdio.h 라는 헤더파일 안에 printf() 함수가 쓰여져 있기 때문입니다.

 

사실 헤더파일 내에 들어있는 함수들 대부분을 우리는 '라이브러리 함수' 라고 부릅니다.

 

마치 도서관에서 필요한 책 꺼내서 읽듯이 헤더파일 내에 필요한 함수를 꺼내 쓰는겁니다.

 

 

단, printf() 라는 라이브러리 함수는 오로지 stdio.h 헤더파일에만 있기 때문에 stdio.h 헤더파일을

 

포함시켜주는 #include <stdio.h>를 써줘야 하는겁니다.

 

C언어는 결국 문법도 중요하지만 얼마나 많은 함수들을 알고 있으며, 또 함수를 써먹을줄 아느냐에

따라서 C언어의 실력이 결정나는것이라 생각합니다.

 

결국 이것도 언어입니다! 여러분은 언어 배울때 외우는것 하나 없이 언어 배우나요.

 

C언어도 조금씩의 암기는 필요합니다.

 

 

 

조금씩 헷갈리지 않습니까? 자꾸 보면서 반복학습 하는것 외에는 방법이 없습니다.

 

 

그럼 중간 체크를 좀 하겠습니다.

 

우리가 알게 된 것 까지 소스코드를 분석 하자면

 

stdio.h 라는 헤더파일을 포함시키기 위해 #include 전처리기를 씁니다. 왜??

 

바로 글자 출력을 담당해주는 printf() 라는 라이브러리 함수를 사용하기 위해서입니다.

 

printf() 함수에서 괄호 안에 쌍따옴표를 찍고 원하는 문장을 쓰면

 

printf 함수의 기능덕분에 그 문장을 그대로! 화면에 출력해줍니다.

 

출력은 프린터로 종이 뽑는것만이 출력이 아닙니다.

 

모니터에 글자를 띄우는것도 출력입니다.

 

 

 

 

이게 끝입니다.

 

뭔가 길게 쭉쭉 썼지만 요약하면 이게 다에요.

 

이제 우리에게 남은 것은

 

int main(void)

{

 

}

 

이 부분과 return 0; 뿐입니다.

 

사실 main()이라는 함수는 C언어 내에서의 하나의 커다란 약속입니다. 마치 진리와 같은 것이죠.

 

main() 함수는 무조건 C 프로그램(프로젝트) 내에서 무조건 존재해야 하는데 단 한개만

 

있어야 합니다.

 

그 이유는 main() 함수가 함수의 시작과 끝을 담당하기 때문입니다.

 

 

지금도 어려워 죽겠는데 갑자기 이게 왠 짖는 소리냐구요?

 

말 그대로입니다.

 

모든 명령의 처리는 main() 함수내에서 이루어지며, main() 함수에서 시작해서 끝이납니다.

 

그렇기 때문에 main() 함수는 C언어 프로그램에서 하나의 기준점입니다.

 

이게 없으면 C 프로그램이 완성이 안된거나 마찬가지입니다.

 

 

 

여기까지 main() 함수의 역할을 알아봤고 int main(void)를 분석해봅시다.

 

 

 

 

int는 반환 자료형 이라는 의미로 int는 '정수' 즉 소수가 아닌 정수 그거 입니다.

 

자료형의 종류에 대해서는 나중에 따로 또 올려놓겠습니다.

 

반환 한다는 말은 컴퓨터한테 반환한다는 의미가 됩니다.

 

컴퓨터한테 정수를 반환한다? 근데 왜 하필 숫자를 반환하죠? 이거에 대해서는

 

후에 설명할 return 0; 와 매우 관계가 깊습니다.

 

main는 함수의 이름입니다.

 

함수의 이름이기 때문에 정해진것 없이 여러분들이 자유롭게 함수의 이름을 지정하면 됩니다.

 

예를 들어 나는 함수를 새로 만들것인데 그것이 두수를 저장하는 그런 함수가 될거다.

 

라고 가정하면 int add(void) 라고 써주셔도 되고 여튼 함수의 이름이란건 정해진 틀이 없이 자유롭게

 

지어주시되 몇가지 규칙만 지켜주시면 됩니다.

 

1. 함수의 첫글자가 숫자나 특수문자로 시작되면 안됨

 

2. 띄어쓰기 허가 안됨

 

3. 특수문자는 언더바 ( _ ) 만 허용된다.

 

더 예를 들어

 

2ad 안됩니다. add and sub 이건 띄어쓰기 있으니 안됩니다. ad&d 특수문자 안됩니다.

 

그렇지만 ad_d 이건 허가가 됩니다. 특수문자는 언더바만 허용되기 때문입니다.

 

(void)는 입력 타입입니다.

 

void 의 영어 뜻 자체가 비어있다. 라는 뜻이 됩니다. 그러니 입력을 아무것도 안받겠다 라는 의미

가 되겠습니다.

 

int main(void)는 아무것도 입력을 받지 않고 출력은 정수로 하겠다. 라는 의미입니다.

 

그렇다면 입력을 받는다는건 어떤것일까요?

 

지금부터 그걸 알기에는 너무 복잡합니다. 나중을 기약하고 다음으로 넘어가겠습니다.

 

자 이쯤 되면 int main(void)의 해석은 거의 끝이났습니다.

 

그럼 마지막으로 return 0;만 해석하면 됩니다.

 

return 0 .... 0을 돌려줘라 이뜻이죠?

 

아까전에 int 설명할때 누구한테 반환한다고 했나요? 컴퓨터한테 반환한다고 했죠?

 

마찬가지로 0이라는 숫자를 컴퓨터한테 돌려줍니다. 이건 뭘 의미하는 걸까요?

 

0이라는 의미 자체가 컴퓨터, 여기서는 프로그램을 실행시켜주는 윈도우 같은 존재를

 

말할겁니다.

 

어쨌든 윈도우에게 프로그램이 정상적으로 종료했다! 라고 알리는 겁니다.

 

한마디로 윈도우와 프로그램만의 신호이죠.

 

이렇게

 

#include <stdio.h>

 

int main(void)

{

printf("Hello World!");

return 0;

}

 

의 해석은 모두 끝이납니다.

 

간단하게 정리하면

 

출력을 담당하는 printf 함수를 써야 하는데 그 함수는 stdio.h 헤더파일에 있으니 include 라는 전처리기 명령어를 통해 헤더파일 불러와라.

 

그 다음 우리는 컴퓨터한테 정상적으로 종료했다는것을 알려줘야 하니 0을 줘야 한다.

 

0은 정수이기 때문에 함수는 int(정수)형이다.

 

라고 원리가 돌아가게 됩니다.

 

이것을 완전히 이해하셨다면 C언어를 익히는데 별다른 어려움이 없을 겁니다.

 

이해를 못하셨다면... 계속 해서 읽어보시고 그래도 안되면 책 한권 참고 하시는것도 나쁘지 않습니다.

 

 

 

3. "Hello World!" 소스 코드 안에 숨겨진 규칙 찾기

 

C언어도 하나의 언어이기 때문에 문법같이 규칙이 존재합니다.

 

이것은 간단하게 정리만 하겠습니다.

 

1. #이 붙은 전처리기는 무조건 가장 첫줄에 시작

 

2. 문장이 하나 끝나면 반드시 뒤에 세미콜론 (;)을 필수적으로 붙여야 한다

 

3. main 함수 뒤에는 세미콜론을 붙이면 안된다. 전처리기도 붙이면 안된다.

 

4. 함수의 시작과 끝은 중괄호{} 로 알려야 한다.

 

 

이것이 규칙입니다.

 

이중에 가장 중요한것은 2번입니다.

 

2번은 무조건 필수입니다. 이것은 비단 C언어만이 아닌 JAVA,C#,C++ 등 프로그래밍 언어라면

 

거의 공통적으로 다 안고 가는 규칙입니다.

 

그럼 ;을 붙이지 않으면 어떤 문제가 발생할까요?

 

컴퓨터는 세미콜론을 붙이지 않으면

 

int main(void)

{ printf("hello,world!")return 0}

 

이렇게 보게 됩니다. 그래서 컴퓨터는 "응? 이게 무슨 말이야? 난 모르겠다. 오류 뿜는다!"

 

이렇게 되는 겁니다.

 

세미콜론은 문장이 끝이나면 다음줄로 넘길때 컴퓨터가 인식하게 해주는 코드 같은것입니다.

 

세미콜론을 뒤에 붙여줘야

 

int main(void)

{printf("hello,world!")

 return 0

}

 

라고 이해를 합니다. 이제서야 " 아... 헬로 월드 출력하고 종료 잘했다고 알리라는군..."

 

하고 인식하는 겁니다.

 

컴퓨터는 생각보다 굉장히 멍청한 도구 입니다. 컴퓨터는 만능이 아니기 때문에

 

인간이 명령을 내릴때도 융통성 하나 없게 일일이 밥숟가락 떠서 먹여주다시피 다 해줘야 합니다.

 

그러니 이런 사소한 규칙 꼭 기억하시기 바랍니다.

 

 

 

 

여기 까지 해서 Hello world! 출력하기 편을 모두 마쳐봤습니다.

 

솔직히 지금 hello world 안에서 설명 못한 c언어만의 문법이라든가 규칙이 너무너무 많아서

 

아쉬울 따름입니다.

 

하지만 그것을 다 설명하게 되면 글도 너무 길어져서 가독성도 딸리고 지루할뿐 아니라

 

복잡해지기만 합니다. 마치 레벨 5인데 준보스 만난 느낌?

 

아직 설명할건 많습니다. 앞으로 천천히 이해하기 쉽도록 설명하기 위해 노력하겠습니다.

 

 

제 성의없는 강좌 봐주셔서 감사합니다.


반응형



안녕하세요. 저번에 약속드렸던 대로 C언어를 이용하여 프로그램을 만드는 시간을

 

가져보기 위해 간단한 강좌 하나 올리도록 하겠습니다.

 

앞전에 C언어의 역사와 특징 등을 알아봤습니다.


이번에는 실제로 C언어를 이용해서 프로그램을 만들어봐야겠죠?


그렇다면 C언어를 프로그램으로 만들려면 어떻게 해야 할까요?


C언어를 쓰면 되나요? 그럼 어디에다 쓰죠? 그 C언어를 그냥 쓴다고 컴퓨터가 알아먹나요?


앞전에 제가 C언어는 고급언어로써 컴퓨터는 이걸 못 알아먹는다고 했습니다.


그럼 컴퓨터가 알아먹기위해서는 뭐가 필요했나요? 잘 생각해보세요.







예 그렇습니다. 컴파일러(Compiler)가 필요했습니다!


컴파일러가 고급언어인 C를 저급언어인 기계어로 번역해서 컴퓨터에게 명령을 전달하죠.


그렇다면 우린 컴파일러가 필요합니다.


가장 대표적인 컴파일러는 바로 '비주얼 스튜디오(Visual Studio) 시리즈'가 되겠습니다!


앞으로 우리는 가장 지겹게 보게 될 이 비주얼 스튜디오와 친해질 필요가 있습니다.






비주얼 스튜디오는 C언어 뿐만이 아니라 C++과 C#을 이용한 프로그램을 제작하는데도 


유용한 아니 거의 필수로 쓰여질 프로그램이기 때문에 무조건 적으로 사용해주셔야 합니다.


마치 스프레드시트? 라고 하면 바로 엑셀이 떠오르는것 처럼 말입니다.



그럼 비주얼 스튜디오를 다운부터 받아야 되겠죠?



-  비주얼 스튜디오 설치 과정 - 



원래 비주얼 스튜디오는 공짜로 제공되는 프로그램이 아닙니다.


단, 학생의 경우에만 학생 계정(대학교 계정)을 이용해서 인증을 받은 뒤, 교육용 프로그램을

무료로 받을수 있습니다.


교육용이라고 기능이 떨어지는것이 아닌 오리지널 그대로이기 때문에 걱정은 ㄴㄴ



1. 마이크로소프트 드림스파크에 들어갑니다. (http://www.dreamspark.com/)



2. 드림스파크에서 학생용 DreamsPark를 보시고 제품다운로드 상세한정보를 클릭해주세요



 

3. 개발자 및 디자이너 도구에서 스크롤을 당겨서 'Visual Studio 2010 Professional Edition'

   을 클릭 하세요



 

 

 

4. 누르시면 인증받기와 다운로드가 있는데 다운로드는 클릭이 안됩니다. 따라서 인증받기 클릭!

 

 

5. 학교 계정을 이용해서 만드셔야 하는데 없으면 계정만들기를 통해 새로 만드시면 됩니다.

 

   계정이 있으면 로그인을 하시면 됩니다.

 

 

6. 로그인을 하게 되면 인증받기라는 버튼은 사라지고 다운로드 버튼만 뜨게 됩니다.

 

 

7. 다운로드 버튼을 누르게 되면 

 

 

이와 같은 화면이 뜨는데 다운로드를 모두 받아주셔야 합니다.

 

저 절차를 잘 따라주세요.

 

가장 먼저 SDM 설치 파일을 다운로드 하셔서 실행하시고 설치하세요

 

그다음 .SDX 파일을 다운받으시는데 만약 파일이 이상하거나 실행이 안된다 하시면

 

확장자가 이상한 경우이니 확장자를 .SDX로 바꾸어 주셔서 실행하시면 됩니다.

 

 

 

8. .SDX 파일을 실행하시면 

 

 

 

위와 같은 창이 하나 뜨게 되는데 어려울거 하나도 없죠? 저같은 경우는 다 받았기 때문에 저러는거고

 

그냥 다운로드 받아주시면 되요.

 

 

9. 다운을 받게 되면 이 파일이 .iso로 가상이미지로 만들어진것이기 때문에 이것을 풀어줄 프로그램

 

즉, 데몬 툴즈가 필요합니다.

 

 

10. 데몬툴즈는 네이버에서 검색하셔서 다운받으시구요.

 

11. 데몬툴즈를 실행하셔서 다운받았던 비주얼스튜디오 .iso 파일을 마운트 해주시면 됩니다.

 

 

12. 그 뒤부터는 다음 다음을 눌러가면서 쭉쭉 설치과정 진행하시면 설치가 완료 됩니다.

 

혹여나 이 과정 중 모르는것이 있다 하시면 댓글로 달아주시면 답변해드리겠습니다.

 

 

 

- 비주얼 스튜디오 실행 및 셋팅 -

 

이제 여러분은 비주얼 스튜디오를 설치까지 완료 하셨습니다.

 

여러분은 엄연히 정품 비주얼스튜디오를 설치하신것이기 때문에 추후에 사후관리는 걱정안하셔도

 

되구요. 

 

처음에 비주얼 스튜디오 2010을 실행하시면(2010 버전 기준으로 이제부터 설명해 나갑니다.)

 

 

 

이와 같은 첫화면이 뜨는데 뭔지도 하나도 모르겠고... 참 난감하죠? 

 

다음과 같은 순서를 따라와주시면 됩니다.

 

위의 메뉴에서 파일(F) - 새로 만들기(N) - 프로젝트(P) 눌러주세요

 

그럼 

 

이와 같은 창이 뜨게 되는데요.

 

설치된 템플릿에서 Visual C++을 클릭해주시고 Win32 콘솔 응용 프로그램 눌러줍시다!!



그다음 밑에 이름란 보이시나요? 솔루션 이름 말고 이름(N) 입니다!


거기에 자신이 쓰고 싶은거 아무거나 쓰세요. 저는 음... 그냥 name이라고 해볼게요.


이름 정말 아무거나 쓰셔도 되요.


win32 콘솔 응용 프로그램이 클릭 되고 이름 까지 입력했으면 확인 버튼 눌러줍시다.


다음 버튼 누르시고


콘솔 응용 프로그램에 버튼이 와있는지 확인하시고 반드시 추가옵션에


'빈 프로젝트' 체크 활성화 해주세요.




위와 같이 되어있어야 합니다!! 


이렇게 해서 마침을 누르시면 




그냥 아무것도 없이 빈공간만이....


뭐 어쩌라는 거야? 라고 생각이 드시죠? 너무 성급하네요. 잠깐만 기다려주세요.


이제 왼쪽에 솔루션 탐색기가 보이시나요? 거기서 소스파일 폴더 보이시나요?


거기에 마우스 우클릭 해주시고 추가(D) - 새 항목(W) 클릭~


지금부터는 말로만 설명할게요.


아까전과 패턴이 똑같습니다.


새항목 클릭하시면 C++ 파일(.cpp)가 있습니다. 그걸 클릭하시고


이름을 입력해주시는데 반드시 이름은 자유롭게 지어주시되 끝에     .c


라고 확장자 같이 붙여주셔야 되요. 즉 나는 이름을 name이라 짓고 싶은데 

 

그렇다면 이름을 name.c 라고 해야 하죠.

 

이건 필수입니다!! 반드시 빼먹으시면 안되요. 왜 그런지 지금부터 설명해드리죠.

 

여러분은 지금 C언어를 배우고 있습니다. 

 

그런데 아까 새항목 클릭하시고 뭘 찍으셨죠? 예! C++ 파일을 찍으셨습니다.

 

여기서 .c를 안붙이고 그냥 넘어가게 되면 비주얼 스튜디오는

 

아~ 얘는 지금 C언어가 아니라 C++ 프로그램을 만들려고 하는구나!


하고 생각하게 되어 C++ 구조로 가버립니다.


그러니 반드시 C언어는 끝에 .C를 붙여주셔야 합니다.


이렇게 하시고 확인 눌러주시면



이렇게 무언가를 적을 공간이 완성이 됐습니다

 

여러분은 클래스를 만드셨고 소스코드를 적을 소스파일도 만드셨습니다.

 

이건 나중에 설명을 할게요.

 

C언어로 프로그램을 제작하기 위한 과정의 80%는 끝낸것이나 마찬가지입니다.

 

여기서 이제 C언어 문법에 따른 코드만 써주시고 실행을 해주시면 프로그램 제작은 끝이 납니다.

 

그렇다면 이제 프로그램을 제작해볼까요?

 

하지만 지금 시간이 너무 늦었고... 내용이 너무 길면 지저분해 보이니까 나눠서 적을까 합니다

 

죄송합니다 ㅎㅎㅎ 너무 질질 끌어서...

 

하지만 앞으로 써야 할 내용이 이것과 맞먹을 정도로 길다보니까 따로 나누는게 가독성에도

 

좋다고 생각해서 다음에 2탄으로 찾아 뵙겠습니다!

 

자 그럼 여기까지 배우신것을 한번 복습하고 정리 해보는 시간 갖도록 하겠습니다.

 

 

1. 비주얼 스튜디오라는 컴파일러로 C, C++ , C#을 이용한 프로그램 제작이 가능하다


2. 마소 드림스파크라는 곳에서 정품으로 비주얼스튜디오 다운로드가 가능하다


3. 비주얼스튜디오 실행부터 C언어 소스를 입력하기 위한 창 생성 과정은 다음과 같다


파일 - 새로만들기 - 프로젝트 - Visual C++ 클릭 & Win 32 콘솔 응용프로그램 클릭 - 

 

이름 입력 - 확인 - 콘솔 응용 프로그램 & 빈 프로젝트 클릭 - 솔루션 탐색기에서

 

소스 파일 폴더 마우스 우클릭 - 추가 - 새항목 클릭 - C++ 파일(.cpp) 클릭 -

 

이름 입력하되 끝에 반드시 .c 붙여주기 - 확인

 

 

 

우리가 배운것은 이 세가지 입니다. 잘 기억해주시고 다음 시간에는 자신이 원하는 글자를


간단하게 도스창으로 띄우는 프로그램 제작에 대해 배워보겠습니다.


그럼 다음 시간에 봐요 

반응형

안녕하세요.  

 

프로그래밍 관련 첫 포스팅 올려봐요.

 

C언어라면 프로그래머라면 누구든지 거쳐가야하는 기초 중의 기초인 컴퓨터 언어입니다.

 

이 C언어가 없었다면 이렇게 컴퓨터로 편리하게 무엇이든 할수 있는 날은 아마 오지 않았으리라

생각이 듭니다.

 

그렇다면 C언어 강의 들어가기 전에 간단히 역사에 대해 짚고 넘어갈까 합니다.

 

 


 

 

C언어는 1970년대 초반, UNIX 운영체제를 위해서 AT&T의 벨 연구소에서 일하던

 

데니스 리치(Dennis Richie)에 의하여 처음 만들어 졌습니다.

 

데니스 리치는 C언어 제작의 공로로 Turing 상을 수상하기도 했습니다.

 

Turing상 이라는건 간단히 말해서 컴퓨터 쪽의 노벨상이라고 생각하시면 편합니다. 

 

데니스 리치는 2011년에 세상을 타계 하였는데, 스티브 잡스도 2011년에 세상을 떠났죠.

 

그런데 사람들이 데니스 리치의 죽음에 대해서는 알아주는 이가 많이 없어서 좀 개인적으로

 

안타깝다는 생각이 들었습니다.

 

지금의 컴퓨터 언어는 거의 C언어를 기반으로 나온 언어들이 많으며

 

현재 유명한 OS 중에서 C언어가 조금이라도 안들어있는 OS는 없다고 보면 됩니다.

 

 



IOS나 안드로이드도 결국 뿌리를 찾아가면 C언어에 도달하게 되죠.

 

이렇듯 기원을 찾아가면 거의 C언어에서 다 시작하기 때문에 C언어는 '컴퓨터공학' 계열 학생이라면 무조건 들어야 하고 당연히 다 알고 있어야 하는 프로그래밍 언어입니다.

 

그렇다면 이런 C언어의 특징은 무엇이 있을까요?

 

1. C언어는 간결하다

 

C언어의 표기법은 간결한것이 특징입니다. 어렵게 풀어쓰는 것이 아닌 규칙에 의한 문단으로 기능을 구현할수 있습니다.

 

2. C언어는 효율적이다.

 

C로 작성 되면 프로그램이 상대적으로 가볍습니다. 그래서 실행속도도 빠르며 메모리도 효과적으로 사용할수 있습니다.

 

C언어는 고급언어이자 저급언어의 특성을 동시에 갖추는 언어입니다.

 

고급언어와 저급언어의 특성은 뒤에 설명하겠습니다.

 

효율성이 어셈블리 언어 수준에 근접합니다.(어셈블리 언어와 대등한 효율성을 갖지는 않습니다.)

 

3. C언어는 이식성이 뛰어나다

 

C언어는 이미 많은 종류의 하드웨어에서 많이 사용되고 있습니다.

 

그래서 어느 하드웨어로도 쉽게 바로 이식이 가능합니다.

 

어떤 CPU에서 C로 개발된 프로그램이 다른 CPU에서도 이식이 충분히 가능합니다.

 

4. C언어는 절차지향적인 언어이다.

 

프로그래밍 언어는 크게 '절차지향적 언어'와 '객체지향적 언어' 이렇게 두 부류로 나뉘기도 합니다.

 

그중에 C언어는 절차지향적인 언어입니다.

 

절차지향적이라는것은 절차에 따라서 프로그램이 실행되는 것으로 정해진 순서가 있어야 합니다.

 

그렇기 때문에 객체지향적 언어보다는 배우기가 다소 까다롭다는 단점이 있긴 하지만

 

C언어가 워낙에 자주 쓰이다보니 익숙함으로 인해 난이도가 점점 낮아지긴 합니다.

 

5. C언어에 익숙해지면 다른언어를 배우기가 상대적으로 쉬워진다

 

어쩌면 당연합니다. C++, C#, JAVA 등 거의 대부분의 프로그래밍 언어가 C를 기반으로 둡니다.

 

C를 배우면 규칙이 비슷한 경우가 많아서 배우기에 더 수월합니다.

 

마치 영어를 마스터 하면 유럽의 언어들을 배우기가 상대적으로 수월하다는 점과 비슷합니다.

 

 

 

 

 

 

 

 

 

그 외에 특징들이 많습니다만 C언어의 가장 큰 특징은 이정도입니다.

 

그리고 고급언어(High Level Language)와 저급언어(Low Level Language)의 차이점에 대해

서술해보도록 하겠습니다.

 

가장 먼저 유념해주셔야 할것은 고급언어와 저급언어는 번역으로 인해서 생긴 말이지

고급언어라고 저급언어보다 더 좋은것은 아닙니다.

 

고급언어와 저급언어는 각각 장단점이 있습니다.

 

고급언어 - 사람이 이해하기 쉬운 프로그래밍 언어

 

저급언어 - 컴퓨터가 이해하기 쉬운 언어

 

가장 두드러지는 특징은 위와 같습니다.

 

 

컴퓨터 구조는 이진법으로 되어있기 때문에 0과 1만 알아 먹을수 있습니다.

 

그렇지만 이것을 사람이 보면 눈알이 빠지죠;;

 

0과 1의 형태로 이루어진 이진수 형태의 언어를 우리는 기계어(machine language)라고 부릅니다.

 

기계어로 프로그램을 짤 경우 하드웨어의 성능을 가장 효율적으로 뽑아낼수 있다는 장점이 있습니다만

사람한테는 너무너무 불편한 언어이기 때문에 사람이 좀더 편리하고 쉽게 지시를 내리기 위해서

만들어지는 언어들이 고급언어라고 불립니다.

 

고급언어에는 C를 포함한 JAVA, C# 등이 있구요.

 

저급언어에는 가장 대표적으로 기계어와 어셈블리어가 있습니다.

 

고급언어는 사람이 알아먹기 쉽지만 컴퓨터가 알아먹을수가 없는 언어이기 때문에 중간에

 

컴파일러(Complier)라는 사람으로 따지면 일종의 번역가역할을 하는 프로그램이 고급언어를

기계어로 바꾸어 줍니다.

 

이렇듯 저급언어와 고급언어에는 각각 장단점이 존재하기 때문에

 

프로그래머 분들 중에 저급언어와 고급언어를 적절히 혼합하여 사용하시는 분들도 있습니다.

 

포스팅은 이것으로 마치겠구요.

 

다음에는 본격적으로 C언어를 이용하여 프로그램을 제작해보겠습니다 !

 

 

 

 

+ Recent posts