일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- 배열
- 게임프로그래밍패턴
- CPP
- 포인터
- 소멸자
- C++
- BehaviorTree
- effectivec++
- AI
- 프로세스
- 언리얼엔진
- 디자인패턴
- Unreal Engine
- 복사생성자
- 복사대입연산자
- 게임개발
- Unreal Engine5
- 프로그래밍
- 언리얼5
- 언리얼엔진5
- 생성자
- 데이터구조
- cpp개발
- UE5
- 언리얼 엔진5
- Unreal
- 게임 개발
- 자료구조
- C언어
- 언리얼
- Today
- Total
리얼 개발
[C++] 2. Dealing with Data 본문
저번 포스팅에서 첫 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 |