반응형

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

 

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을 코드에 넣어서 짜는것이 아니라


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


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


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


그럼 다음에 봐요.


+ Recent posts