0Pricing
C++ Academy · 강의

공용체와 그 위험성

타입 간 메모리 공유하기

공용체와 그 위험성은(는) 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 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. 스코프가 지정된 enum class
  2. 공용체와 그 위험성
  3. std::variant
  4. std::visit
← C++ Academy(으)로 돌아가기