C 언어에서 구조체(struct) 변수에는 어떤 연산을 적용할 수 있을까요? 결론부터 말하면, 구조체 변수에 기본적으로 허용되는 연산은 대입(assignment) 연산뿐입니다. 두 구조체를 비교하는 동등성 검사(==)나 기타 다른 연산자는 구조체에 직접 사용할 수 없습니다.
구조체 대입 연산 예제
아래 예제는 복소수를 표현하는 구조체를 정의하고, 각 구조체 변수에 값을 초기화한 뒤 출력하는 코드입니다.
#include <stdio.h>
typedef struct { // 복소수 객체를 위한 구조체 정의
int real, imag;
} complex;
void displayComplex(complex c){
printf("(%d + %di)\n", c.real, c.imag);
}
main() {
complex c1 = {5, 2};
complex c2 = {8, 6};
printf("Complex numbers are:\n");
displayComplex(c1);
displayComplex(c2);
}실행 결과
Complex numbers are: (5 + 2i) (8 + 6i)
이 코드는 정상적으로 동작합니다. 구조체 변수를 선언하면서 중괄호 { }를 이용해 초기화했기 때문입니다. 또한 이미 값이 설정된 구조체 변수를 다른 변수에 통째로 대입하는 것도 가능합니다.
구조체 비교 연산 시 발생하는 문제
그렇다면 두 구조체 객체가 같은지 비교하려면 어떻게 될까요? 아래 예제에서 직접 확인해 보겠습니다.
#include <stdio.h>
typedef struct { // 복소수 객체를 위한 구조체 정의
int real, imag;
} complex;
void displayComplex(complex c){
printf("(%d + %di)\n", c.real, c.imag);
}
main() {
complex c1 = {5, 2};
complex c2 = c1; // 구조체 대입은 가능
printf("Complex numbers are:\n");
displayComplex(c1);
displayComplex(c2);
if(c1 == c2){ // 구조체끼리 == 비교는 불가능
printf("Complex numbers are same.");
} else {
printf("Complex numbers are not same.");
}
}컴파일 결과
[Error] invalid operands to binary == (have 'complex' and 'complex')
위와 같이 컴파일 에러가 발생합니다. C 언어에서는 구조체 타입의 피연산자에 대해 == 연산자를 사용할 수 없기 때문입니다. 즉, c1 == c2처럼 구조체 전체를 한 번에 비교하는 것은 문법적으로 허용되지 않습니다.
구조체 비교가 안 되는 이유와 해결 방법
구조체 내부에는 패딩(padding) 바이트가 포함될 수 있고, 멤버 구성이 다양하기 때문에 C 표준에서는 구조체 단위의 비교 연산을 지원하지 않습니다. 따라서 두 구조체가 같은지 확인하려면 멤버별로 하나씩 비교해야 합니다.
if(c1.real == c2.real && c1.imag == c2.imag){
printf("Complex numbers are same.");
} else {
printf("Complex numbers are not same.");
}정리
- 구조체 변수는 대입 연산(=)이 가능합니다. 선언과 동시에 초기화하거나, 다른 구조체 변수를 통째로 복사할 수 있습니다.
==,!=같은 비교 연산은 구조체에 직접 사용할 수 없습니다.- 구조체를 비교하려면 각 멤버를 개별적으로 비교하는 함수를 직접 작성해야 합니다.