이 코드를 한 줄씩 분석하여 설명드리겠습니다.
#include <iostream>
#include <cfloat>
using std::cout;
using std::endl;
#include <iostream>
: 입출력 라이브러리를 포함하여 콘솔 출력(cout
)을 사용할 수 있게 합니다.#include <cfloat>
: FLT_TRUE_MIN
과 같은 상수들을 제공하는 헤더로, float
타입의 최소 양수 값 등과 관련된 상수들을 사용할 수 있게 합니다.using std::cout;
과 using std::endl;
: std
네임스페이스에 있는 cout
과 endl
을 직접 사용하도록 지정하여, std::cout
대신 cout
만으로도 사용할 수 있게 합니다.union ID
{
char chars[10];
int integer;
};
union ID
: union
은 모든 멤버 변수가 동일한 메모리 위치를 공유하도록 합니다. 즉, chars
배열과 integer
변수가 같은 메모리 공간을 차지하며, 하나의 변수를 쓰면 다른 변수도 영향을 받습니다.char chars[10];
: 10바이트 크기의 char
배열로, 문자열 또는 문자 데이터를 저장할 수 있습니다.int integer;
: 4바이트 크기의 정수형 변수로, 정수를 저장할 수 있습니다. union
특성상 integer
를 사용하면 chars
배열과 메모리를 공유하게 됩니다.int main()
{
ID id;
id.integer = 10;
ID id;
: ID
타입의 union
변수 id
를 선언합니다.id.integer = 10;
: id
의 integer
멤버에 10을 할당합니다. union
은 메모리를 공유하므로 integer
에 값을 넣으면 chars
배열도 이 값을 바탕으로 변경됩니다. // 해당 비트 배열을 int로 인식하겠다는 의미
// 사용에 주의
int* p = reinterpret_cast<int*>(&id);
cout << *p << endl;
int* p = reinterpret_cast<int*>(&id);
: id
의 주소를 int*
타입으로 재해석하여 포인터 p
에 할당합니다. reinterpret_cast
는 단순히 데이터 타입을 강제로 바꾸는 역할을 하므로, id
가 가진 integer
의 값이 p
포인터로 접근되게 됩니다.cout << *p << endl;
: p
가 가리키는 주소의 값을 출력합니다. 이 경우, id.integer
에 10을 할당했으므로 10이 출력됩니다.reinterpret_cast
는 메모리를 강제로 다른 타입으로 변환하는 데 사용되므로, 데이터의 의미가 달라질 수 있어 주의가 필요합니다. // 특수한 경우 메모리의 특정 주소에 있는 값을 Device로 다루는 경우가 있을 수 있음
// Device* p0 = reinterpret_cast<Device*>(0xabcd);
reinterpret_cast
는 특정 메모리 주소를 특정 타입(Device*
)으로 변환하여 다루고자 할 때 사용될 수 있습니다. 이는 하드웨어 장치의 메모리 주소에 직접 접근해야 하는 임베디드 시스템에서 사용될 수 있습니다. 예를 들어, 0xabcd라는 메모리 주소를 Device
타입 포인터로 다루고자 할 때 사용합니다. // 0000,0000,0000,0000,0000,0000,0000,0001
// int, 1의 비트 배열을 float 형태로 해석하면 float의 최소 값이 나옴
int i = 1;
float* a = reinterpret_cast<float*>(&i);
cout << *a << endl;
cout << FLT_TRUE_MIN << endl;
int i = 1;
: i
에 값 1을 할당합니다. 1
은 메모리상에서 0000 0000 0000 0000 0000 0000 0000 0001
로 저장됩니다.float* a = reinterpret_cast<float*>(&i);
: i
의 주소를 float*
타입으로 변환합니다. 이제 a
포인터는 i
의 메모리 데이터를 float
로 해석하게 됩니다.cout << *a << endl;
: a
가 가리키는 값을 float
로 출력합니다. 1
의 비트 패턴을 float
로 해석하게 되는데, 이는 float
의 가장 작은 양수 값에 해당합니다.cout << FLT_TRUE_MIN << endl;
: FLT_TRUE_MIN
은 float
타입에서 나타낼 수 있는 최소 양수 값을 출력합니다. 이는 이전 reinterpret_cast
로 출력된 값과 같을 가능성이 높습니다. // 일반 형변환은 단순히 1이 나온다
float b = i;
cout << b << endl;
}
float b = i;
: i
를 float
타입으로 변환하여 b
에 저장합니다. 일반적인 형 변환을 사용한 것이며, i
의 값인 1
이 float
타입으로 변환되어 b
에 저장됩니다.cout << b << endl;
: b
의 값을 출력합니다. 1
이 float
로 변환되었으므로 결과는 1.0
으로 출력됩니다.reinterpret_cast
를 사용하여 메모리의 특정 주소를 다른 타입으로 해석하는 예제를 보여줍니다.reinterpret_cast
는 데이터의 의미를 바꾸지 않고 메모리 구조를 다른 타입으로 해석하는 용도로 사용되며, 위험성이 높아 주의가 필요합니다.int
타입의 메모리를 float
로 해석하여 출력하거나, 특정 주소를 임의의 포인터 타입으로 변환하는 방식을 보여줍니다.