본문 바로가기
개념/혼자 공부하는 C언어

chapter 17) 공동체를 사용한 학번과 학점 데이터 처리

by kiseno 2024. 9. 26.
728x90
반응형
SMALL
#include <stdio.h>

union student{
    int num;
    double grade;
};

int main(void){
    union student s1 = {315};

    printf("class : %d\n", s1.num);
    s1.grade = 4.4;
    printf("class : %.1lf\n", s1.grade);
    printf("grade : %d\n", s1.num);

    return 0;
}

### `union`의 특징과 사용

- `union student s1 = {315};`로 `union`을 초기화할 때, `num` 멤버에 315를 할당합니다. 이 시점에서 `s1`의 `num` 멤버만 유효한 값으로 설정됩니다.
- `printf("class : %d\n", s1.num);`에서 `s1.num`의 값을 출력하면, 정상적으로 315가 출력됩니다.
- `s1.grade = 4.4;`로 `s1`의 `grade` 멤버에 값을 할당하면, `union`의 특성상 `num`과 `grade`가 동일한 메모리 위치를 공유하기 때문에, 이전에 `num`에 할당했던 값은 더 이상 유효하지 않게 됩니다.
- `printf("class : %.1lf\n", s1.grade);`에서 `s1.grade`의 값을 출력하면, 정상적으로 4.4가 출력됩니다.
- 그러나 마지막 `printf("grade : %d\n", s1.num);`에서 `s1.num`을 다시 출력하려고 하면, 예상치 못한 값이 출력됩니다. 이는 `grade`에 `4.4`를 할당한 후, `num`과 `grade`가 공유하는 메모리 공간에 `4.4`의 `double` 타입 데이터가 저장되어 있기 때문입니다. `int`로 해석하려고 하면, 해당 `double` 값의 비트 패턴을 `int` 타입으로 해석한 결과가 출력되기 때문에, 원래의 `315`와는 전혀 다른 값이 나옵니다.

### 주의사항

- `union`은 여러 멤버가 동일한 메모리 공간을 공유하기 때문에, 한 번에 하나의 멤버만 사용해야 합니다. 한 멤버에 값을 할당한 후 다른 멤버를 사용하면, 이전에 할당했던 값이 손실될 수 있습니다.
- 코드에서 보여주는 것처럼, `union`의 다른 멤버를 통해 메모리를 재해석할 때는 주의해야 합니다. 다른 타입의 멤버로 값을 해석하려고 하면 예상치 못한 결과가 발생할 수 있습니다.

728x90
반응형
LIST