반응형


C++ 코드로 MySQL DB와 연동하여 일련의 작업을 하는 프로그램을 제작중에 있다.


테스트 하면 워낙에 해괴망측한 이유로 에러를 뿜어내며 프로그램이 죽어대지만 이번 오류는 좀 기록을 해놔야 다음에 까먹어도 찾아볼수 있을것 같아 기록해 둔다.


보통 String 타입으로 쿼리문을 작성하여 C++ 소스코드 안에 적용해놓고 그 String 문자열 대로 쿼리문을 적용하는게 가장 일반적이다.


오라클 과는 다르게 왠지 모르게 간편한 MySQL을 선호하는 편인데 작업 도중 아래와 같은 오류를 만나게 되었다.



Column: 'Column_Name' in where clause is ambiguous 


생전 처음 만나보는 에러라서 해결방법이 막막했는데 의외로 구글링 하네 쉽게 나왔다.


문제가 되던 컬럼이 어느 테이블의 컬럼이냐를 제대로 지정안해줬기 때문에 생겨난 아주 기초적인 실수였다...



예를 들어 id라는 컬럼이 있는데 이것이 Table A에도 존재하고 Table B에도 존재한다면


당연히 쿼리에는 A.id 라던가 B.id 라고 확실히 지정을 해줘야 한다.


그런데 나 같은 경우는 예를 들어 아래의 쿼리를 실행했다.




SELECT * FROM A,B WHERE id = 10




이렇게 되면 WHERE 뒤에 있는 id가 A에서 온 id인지 B에서 온 id 인지 정확히 알수가 없어 해당 에러를 내뿜게 되는 것이다.


정작 FROM 으로 A와 B 테이블 모두 불러와놓고 이런 기초적인 실수나 하다니....


요즘 일이 많고 야근하다보니 머리가 어떻게 된것 같다. 가끔은 머리 좀 쉬어가면서 해야겠다.

반응형

사실 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인데 준보스 만난 느낌?

 

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

 

 

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


+ Recent posts