Developer

20.(C언어) 구조체(1) 본문

Programming Language/C

20.(C언어) 구조체(1)

DPhater 2020. 8. 1. 21:49

구조체란 서로 다른 자료형의 여러 변수들을 하나의 묶음으로 사용할 수 있게 해준다. 기본 자료형을 조합해서 새로운 자료형을 만든다고 생각하면 된다.학생의 정보를 관리하기 위해 구조체를 사용해 보자. 정보 항목은 이름, 전화번호, 학번 3가지만 하겠다.

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

struct Student{
	char name[30];            //이름 
	char phone_number[30];    //전화번호 
	int student_id;           //학번 
};

int main(){
	struct Student s;
	
	strcpy(s.name,"김모군");
	strcpy(s.phone_number,"010-xxxx-xxxx");
	s.student_id=123456;
	
	printf("%s\n",s.name);
	printf("%s\n",s.phone_number);
	printf("%d\n",s.student_id);
	return 0;
}

코드1 실행 결과

struct Student{
	char name[30];            //이름 
	char phone_number[30];    //전화번호 
	int student_id;           //학번 
};

main 함수 밖의 이 부분이 바로 구조체를 정의하는 부분이다. struct는 구조체를 정의하기 위한 키워드 이고 Student는 구조체의 이름(태그)이다. 그리고 중괄호 내부에 선언된 변수들을 해당 구조체의 멤버라고 한다. 그리고 닫는 중괄호에는 세미콜론을 반드시 작성해야 한다.

그림과 같이 이름, 전화번호, 학번을 묶어서 Student라는 구조체(struct)를 만든것이다. 새로운 자료형을 하나 만들었다고 생각하면 이해하기 쉬울것이다.

struct Student s;

main 함수의 처음에 작성되어 있는 코드이다. 위에서 구조체를 정의 했으니 이제 구조체 변수를 선언해 주는 것이다. 조금전에 언급했듯이 struct Student를 하나의 자료형이라고 생각하면쉽다. 변수의 선언은 자료형 변수이름; 과 같이 하는 것을 우리는 이미 알고있다. 구조체도 똑같이 변수를 선언하면된다. 위의 코드는 Student구조체 타입의 변수 s를 선언하겠다는 뜻이다.

	strcpy(s.name,"김모군");
	strcpy(s.phone_number,"010-xxxx-xxxx");
	s.student_id=123456;
    
    printf("%s\n",s.name);
	printf("%s\n",s.phone_number);
	printf("%d\n",s.student_id);

구조체 변수를 선언했으니 이제 사용을 해보자. 구조체의 멤버는 .(점) 을 사용한다.

구조체변수.멤버이름 과 같은 방식으로 구조체 멤버에 접근할 수 있다.

구조체 별칭

코드1에서는 구조체 변수를 1개만 선언해서 상관이 없지만

만약 여러개의 변수를 선언해야 할경우 struct 구조체태그 변수이름; 과 같이 변수를 선언하는건 너무 길어지고, 귀찮다. 이럴경우 typedef를 사용해 구조체 별칭을 지정해주고, struct키워드 없이 구조체 별칭을 이용해 구조체 변수를 선언할 수 있다. typedef는 자료형의 별칭을 만드는 기능인데

typedef 자료형 별칭;

과 같이 사용한다.

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

typedef struct Student{
	char name[30];            //이름 
	char phone_number[30];    //전화번호 
	int student_id;           //학번 
}Student;

int main(){
    Student s;

	strcpy(s.name,"김모군");
	strcpy(s.phone_number,"010-xxxx-xxxx");
	s.student_id=123456;
	
	printf("%s\n",s.name);
	printf("%s\n",s.phone_number);
	printf("%d\n",s.student_id);
	return 0;
}

위의 코드의 실행 결과는 코드1과 완전히 똑같다. 코드상 다른 부분은 구조체 정의 부분과 구조체 변수 선언 부분이다.

 

typedef struct Student{
	char name[30];            //이름 
	char phone_number[30];    //전화번호 
	int student_id;           //학번 
}Student;

구조체에 typedef사용 방법은 구조체정의 맨 앞에 typedef를 작성해주고 세미콜론 전에 구조체 별칭을 작성하면 된다. 위의 코드에서는 구조체 태그와 별칭을 똑같이 작성하였다. 위와 같이 똑같이 작성해도되고 구조체 이름(태그)에 _ , tag 등을 붙여 태그와 별칭을 구분해주기도 한다.

Student s;

별칭을 지정해줬으므로 구조체 변수 선언시 struct 키워드 없이 별칭으로 변수 선언이 가능하다. 구조체 정의 부분과 변수 선언 부분을 제외하면 별칭없는 구조체와 사용법은 동일하다.

또한 typedef로 구조체를 정의할때 구조체 태그를 생략할 수 있다.

이러한 구조체를 익명 구조체라한다.

typedef struct{     //태그 생략
	char name[30];            //이름 
	char phone_number[30];    //전화번호 
	int student_id;           //학번 
}Student;

 

구조체 초기화

구조체는 변수 선언과 동시에 값을 초기화할 수 있다.

Student s={.name="김모군", .phone_number="010-xxxx-xxxx", .student_id=123456};

Student s={"김모군", "010-xxxx-xxxx",123456};

위의 코드와 같이 구조체를 선언과 동시에 초기화 할 수 있다.

단 두번째 방법의 경우 멤버 순서대로 값을 작성해야하며 반드시 처음부터 순서대로 값을 채워야한다.

정리

1.구조체 정의 방법 :

struct 태그{

자료형 멤버이름;

자료형 멤버이름;

자료형 멤버이름;

};

2.구조체 변수 선언 방법 :

struct 구조체태그 변수이름;

3.구조체 멤버 접근 방법 :

변수이름.멤버이름;

4.typedef로 구조체 정의 방법 :

typedef struct 태그{

자료형 멤버이름;

자료형 멤버이름;

자료형 멤버이름

}별칭;

5.구조체 별칭으로 변수 선언 방법 :

별칭 변수;

visual studio에서 코드를 실습할 경우 strcpy때문에 컴파일 에러가 뜰것입니다.

#define _CRT_SECURE_NO_WARNINGS 를 코드 맨 위에 작성해 주세요.

'Programming Language > C' 카테고리의 다른 글

22.(C언어) 구조체(3)  (0) 2020.08.01
21.(C언어) 구조체(2)  (0) 2020.08.01
19.(C언어) 문자열 함수  (0) 2020.08.01
18.(C언어) 문자열  (0) 2020.08.01
17(C언어) 동적할당  (0) 2020.08.01
Comments