공용체와 그 위험성
타입 간 메모리 공유하기
공용체와 그 위험성은(는) CoddyKit의 무료 C++ Academy 강의입니다. 이것은 4개 중 2번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 C++ Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. C++ Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
유니온이란 무엇인가
union을 사용하면 여러 멤버가 동일한 메모리를 공유할 수 있습니다. 한 번에 하나의 멤버만 유효하며, 유니온의 크기는 가장 큰 멤버만큼만 할당됩니다.
#include <iostream>
union Number {
int i;
float f;
};
int main() {
Number n;
n.i = 42;
std::cout << n.i << "\n";
}유니온의 크기
멤버들이 겹쳐 있으므로 유니온의 sizeof는 멤버 크기의 합이 아니라 가장 큰 멤버의 크기(정렬을 위한 여유 공간을 포함할 수 있음)와 같습니다.
#include <iostream>
union Mix { char c; int i; double d; };
int main() {
std::cout << sizeof(Mix) << "\n"; // size of double (often 8)
}하나를 쓰고 다른 하나를 읽기
한 멤버에 쓰고 다른 멤버를 읽는 것이 핵심적인 위험입니다. 비트가 다른 방식으로 재해석되므로, 대개 정의되지 않은 동작이 발생하거나 예상 밖의 결과가 나옵니다.
#include <iostream>
union Bits { int i; float f; };
int main() {
Bits b;
b.f = 1.0f;
std::cout << b.i << "\n"; // reads float bits as int
}활성 멤버 하나만
마지막으로 쓴 멤버만 안전하게 읽을 수 있습니다. 어떤 멤버가 "활성" 상태인지 직접 추적해야 합니다. 유니온은 이를 기억하지 않습니다.
#include <iostream>
union Value { int i; double d; };
int main() {
Value v;
v.d = 3.14; // d is active
std::cout << v.d << "\n";
}Tagged 유니온 패턴
유니온을 안전하게 사용하려면 활성 멤버를 기록하는 태그(열거형)와 함께 사용하십시오. 이는 std::variant의 수동 구현에 해당하는 선구적인 방식입니다.
#include <iostream>
struct Tagged {
enum { Int, Double } tag;
union { int i; double d; };
};
int main() {
Tagged t; t.tag = Tagged::Int; t.i = 7;
if (t.tag == Tagged::Int) std::cout << t.i << "\n";
}올바른 멤버 읽기
읽기 전에 항상 태그를 기준으로 분기하십시오. 잘못된 멤버를 읽으면 쓰레기 값이 생성됩니다.
#include <iostream>
struct Tagged {
enum { Int, Double } tag;
union { int i; double d; };
};
void print(const Tagged& t) {
if (t.tag == Tagged::Int) std::cout << "int " << t.i << "\n";
else std::cout << "double " << t.d << "\n";
}
int main() { Tagged t{Tagged::Double}; t.d = 2.5; print(t); }비자명 멤버
생성자나 소멸자가 있는 멤버(예: std::string)를 유니온에 넣으려면 수동으로 생성하고 소멸시켜야 합니다. 이는 오류가 발생하기 쉬우므로 std::variant를 선호해야 하는 또 다른 이유입니다.
이름 없는 유니온
이름 없는 유니온에는 이름이 없으며, 멤버에 직접 접근합니다. 구조체 안에서 유용하지만, 동일한 활성 멤버 규칙이 적용됩니다.
#include <iostream>
struct Packet {
int kind;
union { int code; char letter; };
};
int main() {
Packet p; p.kind = 1; p.code = 99;
std::cout << p.code << "\n";
}유니온이 위험한 이유
위험 요소를 요약하면 다음과 같습니다:
- 어떤 멤버가 활성 상태인지 기억하지 않습니다.
- 비활성 멤버를 읽으면 정의되지 않은 동작이 발생합니다.
- 비자명 타입에는 수동으로 수명을 관리해야 합니다.
유니온이 여전히 유용한 경우
유니온은 저수준 작업에서 여전히 유용합니다. 예를 들어 바이트를 재해석하거나, 메모리가 제한된 임베디드 코드에서 메모리를 절약하거나, 고정된 이진 레이아웃에 맞출 때 사용할 수 있습니다. 일상적으로 "여러 타입 중 하나"를 나타내는 데이터에는 더 안전한 대안을 선호하십시오.
std::variant로 나아가기
std::variant는 활성 타입을 추적하는 타입 안전 유니온이며, 잘못된 타입에 접근하면 예외를 발생시킵니다. 이 과정의 나머지 부분에서 이를 살펴봅니다.
빠른 확인
유니온에 대한 이해를 확인해 보십시오.
복습
유니온에 대해 다음을 배웠습니다:
- 모든 멤버가 하나의 메모리 블록을 공유합니다.
- 마지막으로 쓴 멤버만 올바르게 읽을 수 있습니다.
- 태그(열거형)를 사용하여 활성 멤버를 추적합니다.
- 최신 C++에서는 안전성을 위해
std::variant를 선호하십시오.
자주 묻는 질문
“공용체와 그 위험성” 강의는 무료인가요?
네 — “공용체와 그 위험성” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 C++ Academy 강의 전체를 잠금 해제할 수 있습니다. C++ Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
“공용체와 그 위험성”에서 뭘 배우나요?
타입 간 메모리 공유하기 브라우저에서 직접 실행하는 실습 코드로 C++ Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
C++ Academy을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 C++ Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 2번째 강의입니다.
“공용체와 그 위험성” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 C++ Academy 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 C++ Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.