0. 개요
오늘은 강의를 듣고, 내가 제대로 기억하고 있는게 맞는지 검증하는 시간을 가졌다.
이 과정에서도 몰랐던 부분이 있었는데 (레퍼런스가 별칭으로 설명되고, 해당 별칭이 내부적으로 어떻게 변수 주소와 연결되는지, 전위 후위 연산자 동작이 어떻게 다른지 등) 검색하고 공부해 볼 수 있어서 굉장히 의미있는 시간이었다.
또, 남는 시간에는 과제를 제출하기 전 검토하는 작업과 Unreal에서 Post Process를 사용해보기를 해보았다.
Post Process는 사실.. 클라이언트 프로그래머가 다루는 영역일까..?에 대해 고민을 했는데..
이전에 포폴을 작업할 때 그래픽스쪽을 다뤘어서 한번쯤은 언리얼에서 포스트 프로세스로 만들고 싶었다.
1. AND(&&)와 OR(||) 연산자 팁!
AND와 OR문은 앞쪽부터 검사하기 때문에 AND 기준 앞쪽이 false면, 뒤쪽은 검사를 안하고 바로 넘어간다.
OR 기준 앞쪽이 true면 뒤쪽은 검사하지 않고 바로 다음 실행으로 넘어간다..!
bool A = true;
bool B = false;
if (B && A)
{
// B가 false 이기 때문에 A를 확인할 필요가 없어서 바로 넘어감.
}
else if (A || B)
{
// A가 true이기 때문에 B는 확인을 하지 않는다.
}
2. for문 초기화, 조건, 변환, 본문 실행 순서
// 초기부 : int i = 0
// 조건부 : i < 10
// 변환 : ++i
// 본문 : {. . .}
for (int i = 0; i < 10; ++i)
{
// for문 실행 순서
// 1. 초기부
// 2.a 조건부
// 2.b 본문
// 2.c 변환
}
전위 연산자와 후위 연산자가 서로 뭐가 다른지 찾아보다가 for문의 실행 순서를 잘 기억하는지 궁금해 이것까지 찾아보게 되었다.
결론은 잘 기억하고 있었다..!
요지는 for문에서 전위 연산자로 idx를 넘기건, 후위 연산자로 idx를 넘기건 상관이 없다.
3. 전위 연산자와 후위 연산자의 동작 차이점
C++ 11 이후의 value category를 구분하는 기준에는 identity와 move 두 가지가 있다.
identity는 두 객체(entity)의 주소(address)를 비교하여 두 객체가 같은지 확인할 수 있는지를 나타낸다.
move는 어떤 값이 다른 값으로 이동될 수 있음을 이야기한다.
구분 기준에 따라서 Mixed category(복합 카테고리)와 Primary category(기본 카테고리)로 나눌 수 있다.
먼저 Mixed category는 gl-value(i)과 r-value(m)로 나눌 수 있으며,
Primary category는 x-value(im), l-value(iM), pr-value(Im)으로 나눌 수 있다.
두 연산자 모두 피연산자의 값을 1 증가/감소 시키는 역할을 한다.
하지만
전위 연산자는 l-value에 속하는 반면, 후위 연산자는 r-value에 속한다.
이는 전위 연산자와 후위 연산자의 동작 방식이 다르기 때문이다.
int num = 10;
// 전위 연산자의 경우: compile error가 뜨지 않는다.
++num = 30;
// 후위 연산자의 경우: complile error! [error C2106: '=': 왼쪽 피연산자는 l-value이어야 합니다.]
num++ = 30;
전위 연산자 (prefix operator)
int num = 10;
++num = 30;
전위 연산자의 경우 다른 수식을 계산하기 전에 먼저 값을 증가시키고, 그 결과를 객체로 반환한다.
즉, 전위 연산자는 자기 객체를 반환하며, 이는 주소 값을 가지고 있다는 뜻이다.
그리고 이것은 주소 값을 통해 identity를 구분할 수 있다는 뜻이므로, l-value라고 볼 수 있다.
후위 연산자 (postfix operator)
int num = 10;
num++ = 30; // error
후위 연산자의 경우, 전위 연산자와는 다르게 추가적인 메모리가 필요하다.
변화한 값을 다른 연산을 진행한 후에 가져와야하기 때문에 추가적인 메모리가 필요하다.
즉, 후위 연산자는 더한 값을 임의의 메모리에 저장해 놓는다.
ㄴ> 후위 연산자는 상수 값(const)를 반환한다. (반환형이 const이다.)
<참고 블로그>
[C++] 전위 연산자와 후위 연산자의 동작 방식의 차이 (l-value, r-value)
이전 포스팅에서 C++의 value category(https://m42-orion.tistory.com/67)에 대해 알아보았다. 짧게 정리를 해보자. C++ 11 이후의 value category를 구분하는 기준에는 identity와 move 두 가지가 있다. identity는 두 객체
m42-orion.tistory.com
4. 배열과 vector 전달
void test(int arr[4])
{
arr[0] = 100;
}
void test1(vector<int> vec)
{
vec[0] = 100;
}
int main()
{
int arr[4] = { 0, 1, 2, 3 };
vector<int> vec = { 0, 1, 2, 3 };
test(arr);
test1(vec);
cout << arr[0] << '\n';
cout << vec[0];
// 실행 결과 : arr[0] : 100
// 실행 결과 : vec[0] : 0
return 0;
}
일반 배열의 경우 함수의 인자로 전달할 때, 배열의 첫 번째 원소의 주소를 전달 해준다.
ㄴ> 때문에 함수 내에서 idx 접근도 가능하고, 값을 수정해도 잘 값이 들어있는 것을 확인할 수 있다.
vector의 경우 함수의 인자로 그냥 전달할 때, 복사가 발생하기 때문에 복사 비용도 발생하고, 메모리적으로도 좋지 않다.
때문에 레퍼런스를 이용해 vector를 전달하는게 좋다.
5. 레퍼런스
변수들을 참조 전달 받아, 실제 해당 변수 주소에 접근해 값을 변경할 수 있다.
void test1(vector<int>& vec)
{
vec[0] = 100;
}
int main()
{
vector<int> vec = { 0, 1, 2, 3 };
test1(vec);
cout << vec[0];
// 실행 결과 : vec[0] : 100
return 0;
}
위 코드에서는 vector를 & 레퍼런스라는 것으로 전달했다.
레퍼런스는 변수에 별칭을 정하는 것으로 해당 변수의 주소에 연결해 주소접근을 하게 해준다.
별칭과 주소를 어떻게 내부적으로 연결하는지는 컴파일러마다 다르다.
int main()
{
int a = 0;
int& b = a;
cout << &a << endl;
cout << &b << endl;
cout << b;
// 0000003DF7EFF8F4
// 0000003DF7EFF8F4
// 0
return 0;
}
실험을 해보면, 변수 a의 주소와, a의 레퍼런스를 대입받은 b가 가리키는 주소는 동일한 것을 확인할 수 있다.
또한, b를 출력해보면, a의 값인 0이 들어있다.
!!!! 주의 사항 !!!!
레퍼런스는 초기화를 하고 나면 변경이 불가능하고, 초기화를 반드시 요한다.
또한 레퍼런스에는 nullptr이 들어갈 수 없다.
6. Post Process
산데비스탄을 사용할 때, 시각적인 효과는 없었어서 포스트 프로세스를 이용해 만들어보고 싶었다.
원래는 파란색 화면이 점차 오면서 삼원색 분리 효과를 내려고 했는데..
생각보다 빛이 없을 때가 훨씬 이쁘게 나와서 만족스러웠다.
이번에 하면서, 포스트 프로세스 머티리얼과, 머티리얼 파라미터 컬렉션, 머티리얼의 파라미터를 BluePrint로 변경하는 방법 등을 공부 할 수 있었다.
또, 뎁스 스탠실에 대해서도 조금 더 공부할 수 있어서 좋았다...
아직도 스탠실은 애매하긴 하지만.. ㅠ
특히 머티리얼 파라미터 컬렉션이 좋은 기능인것 같다.
7. 마치며
오늘은 다시 한번 잊은 부분이 있는지 체크해볼 수 있어서 좋았고, 포스트 프로세스를 직접 다뤄보며, 어떤게 있는지, 언리얼에서 제공해주는 기능들은 추가로 뭐 뭐가 있는지 알 수있어서 즐거운 시간이었다..!
깊은 복사와 얕은 복사는 내일 정리해서 올려야겠다
'프로그래밍 > Unreal 부트캠프' 카테고리의 다른 글
TIL 2024.12.30 기록 (0) | 2024.12.30 |
---|---|
TIL 2024.12.27 기록 (0) | 2024.12.27 |
TIL 2024.12.24 기록 (1) | 2024.12.24 |
TIL 2024.12.23 기록 (0) | 2024.12.23 |
TIL 2024.12.20 기록 (0) | 2024.12.20 |