프로그래밍 언어/C++

[게임 프로그래머 입문 올인원] 모던 C++ : 오른값 참조 (82강)

순정법사 2024.03.30

A. 모던 C++

1. 오른값 참조

a. 오른값이란?

🌟 변수나 표현식이 임시로 생성되거나 값을 가지고 있는 객체인 경우를 가리키는 용어

 

  • C++의 이동(Move) 세마틱스와 관련
  • 이동을 통해 자원 소유권을 효율적으로 이전함
  • 효율적인 자원 관리와 더 나은 성능을 제공

 

b. 좌변값 VS 오른값

  • 좌변값 L-value : 변수나 표현식이 메모리 주소를 가지며, 해당 주소에 값이 할당될 수 있는 객체
  • 오른값 R-value : 할당될 수 있는 값을 가진 표현식 또는 객체. L-value가 아닌 나머지
    • 주로 이동 가능한 객체가 취급됨  (임시 객체나, 리터럴 상수, 함수 호출의 반환 값)

좌변값과 오른값

 

c. 이동 세마틱스

🌟 객체의 데이터나 자원을 복사하는 대신 이동(move)하여 성능을 향상시키는 기술

 

➡ 임시 객체나 동적으로 할당된 자원을 가진 객체의 효율적인 관리를 가능하게 함

 

1) 복사 생성자

 

객체를 다른 객체로 복사할 때 호출되는 생성자

객체를 인자로 받는 함수에 전달하거나, 함수의 반환 값으로 객체를 반환할 때 호출

객체의 내용을 복사하여 새로운 객체를 생성

 

이랬다고 하면

 

Knight에 자동으로 생성되는 연산자들, k2 = k1은 복사대입 연산자

 

2) 이동 생성자

 

객체의 내용을 실제로 이동

오른값 참조를 사용하여 호출되며, 이동 연산을 수행하기 위한 적절한 자원 이전 로직을 구현해야 함

 

더이상 펫이 필요없으니 밀어주는 것

 

👉 이동 세마틱스는 이동 생성자를 적절히 정의하여 객체의 복사 비용을 최소화하고 성능을 향상

특히 동적으로 할당된 자원을 가진 객체를 반환하는 함수나 컨테이너의 요소를 조작할 때 더 좋다

 

d. 객체의 복사와 참조

위에서 생성한 Knight 클래스를 다른 함수로 넘겨준다고 하면.. 

 

1) 복사버전 : 데이터가 많으면 비효율적인 방식

 

 

2) 왼쪽참조 : 원본을 넘겨주고 수정하는 방식

 

Knight()라는 임시객체는 참조값으로 들어갈 수 없음

 

위 에러메세지에도 표시되듯, const 가 아닌 참조에 대한 초기값은 왼쪽값, 즉 

변수나 표현식이 메모리 주소를 가지며, 해당 주소에 값이 할당될 수 있는 객체여야 하는데

임시객체이니 들어가지 못함

 

3) const 왼쪽참조 : 원본을 넘겨주지만 수정할 수 없는 방식

 

따라서 const를 붙여 오른값도 들어갈 수 있게 하면
들어가지지만 내용은 오른값이라 수정불가

 

4) 오른값 참조 : 원본을 넘겨주고 더이상 원본을 활용하지 않으니 알아서 사용하기

 

&& : 오른값 참조라는 뜻

 

&&사용
더이상 사용하지 않으려면 오른값으로 캐스팅 후 넣어주기
더이상 펫이 필요없으니 밀어주는 것
이렇게되면 k1의 pet은 null이됨

 

move 코드를 사용함 (캐스트와 동일)

 

 

 


출처 : https://www.inflearn.com/course/%EA%B2%8C%EC%9E%84-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8-%EC%9E%85%EB%AC%B8-%EC%98%AC%EC%9D%B8%EC%9B%90-rookiss#curriculum

 

[게임 프로그래머 입문 올인원] C++ & 자료구조/알고리즘 & STL & 게임 수학 & Windows API & 게임 서버 |

Rookiss | 어디부터 시작할지 막막한 게임 프로그래밍 입문자를 위한 All-In-One 커리큘럼입니다. C++, 자료구조/알고리즘, STL, 게임 수학, Windows API, 게임 서버 입문으로 이어지는 알찬 커리큘럼으로

www.inflearn.com