Fascination
article thumbnail
Published 2021. 8. 25. 22:36
[DS] 구조체 Study/Data Structure

# 구조체

- 구조체는 자료형이 상이한 복수의 멤버들을 하나의 자료로 묶어 처리할 수 있는 복합 자료형

- 선언 위치: 전처리기와 main 사이

- 예약어: struct

- 예시: 나이(age), 학년(grade), 전공(major) 세 개의 멤버를 갖는 학생(student) 구조체를 정의

// 구조체의 선언 1. 구조체의 이름을 줄 수 있음
struct student {
	int age;
	int grade;
	char major[20]
}kim, lee;

// 구조체의 선언 2. 구조체 이름을 생략하고 구조체 변수를 생성
struct {
	int age;
	int grade;
	char major[20];
}kim, lee;

// 구조체의 선언 3. 구조체 변수명이 생략되어 선언된 경우 --> struct 키워드를 붙여 선언해야 함
struct studnet {
	int age;
	int grade;
	char major[20];
};
struct studnet kim, lee;

 

- 구조체 변수를 통하여 멤버에 값을 저장할 때는 점(.) 연산자를 이용함

student.grade = 3;
strcpy(kim.major, "Computer Science")

 

 

# 구조체 자료형 선언

- typedef 키워드: 긴 자료형 이름을 짧은 이름으로 대체하여 구조체 변수를 선언할 수 있게 해줌

// typedef를 사용한 구조체 선언 1
typedef struct student_type {
	char name[10];
	int grade;
	char major[20];
} student;

// typedef를 사용한 구조체 선언 2
typedef struct {
	char name[10];
	int grade;
	char major[20];
}student;

student kim, lee;

 

 

 

# 구조체의 할당과 비교

- 동일한 내용을 가지는 구조체 변수라도 각각 선언되었다면 할당할 수 없음

struct {
	int id;
	char name[15];
	int score;
} kim = {1234567, “Kim”, 90}; 

struct {
	int id;
	char name[15];
	int score;
} kim2;

kim2 = kim;	// 컴파일 에러

 

- 동일한 자료형의 구조체 변수 간에 직접적인 할당 명령문은 허용

student kim, lee;
kim = lee;  // 가능

 

 

- 구조체 변수 간 직접 비교는 허용되지 않음

> student_equal 함수와 같이 구조체 멤버별로 일치 여부를 비교해주어야 함

if(kim==lee) // ERROR

// student_equal
int student_equal(student kim, student lee) {
	if (strcmp(kim.name, lee.name)) return FALSE;
	if (kim.age != lee.age) return FALSE;
	if (kim.grade != lee.grade) return FALSE;
	return TRUE;
}

* strcmp: 값이 다르면 1, 같으면 0을 반환

 

 

# 내장형 구조체

- 내장형 구조체: 다른 구조체 변수를 멤버로 갖는 구조체

- 예시: 구조체 생성 프로그램

 

[코드]

#include<stdio.h>
#include<string.h>

typedef struct Contact_type {
	char phone[20];
	char email[20];
	char address[20];

}Contact;


typedef struct Student_type {
	char name[20];
	int age;
	char major[20];
	int grade;
	Contact contact;
}Student;

void main() {
	Student kim;

	strcpy(kim.name, "Bruce Lee");
	kim.age = 22;
	strcpy(kim.major, "Computer Science");
	kim.grade = 3;
	strcpy(kim.contact.phone, "010-1234-5678");
	strcpy(kim.contact.email, "kim@naver.com");
	strcpy(kim.contact.address, "Seoul, Korea");

	printf("name: %s\n",kim.name);
	printf("age: %d\n", kim.age);
	printf("major: %s\n", kim.major);
	printf("grade: %d\n", kim.grade);
	printf("phone: %s\n", kim.contact.phone);
	printf("email: %s\n", kim.contact.email);
	printf("address: %s\n", kim.contact.address);
}

 

[실행결과]

 

 

profile

Fascination

@euna-319

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!