본문 바로가기

윤성우의 C Programming

Chapter 22. 구조체와 사용자 정의 자료형1 (1)

1. 구조체란 무엇인가? 

구조체의 정의

엑셀의 사용자 정의 함수는 기존에 없는 함수를 사용자가 직접 만들어서 사용하는 함수이다. 구조체도 이와 비슷하다. 구조체라는것은 하나 이상의 변수(포인터 변수와 배열 포함)를 묶어서 새로운 자료형을 정의하는 도구이다. 

#include <stdio.h>

// 구조체 정의
struct Person {
    char name[50];
    int age;
    char gender;
};

구조체 변수의 선언과 접근 

Person 구조체에는 name, age,gender 변수 멤버들이 포함되어있다. 이러한 변수 멤버들의 값을 저장하는 곳이 구조체 변수이다.  

#include <stdio.h>

// 구조체 정의
struct Person {
    char name[50];
    int age;
    char gender;
};

int main() {
    // 구조체 변수 생성 및 초기화
    struct Person person1 = {"John", 25, 'M'};
    struct Person person2 = {"Emily", 30, 'F'};

 

struct Person person1 안에 있는 "John" 멤버 변수에 접근하고 싶으면 어떻게 해야 할까?

접근의 기본형식은 다음과 같다. 

# 문법
구조체 변수의이름. 구조체 멤버의 이름

# 예시
person1.name
#include <stdio.h>

// 구조체 정의
struct Person {
    char name[50];
    int age;
    char gender;
};

int main() {
    // 구조체 변수 생성 및 초기화
    struct Person person1 = {"John", 25, 'M'};
    struct Person person2 = {"Emily", 30, 'F'};
    
    // 구조체 변수 출력
    printf("Person 1:\n");
    printf("Name: %s\n", person1.name);
    printf("Age: %d\n", person1.age);
    printf("Gender: %c\n", person1.gender);
    
    printf("\nPerson 2:\n");
    printf("Name: %s\n", person2.name);
    printf("Age: %d\n", person2.age);
    printf("Gender: %c\n", person2.gender);
    
    return 0;
}

구조체의 변수로 배열이 선언되는 경우 vs 포인터 변수가 선언되는 경우 

배열 형태의 구조체 변수에 접근하기 위해서는 배열의 접근 방식을 취하면 된다. 예를 들어 배열 구조체 변수에 값을 저장할 때는 strcpy 함수를 사용하고 scanf 로 값을 받을 때에도 배열의 이름 앞에는 & 연산자를 사용하지 않는다. 

반대로 포인터 형태의 구조체 변수에 접근할 때는 scanf 로 값을 받을 때 포인터 이름 앞에 & 연산자를 붙인다. 

#define _CRT_SECURE_NO_WARNINGS

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

struct Person
{
	char First_name[20];
	char Last_name[20];
	int age;
};

int main(void)
{
	struct Person person1, person2;
	strcpy(person1.First_name, "Carpenter");
	strcpy(person1.Last_name, "James");
	strcpy(person2.First_name, "Elizabeth");
	strcpy(person2.Last_name, "Christine");
	person2.age = 25;

	printf("Input First Name: "); scanf("%s", person1.First_name);
	printf("Input Last Name : "); scanf("%s", person1.Last_name);
	printf("Input Age: "); scanf("%d", &(person1.age));
	
	printf("나의 이름은 %s,", person1.Last_name);
	printf("%s 이고 ", person1.First_name);
	printf("나이는 %d 입니다. \n", person1.age);
	printf("너의 이름은 %s,", person2.Last_name);
	printf("%s 이고,", person2.First_name);
	printf("나이는 %d 입니다.\n", person2.age);

	return 0;
}

 

구조체 변수의 초기화

int형 변수를 선언과 동시에 초기화할 수 있듯이 구조체 변수도 선언과 동시에 초기화 할 수 있다. 초기화가 아닌 경우는 문자열을 저장하기 위해 strcpy를 사용해야 했지만 초기화 과정에서는 문자열 저장을 위해서 strcpy 함수를 호출하지 않아도 된다. 

#include <stdio.h>

struct point
{
	int xpos;
	int ypos;
};

struct person
{
	char name[20];
	char phoneNum[20];
	int age;
};

int main(void)
{
	struct point pos = { 10,20 };
	struct person man = { "이승기", "010-1111-2222",21 };
	printf("%d %d \n", pos.xpos, pos.ypos);
	printf("%s %s %d \n", man.name, man.phoneNum, man.age);
	return 0;
}