본문 바로가기

programming language/C 언어

구조체의 비교

#include <stdio.h>

struct point {
int x;
int y;
};


int main(void)
{
struct point p1;
struct point p2;

p1.x = 30;
p1.y = 10;

p2.x = 30;
p2.y = 10;

if (p1 == p2)
{
printf(" p1과 p2가 같습니다.");  
}
return 0;
}

이 코드는 오류가 발생하는데, 그 이유는 : 구조체는 아무리 같은 구조체 타입(struct point)이라 하더라도, 두 개의 변수 자체를 직접 비교하는 것은 불가능하다.!!


#include <stdio.h>


struct point {
int x;
int y;
};


int main(void)
{
struct point p1;
struct point p2;

p1.x = 30;
p1.y = 10;

p2.x = 30;
p2.y = 10;

//2개를 정확하게 비교하려면 다음과 같이 비교해줘야 한다.

if((p1.x == p2.x) && (p1.y == p2.y))
{
printf("p1과 p2가 같다");       
}
return 0;
}

 

if((p1.x == p2.x) && (p1.y == p2.y))
{
printf("p1과 p2가 같다");       

}

이경우가 올바른 판단이다. 왜냐하면 point의 경우 좌표평면상에서 하나의 점을 의미한다고 했기 때문이다.

그 점들(p1 , p2)의 x좌표 y좌표를 비교하는 것이 올바르다.

 

위 예제들을 통해 구조체 자체는 그대로 비교를 못한다는 것을 이해할 수 있고, 각 구조체 별로 특징을 잡아 비유하는 부분을 따로 만들 터줘야 한다는 것을 알 수 있다.


 

#include <stdio.h>

struct point {
int x;
int y;
};
 
void comparepoint(struct point p1, struct point p2) { 
if ((p1.x == p2.x) && (p1.y == p2.y))                    
{
printf("p1과 p2가 같다");     
}
}

int main(void)
{

struct point p1;
struct point p2;

p1.x = 30;
p1.y = 10;

p2.x = 30;
p2.y = 10;
comparepoint(p1, p2);

return 0;
}

 

void comparepoint(struct point p1, struct point p2) :  함수를 만들어 줄 수 있다. 따로 만들어 관리할 수 있는 것이고, 이런 식으로 하는것이 훨씬 더 합당하다. 실제로 이런식으로 많이 구현이 된다.

 

if ((p1.x == p2.x) && (p1.y == p2.y))                   
printf("p1과 p2가 같다");     

 이것이 main함수에 잇는 것보다 훨씬 더 체계적으로 보인다. 왜냐하면 포인트(point)라는 구조체 하나만을 비교하는

 함수에 들어가는 것이기 때문이다.

 

 comparepoint(p1, p2);  : 메인 함수에서 이걸 사용만 해주면 되는 설계적으로 깔끔한 구조가 이루어진다.

 

<함수의 이해>

void comparepoint(struct point p1, struct point p2)의 함수는 인자 전달은 하고, 반환 값은 없는 형태의 함수이다.

반환형이 void로 선언되었고 여기서 사용된 void는 '반환하지 않는다.'라는 뜻이 담겨있다.

실제로 위 예제를 보면 함수의 몸체 부분에 return문이 없음을 알 수 있다.(반환하지 않기 때문에)

인자를 전달받는 매개변수 위치에 struct point p1, p2 가 있는데, struct point형 p1, p2를 전달받겠다고 생각해주면 될 것 같다.

 


  밑의 예제는 많은 프로그램들에서 실질적으로 활용되는 예제이다.

 다양한 자료구조나 프로젝트에서 사용되는 방법 중하나 인데,
 바로 구조체의 배열이다. 실제로 다양한 데이터를 구조체의 배열을 통해 관리하는 것이 아주 일반적이다.

 

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#define SIZE 5  

struct student {
int number;
char name [20];    한글 이름으로는 10글자까지 가능.
double grade;     GPA >>학점
};

int main(void)
{
struct student list [SIZE];
int i;


*이 부분은 데이터를 넣는 부분이다*

 

for (i = 0 ; i < SIZE ; i++)  한 명의 학생마다 이름 학점 등을 입력받을 수 있게 반복적으로 실행
{
printf("학번을 입력하세요: ");. 
scanf("% d", &list [i]. number);   구조체의 첫 번째 인덱스에 해당하는 학생의 학번을 입력받겠다.
printf("이름을 입력하세요: ");
scanf("% s", &list [i]. name);
printf("학점을 입력하세요: ");
scanf("% lf", &list [i]. grade);      double은 입력받을 때 lf로 받는다

};
(디버깅 후 입력창에서) 이 부분이 모두 끝날 때쯤에는 5명의 학생들 정보가 저장이 되어있을 것이고, 이 정보는 이 프로그램상에서 저장이 되어있는 것이다. 구체적으로 말하자면 우리 Ram에 올라가 있는 이 프로그램에 저장이
되어있는 것이기 때문에, 정확히 ram에 학생들의  정보가 일시적으로 저장이 되어있는 것이라 말할 수 있다.
for (i = 0; i < SIZE; i++)
{
printf("학번 : % d, 이름: % s, 학점:%lf\n", list [i]. number, list [i]. name, list [i]. grade);  
}
return 0;
}
*이 부분이 데이터를 출력하는 부분이라 할 수 있다*

 

<정리>

#define SIZE 5  : SIZE는 우리가 사용해 볼 프로그램에서 학생 구조체를 다루는데 그 학생의 총명수를 SIZE로 잡고 진행해본다.

 

struct student list [SIZE];  : 리스트라는 이름의 구조체 배열을 만들어준다. 어떤 구조체냐면 struct student라는 구조체이고, 즉 학생 구조체를 list로 만들어준 것이다.

 

scanf("% s", &list [i]. name); : &연산자를 붙이지 않아도 된다.

struct student의 구조체 안, name 문자열 때문이라 할 수 있다.

배열은 그 자체로 포인터의 의미를 가지고 있기 때문에 해당 배열의 주소 자체를 의미하고 있고, 따로 주소를 가리키는 &를 넣을 필요가 없는 것이다.(c언어 구조체의 이해 part참고)

 

 

동빈나 유튜브 채널을 통해 공부하고, 내 나름대로 이해를 덧붙여 정리 해 보았다.

RAM 에 관해 얼핏 알지만, 공부하던 중 궁금증이 생겨 더 알아 보기로 했다.