728x90

 

구조체(Structure)

  • 사용자가 C언어의 기본 타입을 가지고 새롭게 정의할 수 있는 사용자 정의 타입
  • 기본 타입만으로는 나타낼 수 없는 복잡한 데이터를 표현할 수 있다.

 

  • 멤버 변수 (member vaiable) : 구조체를 구성하는 변수

 

배열 🆚 구조체

  • 배열 : 같은 타입의 변수 집합
  • 구조체 : 다양한 타입의 변수 집합

 

구조체 정의와 선언

struct student {
		int number;
		char name[10];
		double grade;
};                      // 구조체 정의

int main(void){
		struct student s1;  // 구조체 변수 선언
	...
}

 

이름 없는 구조체 선언

  • 구조체를 정의할 때 태그 이름을 생략할 수 있다.
  • 이 경우 구조체의 이름이 없으므로 구조체 변수를 구조체 정의와 함께 선언한다.
  • 그러나 같은 구조체가 필요해서 태그가 없으므로 재사용이 불가하다!

 

구조체의 초기화

struct student {
		int number;
		char name[10];
		double grade;
};

struct student s1 = {24, "kim", 4.3}; // 구조체 초기화

 

구조체 멤버 참조

  • . 연산자를 사용하여 멤버에 접근한다!

 

Ex1. 구조체를 이용한 학생 정보 출력 프로그램
#include <stdio.h>
#include <string.h>

struct student
{
	int number;
	char name[10];
	double grade;
};

int main(void)
{
	struct student s;

	s.number = 20190001;
	strcpy(s.name, "김픠픠");
	s.grade = 4.3;

	printf("학번: %d\n", s.number);
	printf("이름: %s\n", s.name);
	printf("학점: %.1f\n", s.grade);
	return 0;
}

 

Ex2. 점과 점 사이의 거리 계산 프로그램
#include <stdio.h>
#include <math.h>

struct point {
	int x;
	int y; 
};

int main(void) {
	struct point p1, p2;
	int xdiff, ydiff;
	double dist;

	printf("점의 좌표를 입력하시오(x, y): ");
	scanf("%d, %d", &p1.x, &p1.y);

	printf("점의 좌표를 입력하시오(x, y): ");
	scanf("%d, %d", &p2.x, &p2.y);
	
	xdiff = p1.x - p2.x;
	ydiff = p1.y - p2.y;

	dist = sqrt((double)(xdiff * xdiff + ydiff * ydiff));
	printf("두 점사이의 거리는 %f입니다.\n", dist);
	return 0;
}

 

구조체를 멤버로 가지는 구조체

struct date {				// 구조체 선언
	int year;
	int month;
	int day;
};

struct student {			// 구조체 선언
		int number;
		char name[10];
		struct date dob;	// 구조체 안에 구조체 포함
		double grade;
};
struct	student s1;		// 구조체 변수 선언

s1.dob.year = 2021;		// 멤버 참조
s1.dob.month = 06;
s1.dob.day = 21;

💡 구조체 속에 구조체를 멤버로 가질 수 있다!
└ 동일하게 . 연산자를 사용하여 접근한다

 

구조체 변수의 대입과 비교

#include <stdio.h>

struct point {
	int x;
	int y;
};

int main(void)
{
	struct point p1 = {10, 20};
	struct point p2 = {30, 40};

	p2 = p1; // 대입 가능

	if (p1 == p2) // ERROR 발생 !
		printf("p1와 p2이 같습니다.");

	if ((p1.x == p2.x) && (p1.y == p2.y)) // 올바른 비교
		printf("p1와 p2이 같습니다.");
}

📢 구조체 변수에 구초체 대입은 가능하지만 비교는 불가하다!

 

💡 구조체 멤버끼리의 비교는 가능하다!

 

구조체 배열

: 구조체를 여러개 모은 것

 

struct student {
	int number;
	char name[20];
	double grade;
}; 

int main(void)
{
	struct student list[100];	// 구조체의 배열 선언


	list[2].number = 24;
	strcpy(list[2].name, "kim");
	list[2].grade = 4.3;
}

 

Ex3. 구조체 배열을 이용한 학생 정보 출력 프로그램
#include <stdio.h>

struct student {
	int number;
	char name[20];
	double grade;
}; 

int main(void) {
	struct student list[3];
	int x;

	for(x = 0; x < 3; x++) {
		printf("%d번 학생의 학번을 입력하시오 : ", x + 1);
		scanf("%d", &list[x].number);
		printf("%d번 학생의 이름을 입력하시오 : ", x + 1);
		scanf("%s", list[x].name); // 멤버 변수가 배열이므로 '&'기호는 사용하지 않는다.
		printf("%d번 학생의 학점을 입력하시오 : ", x + 1);
		scanf("%lf", &list[x].grade);
	}

	for(x = 0; x< 3; x++)
	       printf("%d번. 학번 : %d, 이름 : %s,  학점 : %.1f\n", x + 1, list[x].number, list[x].name, list[x].grade);
	return 0;
}

 

구조체와 포인터

  • 구조체를 가리키는 포인터
  • 포인터를 멤버로 가지는 구조체

 

구조체를 가리키는 포인터

#include <stdio.h>

struct student {
	int number;
	char name[20];
	double grade;
};

int main(void)
{
	struct student s = {20190001, "Kim", 4.3};
	struct student *p;
	p = &s;
	printf("학번 = %d 이름 = %s 학점 = %.1f \n", s.number, s.name, s.grade);
	printf("학번 = %d 이름 = %s 학점 = %.1f \n", (*p).number, (*p).name, (*p).grade);
	return 0;
}

 

  • -> 연산자를 사용하여 구조체 포인터로 구조체 멤버를 참조할 때 사용한다.


포인터를 멤버로 가지는 구조체

struct date {
	int month;
	int day;
	int year;
};

struct student {
	int number;
	char name[20];
	double grade;
	struct date *dob;
}; 

int main(void) {
	struct date d = { 6, 21, 2021 };
	struct student s = { 20190001, "Kim", 4.3 };

	s.dob = &d;

	printf("학번: %d\n", s.number);
	printf("이름: %s\n", s.name);
	printf("학점: %f\n", s.grade);
	printf("생년월일: %d년 %d월 %d일\n", s.dob->year, s.dob->month, s.dob->day);
	return 0;
}

 

 


공용체(union)

union example {
	char c;
	int x;
};
  • 같은 메모리 영역을 여러 개의 변수가 공유
  • 공용체를 선언하고 사용하는 방법은 구조체와 비슷하다.

💡 구조체에 비해 메모리를 효율적으로 사용할 수 있다!

 

Ex4.
#include <stdio.h>

union example {
	int i;
	char c;
};

int main(void)
{
	union example uni;

	uni.c = 'A';
	printf("uni.c:%c   uni.i:%i\n", uni.c, uni.i );

	uni.i = 10000;
	printf("uni.c:%c   uni.i:%i\n", uni.c, uni.i); // 각 메모리 공간이 개별적으로 인식
	return 0;
}

 


열거형(enum)

  • 변수가 가질 수 있는 값들을 미리 열거해놓은 자료형
  • 오류를 줄이고 가독성을 높일 수 있다.

enum colors { white, red, blue, green, black };
enum boolean { false, true };
enum levels { low, medium, high };
enum car_types { sedan, suv, sports_car, van, pickup, convertible };



열거형의 초기화

enum days { SUN, MON, TUE, WED, THU, FRI, SAT };	// SUN=0, MON=1, ...
enum days { SUN=1, MON, TUE, WED, THU, FRI, SAT };	// SUN=1, MON=2, ...
enum days { SUN=7, MON=1, TUE, WED, THU, FRI, SAT=6 };// SUN=7, MON=1, ...

💡 값을 지정하지 않으면 0부터 할당된다!

 

Ex5.
#include <stdio.h>

enum days { SUN, MON, TUE, WED, THU, FRI, SAT };
char *days_name[] = { "sunday", "monday", "tuesday", "wednesday", "thursday", "friday", "saturday" };

int main(void)
{
	enum days d;

	d = WED;
	printf("%d번째 요일은 %s입니다\n", d, days_name[d]);
	return 0;
}

 


자료형 재정의(typedef)

  • 기본 자료형에 새로운 자료형을 추가하는 것

 

구조체 재정의

struct point {
	int x;
	int y;
};
typedef struct point POINT;
POINT a, b;

 


전처리기 지시자(#define)

// #define 전처리기 지시자
#define Pi 3.14									// Pi : 매크로 상수
#define Swap(x, y) { int t; t=x; x=y; y=t; } 	// Swap : 매크로 함수
#define Square(x) x*x
#define P(x) printf("x = %d \n", x);			// P(9);
#define PP(x) printf(#x “  = %d \n”, x);		// PP(5 + 7);

💡 일종의 매크로이다!

 

 

 

 

 


 

 

 

 

구조체

구조체(Structure)

www.notion.so

 

아래 노션 페이지에 C 공부 내용에 대해 업로드 합니다!

수정사항이나 질문사항의 경우 노션 댓글로 남겨주세요!(*•̀ᴗ•́*)و ̑̑

 

 

 

C 언어 이론 정리

조건문, 반복문 사용 시 중괄호로 명령문들 묶어주기 - 명령문 1개일 때 포함 (코드 수정 시 오류 방지)

www.notion.so

 


 

개발 환경

Visual Studio 2019
Visual Studio Code

작성 플랫폼

Notion

 

728x90