[이득우c++]
int value = 42;
int* ptr = &value; // 포인터 ptr은 value의 주소를 가리킴
int dereferencedValue = *ptr; // ptr을 역참조하여 값 42를 읽음
*ptr = 10; // ptr을 역참조하여 값을 변경함, 이제 value는 10으로 바뀜
int value = 42;
int& ref = value; // ref는 value의 참조
int referencedValue = ref; // ref를 통해 값 42를 읽음
ref = 10; // ref를 통해 값을 변경함, 이제 value는 10으로 바뀜
---------------------------------------------------------------------------------------------
User
TCHAR* LogCharDataPtr2 = TEXT("Hello Unreal2");
UE_LOG(LogTemp, Log, TEXT("%s"), LogCharDataPtr2 );
이렇게 하니깐 문자열이 출력됬어. LogCharDataPtr2 는 포인터 이니깐 메모리 주소가 출력되어야 되는거 아냐?
ChatGPT
C++에서 TCHAR* 타입은 널 종료된 문자열(Null-terminated string)을 가리키는 포인터로 사용됩니다. 문자열 리터럴(TEXT("Hello Unreal2")와 같은)은 메모리에 저장된 문자열의 첫 번째 문자를 가리키는 포인터로 해석됩니다.
UE_LOG 매크로에서 %s 포맷 지정자를 사용하여 문자열을 출력할 때, 해당 포맷 지정자는 널 종료된 문자열의 첫 번째 문자를 가리키는 포인터를 기대합니다. 문자열 리터럴은 이미 메모리에 저장되어 있으며 널 종료된 형태로 사용됩니다. 따라서 UE_LOG 매크로에서 %s를 사용하여 해당 포인터를 출력하면, 문자열이 정상적으로 출력됩니다.
즉, LogCharDataPtr2는 문자열 리터럴의 첫 번째 문자를 가리키는 포인터로 해석되어 출력되는 것이 맞습니다. 메모리 주소 자체가 출력되지 않는 이유는 UE_LOG 매크로가 포인터 변수를 받아서 해당 포인터가 가리키는 문자열을 출력하는 방식으로 동작하기 때문입니다.
---------------------------------------------------------------------------------------------
User
TCHAR* LogCharDataPtr2 = TEXT("Hello Unreal2");
FString LogCharString2 = LogCharDataPtr2;
이 코드에서 LogCharString2 변수는 "Hello Unreal2" 의 주소를 담은거야 아니면 LogCharDataPtr2 변수의 주소를 담은거야?
ChatGPT
해당 코드에서 LogCharString2 변수는 "Hello Unreal2"의 값을 가진 FString으로 초기화됩니다. LogCharDataPtr2 변수의 주소가 아닌, LogCharDataPtr2 변수가 가리키는 문자열의 값을 FString으로 복사합니다.
즉, LogCharString2 변수는 "Hello Unreal2" 문자열을 가지고 있으며, LogCharDataPtr2 변수와는 별개의 메모리 공간을 차지하고 있습니다. 두 변수는 서로 다른 값과 주소를 가지고 있습니다.
---------------------------------------------------------------------------------------------
User
TCHAR LogCharArray[] =TEXT("Hello Unreal");
FString LogCharString = LogCharArray;
const TCHAR* LongCharPtr = *LogCharString;
이 코드에서 왜 LogCharString 변수를 dereferencing 하는거야?
Ans-> *LogCharString 는 c의 dereferencing을 얘기하는것이 아니다. 언리얼 엔진의 operator overloading 기능이다. Fstring 을 c 스타일의 TCHAR* 로 변환하라는 뜻이다.
ChatGPT
위의 코드에서 LogCharString 변수를 dereferencing하는 이유는 FString을 C 스타일 문자열 포인터(TCHAR*)로 변환하기 위해서입니다.
LogCharString은 FString 형식의 문자열을 저장하는 변수입니다. 하지만 일반적인 C 스타일의 문자열을 다루는 함수나 인터페이스는 TCHAR* 형식의 C 스타일 문자열 포인터를 기대합니다. 따라서 FString을 TCHAR* 형식으로 변환하여 C 스타일 문자열을 사용할 수 있도록 해야 합니다.
FString 클래스는 내부적으로 문자열을 관리하고, * 연산자를 사용하여 내부 C 스타일 문자열 포인터에 접근할 수 있습니다. 따라서 LogCharString는 FString을 C 스타일 문자열 포인터(TCHAR)로 dereferencing한 결과를 반환합니다.
LogCharString을 dereferencing하여 LogCharString의 내부 문자열 포인터에 접근하고, 그 값을 LongCharPtr에 할당함으로써 FString을 C 스타일 문자열 포인터로 변환한 것입니다. 이렇게 변환된 C 스타일 문자열 포인터를 다른 함수나 인터페이스에서 사용할 수 있습니다.
---------------------------------------------------------------------------------------------
User
const FString& GetName() const;
이 코드에서 FString& 는 무엇을 뜻하는거야? 그리고 문법 맨 앞이랑 맨 뒤에 const를 붙이면 어떻게 되는거야?
ChatGPT
FString&는 C++에서 참조(reference)를 나타내는 타입입니다. 이는 해당 함수의 반환값이 FString 객체에 대한 참조를 반환한다는 의미입니다. 참조는 기존 객체에 별칭(alias)을 부여하는 것으로, 별칭을 통해 동일한 객체를 가리키게 됩니다. 따라서 GetName() 함수가 호출되면 해당 객체의 FString에 대한 참조를 반환하게 됩니다.
const 키워드는 두 가지 상황에서 사용됩니다. 첫째, const가 함수 시그니처의 맨 앞에 위치할 경우 해당 함수는 상수 멤버 함수(const member function)로 선언됩니다. 이는 함수 내에서 객체의 상태를 변경하지 않는다는 것을 의미합니다. 둘째, const가 변수나 참조 타입의 맨 뒤에 위치할 경우 해당 객체는 상수로 선언됩니다. 이는 해당 객체의 값이 변경될 수 없음을 나타냅니다.
따라서 const FString& GetName() const;은 GetName() 함수가 FString 객체에 대한 참조를 반환하고, 함수 자체도 객체의 상태를 변경하지 않는다는 것을 의미합니다.
---------------------------------------------------------------------------------------------
User
FString Name;
void UPerson::SetName(const FString& InName)
{
Name = InName;
}
이 코드에서 FString& InName 인자는 포인터를 받은거야 아니면 실제 값을 받은거야?
Name = InName; 이 코드는 실제 값을 복사하는거야?
ChatGPT
FString& InName 인자는 참조(reference)로 전달되는 것을 의미합니다. 따라서 포인터가 아니라 실제 값을 전달받습니다.
Name = InName; 코드는 실제 값을 복사(assign)하는 것입니다. InName 변수에 저장된 값을 Name 변수에 복사합니다. 이 때, FString은 일반적인 복사 대입 연산자를 지원하기 때문에 해당 코드는 값을 복사합니다.
User
그러면 Name 변수의 값을 변경하면, InName 변수의 값도 변해?
ChatGPT
아니요, Name 변수의 값을 변경하더라도 InName 변수의 값은 변경되지 않습니다. InName은 SetName 함수의 매개변수로 전달된 값의 참조이므로, Name 변수의 변경이 InName에 영향을 주지 않습니다. InName은 함수 내에서 Name 변수의 값을 읽기 위해 사용되는 참조로만 사용됩니다.
---------------------------------------------------------------------------------------------
댓글
댓글 쓰기