리얼 개발

[C++] 2. Dealing with Data 본문

C++/어려운 C++

[C++] 2. Dealing with Data

econo-my 2024. 6. 26. 18:36

저번 포스팅에서 첫 C++ 프로그램을 만들어 보았다.

 

하지만 화면에 글자만 출력하는 것으로는 진짜 프로그램이라고 말할 수 없다. 프로그램에 기능을 추가하기 위해 기본적으로 데이터가 존재해야한다. (계산기에서 계산 숫자를 보여줘야 하는것처럼) 우리가 C++ 에서 다룰 수 있는 데이터는 변수, 상수, 사용자 정의 등 다양하다. 이 중에 변수에 대해 알아보겠다.

 

 

변수는 타입(int) 과 이름(count) 가 존재한다. 그럼 count 변수는 어디에 저장되야 할까? 정답은 메모리이다.

 

 

윈도우와 같은 운영체제가 메모리를 독점하고 있다. 이때 우리가 변수를 선언하면 운영체제에게서 변수 타입의 크기만큼 공간을 받을 수 있다. 그 메모리 주소를 위 프로그램에선 "count" 라는 별명으로 부르는 것이다. 이렇게 메모리가 할당되고 나면 변수에 넣어줬던 5라는 데이터가 들어가게 되는 것이다.

 

(*) 주의할 점

 

해당 코드와 같이 변수를 선언만하고 값을 넣어주지 않으면 변수에 쓰레기 값이 들어가게 되어 오류를 일으킬 수 있다. 컴파일러마다 상이할 수도 있다.

 

 

변수 선언과 여려가지 초기화에 대한 방법이며 클래스에서 더 자세히 알아보겠다.

C++ 에는 여러가지 변수 타입이 있다. 기본 변수 타입을 Primitive(원시형) 이라고 부른다.

 

이름
크기
타입
bool
1 byte
Bool
char
1 byte
Character
short
2 bytes
Integer
int
4 bytes
long
4 bytes
long long
8 bytes
float
4 bytes
Floating-point
double
8 bytes
long double
16 bytes

 

위의 표에 나와있는 타입의 크기를 sizeof 연선자를 통해 크기를 확인할 수 있다. 변수를 초기화 하였다면 연산을 수행할 수 있다. 변수 연산에는 +,- 뿐 아니라 다양한 연산자들이 존재한다.

 

연산자

산술 연산자

  • + 더하기 , - 빼기, * 곱하기, / 나누기, % 나머지 연산

대입 연산자

  • = 왼쪽에 있는 값(L-value)에 오른쪽 값(R-value)를 넣는다.

증감 연산자

  • ++, -- 변수에 1씩 더하거나 뺀다.

논리 연산자

  • >, <, >=, <=, == (같다), != (다르다)
  • 논리 연산은 숫자와 숫자를 연산해서 참, 거짓 결과를 나타낸다.

관계 연산자

  • ! 부정
  • && 양쪽이 모두 참이라면 참 (AND)
  • || 두 개중 하나만 참이라도 참 (OR)
  • 관계 연산은 참, 거짓을 연산해서 참, 거짓 결과를 나타낸다.

컴파일러는 숫자 0은 거짓을 나타내며 0이 아닌 값은 참으로 받아들인다.

 
int a = 5;
int b = 10;

int main()
{
    cout << a == b << endl; //거짓 0 출력
    cout << a != b << endl; //참 1 출력
    cout << (a >= b) || (a != b) << endl; //참 1 출력
}

 

L-Value 와 R-Value

일반적으로 대입 연산자(=)의 피연산자 중 왼쪽에 위치하면 l-value, 오른쪽에 위치하면 r-value라고 한다. 아주 틀린 얘기는 아니지만 다른 관점에서 바라볼 필요가 있다.

C++에서 변수는 l-value다. l-value메모리상에서 지속적인 주소(위치)를 가진 값이다. 즉, 표현식(expression) 이후에도 없어지지 않고 지속된다. 변수들은 주소를 가지고 있으므로 모두 l-value다. 할당(assignment)을 수행할 때, 대입 연산자의 왼쪽 편은 l-value이어야 한다.

5 = 6

 

위와 같은 코드는 5가 l-value가 아니므로 컴파일 오류가 발생한다. 값 5에는 위치를 가진 메모리가 없으므로 아무것도 할당할 수 없다. 5는 5를 의미하며, 값은 다시 할당할 수 없다.

l-value의 반대는 r-value다. r-value는 지속적인 메모리 주소와 관련이 없는 값이다. 예를 들면 숫자(5)와 표현식(x + 2)과 같다. 5는 5로 평가되고, x + 2는 변수 x의 값 + 2로 평가된다. r-value표현식이 종료된 이후에는 더이상 존재하지 않는 임시적인 값이다.

int y; // y를 정수 변수로 정의한다.
y = 4; // 4(r-value)는 4로 평가되어지고, y(l-value)에 할당된다.
y = 2 + 5; // 2(r-value) + 5(r-value)는 7(r-value)로 평가되어지고, y(l-value)에 할당된다.
int x; // x를 정수 변수로 정의한다. 
x = y; // y(l-value)는 7로 평가되어지고, x(l-value)에 할당된다.
x = x; // x(l-value)는 7로 평가되어지고, x(l-value)에 할당된다.
x = x + 1; // x(l-value) + 1(r-value)는 8(r-value)로 평가되어지고, x(l-value)에 할당된다.

 

위 코드에서 가장 헷갈리는 표현식을 살펴보자.

x = x + 1;

 

위 문장(statement)에서 변수 x는 두 가지 다른 상황에서 쓰이고 있다. 대입 연산자의 왼쪽 'x'는 값을 저장하는 l-value(주소가 있는 값)로 쓰이고 있다. 반면에 대입 연산자의 오른쪽 'x'는 값을 생성하기 위해 쓰인다. (여기서는 7) C++은 명령문을 평가할 때 아래와 같이 평가한다.

x = 7 + 1;

 

이것은 변수 x에 값 8을 할당한다는 것을 보여준다.

'C++ > 어려운 C++' 카테고리의 다른 글

[C++] 5. 배열과 구조체 (Array and Struct)  (0) 2024.06.26
[C++] 4. 함수(Function)  (0) 2024.06.26
[C++] 3. 제어문 (control_statement)  (0) 2024.06.26
[C++] 1. Hello World  (0) 2024.06.26
[C++] 0. 소개  (2) 2024.06.26