2부. C언어 기본 익히기

간단한 C 언어 입문 설명을 0부에서 익혔으니까 이제부터는 더 깊은 이야기를 해보겠습니다. 연산자와 각종 구문을 배우고 집합 자료형도 사용해볼겁니다.

관우가 차근차근 모시고 갈 겁니다.
아시죠?
제가 형수님 모시고 천리길을 간 사람이라는 거?
친절합니다. 해치지 않습니다.

그럼 출발하겠습니다.

[2-1] 연산자

연산은 CPU의 산술 논리 장치(arithmetic logic unit, ALU)로 계산하는 일련의 과정입니다.
연산자(operator symbol)는 연산을 나타내는 기호입니다.

연산자는 크게 산술 연산자, 논리 연산자, 비교 연산자로 구분할 수 있습니다. 이제부터 차례대로 알아보겠습니다.

1.1 산술 연산자

산술 연산자는 숫잣값을 피 연산자로 사용해 연산한 결과를 숫자로 반환하는 연산자입니다.

대표적으로 가감승제를 수행하는 사칙 연산자가 있는데, C 언어는 이외에도 더 많은 연산자를 제공합니다. 제공하는 연산자는 다음과 같습니다.

[표] 산술 연산자

연산자 이름 구문 설명
대입 연산자 a = b 좌항을 우항에 대입합니다.
덧셈 a + b 두 수를 더 합니다.
뺄셈 a - b 왼쪽 값에서 오른쪽 값을 뺍니다.
단항 덧셈 +a 피연산자의 부호에 + 연산을 합니다. 기존 값과 바뀌지는 않습니다.
단항 뺄셈 -a 피연산자의 부호를 -는 +, +는 -로 바꿉니다.
곱셈 a * b 두 수를 곱합니다.
나눗셈 a / b 왼쪽 값을 오른쪽 값으로 나눕니다.
나머지 a % b 왼쪽 값을 오른쪽 값으로 나눈 나머지를 구합니다.
증가 전위 ++a 자신을 1 증가시키고 다른 연산을 수행합니다.
후위 a++ 대입연산을 수행하고 나서 자신을 1 증가시킵니다. 
감소 전위 --a 자신을 1 감소시키고 다른 연산을 수행합니다.
후위 a-- 대입연산을 수행하고 나서 자신을 1 감소시킵니다.

더하기, 빼기, 곱하기, 나누기는 누구나 알 겁니다. 그런데 나머지를 알려주는 나머지 연산자 %는 처음 봤을 겁니다. 나눗셈 연산자는 /입니다.

#include <stdio.h>

int main(void) {
	int a = 5;
	int b = 3;
	
	printf("%d + %d = %d\n", a, b, a + b);
	printf("%d - %d = %d\n", a, b, a - b);
	printf("%d * %d = %d\n", a, b, a * b);
	printf("%d / %d = %d\n", a, b, a / b);
	printf("%d %% %d = %d\n", a, b, a % b);
	return 0;
}

[결과]

5 + 3 = 8
5 - 3 = 2
5 * 3 = 15
5 / 3 = 1
5 % 3 = 2

나머지 연산자는 % 기호를 사용하는데, %는 컴파일러가 사용하는 예약어입니다. 그래서 printf() 함수로 %를 출력하려면 %%를 두 번 적어야 합니다.

제갈량의 동남풍

ALU가 뭔가요?

흔히 부르는 CPU에는 메모리 공간과 연산 공간이 있습니다. 연산을 실제로 수행하는 곳이 산술 논리 장치, 즉 ALU입니다.

ALU

opcode는 operation code의 약어입니다. 연산코드라는 뜻이지요. ALU는 A와 B를 주어진 opcode대로 계산해 Y로 출력하는 역할을 합니다. 이때 A와 B는 입력값, opcode는 연산 코드, Y는 출력값이 됩니다. 연산코드가 더하기면 A와 B 값을 더한 결과를 Y에 출력하는 거죠.

ALU가 이런 연산을 하려면 값을 저장해둘 공간이 필요합니다. 저장 공간은 어떤 형태든 메모리라고 부릅니다. 특히나 CPU 연산에 사용하는 메모리를 레지스트리라고 부릅니다.

레지스트리는 제한적인 크기를 가지만 CPU 클럭과 동기화된 메모리 영역으로 엄청 빠릅니다. 현대 CPU는 연산 속도를 높이고자 CPU 자체에 캐시 메모리를 가지고 있습니다. X86 기반에서 L1, L2, L3 캐시 메모리가 그것입니다. CPU 자체가 가지고 있는 캐시 메모리는 RAM에서 지원하는 메모리보다 훨씬 빨라서 연산 속도 향상에 큰 도움을 줍니다.

ALU

CPU 외에 있는 메모리인 DDR 같은 RAM은 버스의 클럭에 의존적입니다. 참고로 인텔 코어 i7 시리즈는 클럭이 1.6 GHz ~ 4.50 GHz 정도입니다. DDR4-3200AC RAM은 메모리 클럭이 400MHz이고 입출력 버스 클럭은 1600MHz에 불과합니다. 하드디스크 같은 메모리는 더더욱 느립니다.

CPU에 내장된 L1, L2 캐시가 클수록 성능이 좋은 이유를 이제 아시겠죠? 이상 제갈량이었습니다.