C++ 에서 정수 연산을 해보면 프로그래밍에 더 쉽게 적응할 수 있을 것이다.
기본적인 사칙연산 프로그램을 만들어 본다.
#include <iostream>
using namespace std;
int main()
{
cout << 3 + 5 << endl;
cout << 5 - 3 << endl;
cout << 2 * 7 << endl;
cout << 6 / 2 << endl;
return 0;
}
<< 와 << 안에 있는 수식은 표현식으로 연산한 값을 Console에 출력한다.
endl; 은 콜솔창의 다음줄의 첫번째 위치로 커서를 이동한다.
프로그래밍 언어의 수식은 일반의 수학책과는 표기법이 다르다.
+ 와 - 는 덧셈과 뺄셈으로 이것은 수학식과 같다.
* 은 곱셈의 표시다. x 가 아니다.
/ 문자는 나눗셈의 표시인데 엄밀히 말하면 연산이 끝나면 나누기의 몫을 받는다. 수학식에서도 나누기를 하면 몫과 나머지 두개가 나온다. 프로그래밍에서 하나의 연산에 두개의 결과가 나온 경우 두개의 값을 받아야 하지만 기본 연산은 그렇게 복잡하게 설계되지 않았다.
정수형에서 몫은 / 나머지는 % 의 연산자로 계산할 수 있다. 실수형(부동소수점 형)을 계산할 때는 소수점이하로 나눠지므로 다르다.
몫과 나머지 연산은 정수형에 해당한다.
방금 전 프로그램으로 이제 C++에서 사칙연산을 할 줄 알게 되었다. 그런데 숫자를 한번만 사용하는 것 보다 여러번 사용할 수는 없을까 의문이 든다. 사람도 종이에 메모를 하면 암산으로 안되는 복잡한 계산까지 풀 수 있다. (1230 x 5783 같은 계산) 머리가 좋아서 암산으로 다 풀리는 사람들은 생각할 필요가 없다. 컴퓨터의 계산 파워가 세상에서 가장 빠른 암산을 하는 사람을 초월한지도 몇십년이 지났다.
컴퓨터는 메모리에 변수를 만들어서 숫자를 재사용할 수 있다. 변수는 이름이 붙여진 컴퓨터 안의 메모장 혹은 저장소와 같다. 여기에 숫자값 하나를 저장해 두고 필요할 때마다 이름으로 불러올 수 가 있다.
사람도 메모장에 쓰는 이점이 있는데 컴퓨터에 변수를 쓰면 어떨까?
이전 포스팅에서 배운 4바이트 크기의 int 정수형 데이터 타입을 사용할 것이다.
#include <iostream>
using namespace std;
int main()
{
int a = 10;
int b = 7;
cout << a + b << endl;
cout << a - b << endl;
cout << a * b << endl;
cout << a % b << endl;
return 0;
}
내용만 놓고 본다면 첫번째 숫자의 사칙연산과 별 차이가 없다. (실은 네번째가 / 가 아니라 % 나머지 연산인 차이가 있다 ㅋ)
main 함수의 시작 첫번째 줄에 int a = 10; 의 문장을 보면 혼동이 올 수도 있다. 하나씩 분리해서 본다.
int 는 정수형 4바이트를 의미.
a 는 이 변수의 이름이다. 프로그램에서는 앞으로 a라는 이름으로 여기에 저장된 값을 계속 불러올 수 있다.
예제에서 a라는 변수명을 자주 쓸 것이다. 왜냐하면... 타이핑하는 시간을 절역하기 때문이다(귀챃기 때문이군ㅋ)
= 은 같다 표시이다... 가 아니라 앞의 a에 값을 대입하겠다는 뜻이다! 수학의 = 같다와 헷갈려서는 안된다.
프로그래밍을 모르는 수많은 사람들이 = 표시를 같다라고 알고 있다. 가르쳐 주는 사람이 없어서 그랬던 것이니 괜찮다. = 는 다음에 오는 10의 값을 변수 공간 a에 할당하겠다. (assign)는 뜻이다. 이제 32비트 정수형 변수 a가 메모리 상에 생성되고 여기에 10의 값이 입력될 것이다.
다음 줄도 마찬가지다. 동일한 문법으로 어떤일이 생길지 알 수 있을 것이다.
그 다음의 코드를 보니 숫자는 다 없어지고 a와 b만 남았다.
그 다음은 무엇을 할 수 있을까?
a 와 b 의 값을 바꿔본다.
#include <iostream>
using namespace std;
int main()
{
int a = 165;
int b = 77;
cout << a + b << endl;
cout << a - b << endl;
cout << a * b << endl;
cout << a % b << endl;
return 0;
}
a와 b라는 저장공간에 좀 더 큰 숫자를 넣어 봤다.
여전히 작동을 잘 한다. 165 나누기 77의 몫은 2이고 154를 제외하면 11이 남는다. 나머지 연산자는 11을 돌려준다.
변수를 사용해서 정수의 사칙연산을 사용할 수 있다는 것을 알게 되었다.
그렇다면 다음은 조금 다른 방식을 보자. 다음 예제 코드를 한번 스윽 본다. 입문 단계라면 아직 배우지 않은 것들이니 아직 문법을 모르더라도 괜찮다. 혹시 파이썬이나 다른 언어에서 함수를 배웠다면 의미를 짐작할 수 있을 것이다.
#include <iostream>
using namespace std;
int add(int a, int b);
int sub(int a, int b);
int mul(int a, int b);
int divi(int a, int b);
int mod(int a, int b);
int main()
{
int a = 120;
int b = 3;
cout << add(a,b) << endl;
cout << sub(a,b) << endl;
cout << mul(a,b) << endl;
cout << divi(a,b) << endl;
cout << mod(a,b) << endl;
return 0;
}
int add(int a, int b)
{
return a+b;
}
int sub(int a, int b)
{
return a-b;
}
int mul(int a, int b)
{
return a*b;
}
int divi(int a, int b)
{
if( b == 0 ){
cout << "Division by zero" << endl;
return 0;
}
return a/b;
}
int mod(int a, int b)
{
return a%b;
}
코드는 길어졌는데 하는 일은 같다. cout << add(a,b) << endl; 은 함수 add()를 불러와서 실행한 값을 출력했다.
함수는 입력한 값에 적절한 처리를 하여 출력값을 만들어 내는 코드이다. 함수라고 하면 와닿지가 않는데 function (기능) 으로 보면 이해가 된다. add (int, int ) 함수는 두 정수의 더하기를 하는 함수구나. 직관적으로 알 수 있다.
처음에 연산했던 방식은 직접 숫자를 입력하기 때문에 제약이 많았다. 변수를 사용함으로써 많은 제약을 극복할 수 있다.
소스코드를 작성할 때 미리값을 정해놓았다면 숫자들을 바꾸기 위해서 다시 소스코드를 작성해야 한다.
변수를 사용함으로써 그럴 필요가 없어진다.
사용자에게 숫자를 입력받아도 되고, 엑셀파일의 데이터를 입력해도 된다. 마우스로 클릭을 해도 되고 네트워크로 원거리에 있는 컴퓨터에서 값을 가져와도 된다. 그 값을 입력받고 처리할 수 있는 알고리즘을 C++ 로 개발하기만 하면 된다.
C++ 프로그래밍은 그 알고리즘을 개발하고 구현하기 위한 모든 과정이다. 어떤 프로그래밍 언어라도 데이터 타입과 변수는 가장 기본이 되는 자료 구조이기 때문에 앞쪽에서 학습하게 된다. 컴퓨터의 사용자에서 벗어나 컴퓨터의 생산자가 되는 것은 이 자료구조를 수도 없이 만지작 거리고 들여봐야 한다는 것을 의미한다.
4차산업은 정보의 바다를 넘어서 정보의 우주로 가고 있다. 어떤 데이터를 입력받아서 어떻게 가공하는 프로그램을 만들 건지는 전적으로 프로그래머에게 달려 있다.
구글, 페이스북, 아마존, 유튜브도 처음에 다 그렇게 시작했다. 지금은 전세계에 막강한 영향력을 가진 사람들이지만 불과 20년 전에는 그저 미국의 좋은 학교들 다니던 괴짜 학생들이었음을 생각해 볼 필요도 있다.
누구나 저들 처럼 21세기의 영웅이 될 수 있다는 착각은 무리겠지만 적어도 의미에 대해서 한번 쯤 생각할 필요는 있다.
사실 착각은 자유다. 망상을 공유하지 않고 혼자 상상만 하면 무죄다.
정수형 말고도 다루어야 되는 자료형은 엄청나게 많다. 천리길도 한걸음 부터라고 기본형 자료부터 열심히 들여다 보면 프로그래밍으로의 길은 열릴 것이다.