c언어 공부를 나도코딩의 책으로 시작하였다. 우선 비쥬얼스튜디오를 설치하고 d2font를 다운 받아 적용시키고 테스트겸 hello world한번 찍어보고 본격적으로 경찰조서만들기 예제를 들어갔다. 모든 프로그래밍 언어가 그러하듯이 시작은 변수 그리고 입출력에 관한 것이다.
변수란 무엇일까? 내가 감히 정의를 내려보자면 변수란 값을 넣어주는 것이다. 상수는 값을 넣어주되 변하지 않을 값을 넣어주는 것이다. 왜 값을 굳이 이름을 붙여 넣어줘야 할까? 컴퓨터가 일을 할때 데이터는 메모리에 저장된다. 고로
데이터를 입력하려면 우선 메모리를 불러와서 그 메모리에다가 저장을 해야 한다.
이 과정이 변수선언이다.
변수를 선언하면 그 변수명으로 된 어떤 메모리에 그 값이 들어간다.
그리고 또 하나 데이터를 출력하려면 메모리로부터 데이터를 꺼내야 한다.
"근데 어떤 메모리에 있는지 어떻게 알아?"
그래서 이름을 붙여준것이다.
" 내가 이름 붙여준 그 메모리에 그 데이터 있으니까 가져와.... "
이렇게 cpu에다가 찾기 쉽도록 지시를 내려준 샘이다.
이렇게 보면 변수라는 개념이 이해가 잘 된다.
변수와 함께 자연스럽게 입력과 출력이란 개념도 언급하였다.
다음으로 고려해야 할 것은 변수에 넣어주는 값의 종류들이다.
변수에 들어가는 데이터의 종류는 숫자, 문자, 참거짓 등이 있다.
그 숫자도 정수, 실수로 나뉘고
그 문자도 문자, 문자열로 나뉜다.
따라서 종류가 다른 만큼 각각 다르게 넣어줘야 한다.
변수선언시
문자는 char(다만 문자열의 경우엔 대괄호를 하고 그 안에 얼마만큼의 공간을 사용하는 문자열인지 기입해야 한다. 가령 [256]이라 한다면 256개의 문자변수 즉 256자의 공간을 쓴다고 말해주는 것으로 알아들었다.
정수는 int
실수는 double or float
상수는 앞에다가 const하나 추가해주면 된다.
이제 진짜 입력과 출력에 관한 함수를 언급하겠다.
입력은 scanf_s("%d", &age) 또는 scanf_s("%s",name,sizeof(name)) 이다. 문자열이냐 문자열이 아니냐에 따라 전자로 적을지 후자로 적을지 결정된다.
출력은 printf("%d\n",age)또는 printf("%s\n",name)또는 printf("%.2f\n",height) 또는 printf("%.2lf\n".weight)
이렇게 쓴다.
여기서 궁금해 할수 있는 것이
앞에 붙은 %d이런거 일것이다.
이런것을 서식지정자라고 한다. 서식지정자란 컴퓨터에게 데이터를 어찌 해석할지 알려주는 역할을 하기 위해 기입해주는 것이다.
예를 들면 %d라면
"컴퓨터야 이건 정수로 해석하렴....."
이렇게 친절히 알려주는 샘이다.
데이터의 종류에 따라 %뒤엔 다른 것들이 올 수 있다.
그리고 그 뒤에 붙은 \n 이것은 무엇일까?
이건 사실 필수는 아닌 것이다.
줄바꿈을 위해 입력한 것인데 이걸 안해주면
예를 들면
이름
생년월일
국적
이렇게 나올 것이
이름생년월일국적
이렇게 나온다.
전자는 줄바꿈을 한것이고
후자는 하지 않은 것이다.
뭐가 더 가독성이 좋은가?
그래서
"컴퓨터야 뒤에 나오는 변수는 정수로 해석하되 줄바꿔서 한 줄씩 출력시켜주길 바래."
라고 지시하는 것이다.
마지막으로 언급하고 싶은 키워드가 있다.
바로 주석
주석은 코드는 아니지만 내가 쓴 코드에 대한 설명을 넣고 싶거나 어떤 코드를 무효로 하고 싶을 때 쓰는 것이다.
코드덩어리를 무효화하고 싶으면 \n~~n\이렇게 해줌 되고
코드에 대한 설명을 넣고 싶으면 코드 옆에다가 \\하고 설명을 쓰면 된다.
이런 주석을 써줘야 다른 사람이 내 코드 보고 한결 이해가 편해진다.
c언어 파일을 만들고 처음으로 친 건 이거였다.
#include <stdio.h>
일단 치라고 해서 쳤다. 근데 뭔지 몰랐다.
알아보니 이건 전처리기 지시문이란다.
프로그래밍언어는 하이레벨 언어와 로우레벨 언어가 있고 그 사이에 어셈블리어가 있는 것으로 배웠다.
하에레벨은 인간이 사용하는 언어와 유사하고
로우레벨은 기계의 2진수 언어에 가깝다.
그 사이 어셈블리는 그 중간?인듯 하다.
어쨌건 c언어가 처음 탄생하게 된 역사적 기원을 거슬러 올라가 보면 1972년 unix란 운영체제를 만드신 분께서 이 운영체제에 뭐라 뭐라 지시를 하고 싶은데 어셈블리어로 하니까 좀 인간입장에서 불편해서 인간에게 더 편한 직관적인 방식으로 만든 언어가 바로 c언어라고 한다. 써보니까 좋았고 이후 입소문이 나서 결국 지금의 위상에 이르게 되었다. 물론 지금은 파이썬 같은 더 직관적인 문법의 언어들도 있지만 당시에 c언어는 파이썬만큼 혁신적이고 좋은 언어였다고 한다.
어쨌거나 인간의 언어를 기계에게 입력하려면 즉 인간과 기계가 언어가 다르다면 그 두 존재사이에는 당연히 통역이 필요하다. 이 통역사가 바로 컴파일러라는 것이다. c언어를 비롯해 프로그래밍언어엔 컴파일러라는 것이 있다.
#include란 이 컴파일러라는 통역사에게
"컴파일러야 이 파일 통역해서 컴퓨터가 알아 먹게 해줘....."
하는 샘이다.
<stdio.h>는 뭐냐?
이건 약간 라이브러리? 같은 개념이다. 전에 파이썬을 잠깐 찍먹했을 때 파이썬에 내장된 기존 파이썬 함수들의 집합 즉 python standard library가 있고 그 안에 외부에서 import하지 않아도 자체적으로 쓸수 있는 함수들이 있다는 것을 배웠다.
이것도 그런샘이다.? 맞나? c언어에서 자체적으로 쓸 수 있는 함수들의 집합 중에서 입력과 출력에 관해 함수를 쓰겠다고 그 함수가 포함된 파일을 추가한 것이다. 근데 듣기로는 c언어는 파이썬에 비해 라이브러리가 많이 발달하지 않아서 가져다가 쓸 수 있는 함수기능들이 많이 적다고 들었는데.......
끝으로 하면서 입출력함수가 좀 헷갈려서 오류를 냈다.
보면 printf("%.2f\n",height) 이런 부분이 있는데
이걸 입력함수에다가 써서 문제가 일어났다.
즉 scanf_s("%.2f", &age) 뭐 이런 식으로 쓴 거다.
%.2f 요거는 출력할 때 소수같은 경우 "소수점 몇째자리까지 출력해줘......."하는 건데
그걸 입력에다가 넣었다. 위에 경우처럼 .2f하면 소수점 두번째자리까지 보여줘 세번째자리부턴 반올림ㄱㄱ 이다.double이나 float은 소수이기에 이런 것도 출력할 때 이런 것도 붙여줘야 한다.
scanf_s("%d", &age) 또는 scanf_s("%s",name,sizeof(name))
요건
"컴퓨터야 이건 정수로 입력을 받을거야. 그리고 이 변수의 메모리주소는 내가 이름을 age라고 이미 붙여놨걸랑... 그니까 키보드로 값을 입력받으면 일로 넣으면 되는겨..... 오키?"
"컴퓨터야 이건 문자열로 입력을 받을거고 이건 내가 name이라고 이름 붙인 메모리주소에다가 넣어주면 되는디 그 앞서서 내가 딱 이 변수가 사용할 사이즈를 정해놨으니께 이 사이즈 안에서만 문자들을 받아주면 되는 겨....."
printf("%d\n",age)또는 printf("%s\n",name)또는 printf("%.2f\n",height) 또는 printf("%.2lf\n".weight)
요건
"컴퓨터야 이건 소수 그러니까 3.14 뭐 이런 거 비스무리 한거로 뽑을거고 소수점 둘째자리까지만 뽑아줘.... 아 글고 줄바꿈 안하면 옆에 다닥다닥 붙어서 나오는 데 그럼 보기 별로 안좋으니 줄바꿈해서 뽑아줘... 아 글고 이 변수를 뽑아주면 되는 거임...."