구조체와 예제
1. 주요 개념 및 내용
1.1. 구조체의 개요
1) 개념
-
배열:
동일한 데이터 타입을 갖는 자료들을 동일한 이름으로 묶어 놓은 것
예:int a[10];
(모두 정수형 데이터) -
구조체:
서로 다른 데이터 타입을 갖는 자료들을 동일한 이름으로 묶어 놓은 것
예:struct a {
int num;
char name[20];
};(정수와 문자열을 하나의 이름으로 묶음)
2) 구조체 선언
struct
키워드를 사용하여 구조체를 정의- 형식:
struct 구조체이름 {
멤버1;
멤버2;
...
};- 각 멤버 선언 후 세미콜론(
;
) 필요 - 구조체 선언 마지막에도 세미콜론(
;
) 필수
- 각 멤버 선언 후 세미콜론(
- 일반적으로
main()
함수 전에 선언 - 예시:
struct customer {
int num;
char name[20];
double point;
};
3) 구조체 변수 선언
- 선언된 구조체 형식을 사용하여 변수를 생성
- 형식:
struct 구조체이름 변수명;
- 초기화 형식:
struct customer a1 = {1, "kim hy", 109.99};
4) 구조체 멤버 접근
- 구조체 변수의 멤버에 접근할 때는 온점(
.
) 연산자 사용 - 형식:
구조체변수.멤버명
- 예시:
printf("num=%d name=%s point=%lf\n", a1.num, a1.name, a1.point);
5) 구조체 배열
- 여러 개의 구조체 인스턴스를 묶어 놓은 배열
- 형식:
struct 구조체이름 배열이름[크기];
- 초기화 형식:
struct student a[3] = { {100,90,80}, {90,90,80}, {100,100,100} };
- 배열 멤버 접근:
a[0].num, a[1].kor
1.2. typedef의 문법 이해
typedef
는 새로운 이름으로 명명하는 데 사용되는 키워드- 복잡하거나 긴 데이터 타입 이름에 간결한 별칭 부여
- 구조체와 함께 사용 예시:
또는
typedef struct student {
int num;
float kor;
} St;typedef struct {
int num;
float kor;
} St; - 사용 예:
St st;
- 다른 자료형에도 사용 가능:
typedef unsigned int ui;
1.3. 구조체의 다양한 활용
1) 구조체와 포인터 변수
- 구조체의 주소를 저장하는 포인터 변수 선언 가능
- 선언 형식:
struct 구조체이름 *포인터변수이름;
- 주소 할당 예시:
struct a *pTest;
struct a p = {1, 100.99};
pTest = &p;
2) 구조체 포인터와 ->
연산자
- 구조체 포인터를 통해 구조체 멤버의 값에 접근할 때 사용
- 두 가지 방법
- 간접 참조 연산자
*
와 온점.
사용:(*pTest).num
->
연산자 사용 (더 일반적이고 간결):pTest->num
- 간접 참조 연산자
- 예시:
printf("num=%d total=%lf\n", pTest->num, pTest->total);
3) 구조체와 함수
- 함수 호출 시 구조체 변수를 인자로 전달 가능
sum(t1);
- 함수 정의/사용 시 구조체 변수를 매개변수로 받을 수 있음
void sum(struct student a) { ... }
- 구조체 변수는 하나의 자료형으로 취급되어 함수 인자로 전달 시 하나의 단위로 처리
- 함수 내에서는 전달받은 구조체 형태의 지역 변수를 통해 멤버 직접 활용 가능
2. Visual Studio scanf 에러 해결 (_CRT_SECURE_NO_WARNINGS
)
- 에러 발생 이유:
시스템 안정성과 보안을 확보하기 위함으로,scanf
함수가 안전하지 않을 수 있다는 경고 발생 - 에러 메시지 예시:
error C4996: 'scanf': This function or variable may be unsafe. Consider using scanf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS.
- 해결 방법:
scanf_s
함수 사용 (권장)#define _CRT_SECURE_NO_WARNINGS
를 코드 상단에 추가- Visual Studio 프로젝트 설정 변경:
"프로젝트 > 속성 > 구성속성 > C/C++ > 전처리기"에서 ; 뒤에_CRT_SECURE_NO_WARNINGS
추가 #pragma warning(disable : 4996)
를 코드 상단에 추가
3. 학습 정리 (요약)
- 배열: 동일한 데이터 타입 묶음
예:int a[10];
- 구조체: 서로 다른 데이터 타입 묶음
예:struct a { int num; char name[20]; };
- 구조체 선언:
struct
키워드, 멤버 나열, 마지막 세미콜론 필수 - 구조체 변수 선언:
초기화:
struct 구조체이름 변수명;
{값, 값, ...}
- 구조체 멤버 접근:
구조체변수.멤버명
- 구조체 배열:
초기화:
struct 구조체이름 배열이름[크기];
{ {,,},{..},... }
- 구조체와 포인터:
구조체의 주소를 저장하는 포인터 선언 가능struct 구조체이름 *포인터변수;
- 포인터 멤버 접근:
(*포인터변수).멤버
포인터변수->멤버
(권장)
- 구조체와 함수:
구조체 변수를 함수 인자로 전달하거나 반환할 수 있음void test(struct a aa, struct a bb)