본문으로 건너뛰기

구조체와 예제

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.
  • 해결 방법:
    1. scanf_s 함수 사용 (권장)
    2. #define _CRT_SECURE_NO_WARNINGS를 코드 상단에 추가
    3. Visual Studio 프로젝트 설정 변경:
      "프로젝트 > 속성 > 구성속성 > C/C++ > 전처리기"에서 ; 뒤에 _CRT_SECURE_NO_WARNINGS 추가
    4. #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)