제목: C++ 변수와 연산자
서론
객체지향 프로그래밍(OOP)에 들어가기 전, C++의 기본 요소인 변수와 연산자에 대한 깊이 있는 이해가 필요하다. 마치 건축물의 기초 공사와 같이, 변수와 연산자는 C++ 프로그래밍의 토대를 형성한다. 먼저 폰 노이만 아키텍처를 통해 메모리의 중요성을 되짚어보고, 변수의 다양한 타입과 연산자의 특징을 살펴보며 C++ 프로그래밍의 기본기를 탄탄하게 다져보자.
폰 노이만 아키텍처와 메모리의 역할
현대 컴퓨터의 근간을 이루는 폰 노이만 아키텍처는 CPU, 메모리, 입출력 장치로 구성된다. 특히 메모리는 프로그램 실행에 필요한 데이터와 명령어를 저장하는 핵심적인 역할을 수행한다. C++ 프로그램 역시 컴파일 과정을 거쳐 메모리에 저장되고, CPU는 메모리에 저장된 명령어를 순차적으로 실행하며 데이터를 처리한다.
![]() |
Von Neumann Architecture |
변수: 데이터를 담는 그릇
변수는 메모리 공간에 이름을 붙여 데이터를 저장하고 관리하는 데 사용된다. 마치 다양한 크기와 모양의 그릇에 음식을 담는 것처럼, C++는 다양한 타입의 변수를 제공하여 각기 다른 종류의 데이터를 저장할 수 있도록 한다.
변수 타입의 종류와 특징
C++는 다양한 데이터 타입을 제공하며, 각 타입은 메모리 크기와 표현 가능한 데이터 범위가 다르다.
- 정수 타입 (Integer Type): 정수를 저장하는 데 사용되며,
short
,int
,long
,long long
등 다양한 크기와 부호 (signed
,unsigned
)를 지원한다. 예를 들어int
는 4byte(=16bit)의 메모리를 사용하며, -2^31부터 2^31-1까지의 정수를 표현할 수 있다.
![]() |
Integer |
- 부동소수점 타입 (Floating Point Type): 실수를 저장하는 데 사용되며,
float
,double
,long double
등이 있다. IEEE 754 표준을 따르며, 지수(exponent)와 가수(mantissa)를 이용하여 실수를 표현한다.float
는 4바이트 메모리를 사용하며, ± 3.4 X 10^38 범위의 실수를 표현할 수 있다. 부동소수점 타입은 유효 자릿수를 나타내는 precision 개념도 중요하다. 예를 들어cout
은 기본적으로 6자리의 precision을 갖는다.Floating
- 문자 타입 (Character Type): 단일 문자를 저장하는 데 사용되며,
char
,wchar_t
,char16_t
,char32_t
등이 있다.char
는 1바이트 메모리를 사용하며, 작은 따옴표('')로 둘러싸거나 ASCII 값을 이용하여 문자를 표현할 수 있다.Character
변수 초기화: 시작을 알리는 첫 발걸음
변수를 선언할 때 초기값을 할당하는 것을 '초기화'라고 한다. C++는 다양한 초기화 방법을 제공한다.
- 복사 초기화 (Copy initialization):
=
연산자를 사용하여 초기값을 할당한다. 예:int num = 10;
- 직접 초기화 (Direct initialization): 변수 이름 뒤에 괄호
()
를 사용하여 초기값을 할당한다. 예:int num(10);
- Uniform initialization: 변수 이름 뒤에 중괄호
{}
를 사용하여 초기값을 할당한다. C++11부터 지원되며, 안전하지 않은 변환을 방지한다. 예:int num{20.5};
// error
타입 변환: 데이터의 변신
서로 다른 타입의 변수를 연산할 때, 컴파일러는 자동으로 타입 변환을 수행한다. 이를 '암시적 타입 변환(implicit type conversion)'이라고 한다. 예를 들어 int
와 char 을 더하면 char 가 int 로 변환되어 연산이 수행된다.
![]() |
implicit type conversion |
![]() |
type conversion order |
반면에 프로그래머가 명시적으로 타입 변환을 지정할 수도 있는데, 이를 '명시적 타입 변환(eplicit type conversion)' 또는 '타입 캐스팅(type casting)'이라고 한다. 예를 들어 double
값을 int
로 변환하려면 (int)값
형태로 타입 캐스팅을 수행한다.
![]() |
explicit type conversion |
연산자: 데이터를 manipulates 하는 도구
연산자는 변수에 저장된 데이터를 처리하고 연산하는 데 사용된다. C++는 다양한 연산자를 제공하며, 각 연산자는 우선순위와 결합 규칙을 갖는다.
- 산술 연산자:
+
,-
,*
,/
,%
등 숫자 데이터의 사칙연산과 나머지 연산을 수행한다. (Left에서 Right로) - 대입 연산자:
=
,+=
,-=
,*=
,/=
,%=
등 변수에 값을 할당하거나 기존 값에 연산 결과를 누적한다. (Right에서 Left로) - 증감 연산자:
++
,--
등 변수 값을 1 증가시키거나 감소시킨다. (Prefix냐 Posfix냐에 따라 순서가 상이함) - 비교 연산자:
==
,!=
,>
,>=
,<
,<=
등 두 값을 비교하여 참/거짓을 판단한다. - 논리 연산자:
&&
,||
,!
등 여러 조건을 논리적으로 결합하여 참/거짓을 판단한다. - 비트 연산자:
&
,|
,^
,~
,<<
,>>
등 비트 단위 연산을 수행한다.
연산자 우선순위와 결합 규칙: 순서의 중요성
여러 연산자가 함께 사용될 때, 연산자의 우선순위와 결합 규칙에 따라 연산 순서가 결정된다. 예를 들어 *
, /
, %
연산자는 +
, -
연산자보다 우선순위가 높다.
int result = 3 + 4 * 5; // result는 23
또한, 동일한 우선순위의 연산자들은 결합 규칙에 따라 연산 순서가 결정된다. 대부분의 연산자는 왼쪽에서 오른쪽으로 결합하지만, 대입 연산자나 단항 연산자는 오른쪽에서 왼쪽으로 결합한다.
![]() |
헷갈리는 예제 |
결론
변수와 연산자는 C++ 프로그래밍의 기본 요소이며, 데이터를 저장하고 조작하는 데 필수적인 도구이다. 다양한 타입의 변수와 연산자를 적절히 활용하여 원하는 결과를 얻을 수 있도록 꾸준히 연습하고 숙달해야 한다. 다음 시간에는 C++에서 flow control하는 방법에 대해 알아보겠다.
추천글 :
[알고리즘] Algorithmic Analysis - correctness with induction
(https://hyeonb.blogspot.com/2024/09/algorithmic-analysis-correctness-with.html)
[OOP] 객체지향프로그래밍
(https://hyeonb.blogspot.com/2024/09/oop.html)