#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 에 관해 얼핏 알지만, 공부하던 중 궁금증이 생겨 더 알아 보기로 했다.