Notice
Recent Posts
Recent Comments
Link
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

Trivia

7강.구조체(1) 본문

C언어/C프로그래밍 기초(2학기)

7강.구조체(1)

Vloom 2018. 11. 21. 10:47

7.1 구조체란?


▶C언어의 자료형


1. 기본 자료형: char, int, double 등

2. 파생 자료형: 배열, 포인터, 구조체, 열거형, 공용체 등

cf1) 서로 다른 형태의 데이터 결합이 매우 유용 

cf2) 여러 개의 자료형을 묶어서 새로운 자료형 생성 가능

cf3) 배열: 같은 타입의 집합, 구조체: 다른 타입의 집합


7.2 구조체의 선언, 초기화, 사용


▶선언(정의): struct라는 키워드를 사용하여 정의


struct 태그 {

자료형  멤버1;

자료형  멤버2;

.

.

.

};


1. 구조체 태그는 변수가 아님 (각 구조체를 구별하기 위한 이름)

2. 중괄호 안에 원하는 변수들을 선언 (=구조체 멤버)

3. 구조체의 정의가 끝나면 세미콜론(;) 삽입


cf1) 구조체 선언변수 선언

cf2) 구조체 선언은 안에 어떠한 변수들이 들어간다는 것을 알려주는 것

cf3) 구조체의 형태만 정의(변수 생성X)했으므로 데이터 저장이 불가


//복소수


struct complex {

double real;        //실수부

double imag;        //허수부

};


//날짜


struct date {

int month;

int day;

int year;

};


//직원


struct employee {

char name[20];    //이름

int age;                //나이

int gender;           //성별

int salary;            //월급

};


▶변수 생성: 기본 자료형의 변수 생성 방식과 동일 (단, struct를 붙임)


struct student {            //구조체 정의

int number;

char name[10];

double grade;

};   

int main() {

struct student s1;    //구조체 변수 선언

.
.
.

}


- student라는 구조체를 이용하여 s1이라는 구조체 변수 생성

- 변수 s1에는 구조체의 멤버인 number, name, grade가 포함

- s1에는 실제 메모리 공간이 할당


1. 하나의 문장에서 여러 개의 구조체 변수 선언 가능 (ex. struct student s2, s3;)

2. 구조체의 정의와 변수 선언을 동시에 처리 가능

    ex. struct student {    →구조체 정의

              int number;

              char name[10];

              double grade;

         } s1 ;                      변수 선언 (s1: 구조체 student의 변수) 


▶초기화


1. 배열과 유사

2. 멤버들의 초기값을 중괄호안에 나열

3. 문장의 끝은 세미콜론(;)으로 마침


struct student {

int number;

char name[10];

double grade;

};

struct student s1 = { 20, "Lee", 4.0 };


cf) 구조체의 선언과 변수 선언을 동시에 한 경우의 초기화 표현

struct student {

int number;

char name[10];

double grade;

s1 = { 20, "Lee", 4.0 };


▶멤버 참조


1. 실질적으로 중요한 것은 구조체의 멤버 변수를 참조하는 것

2. 멤버 연산자(.)를 이용하여 접근 가능


s1.number = 20;                //정수 멤버

strcpy(s1.name, "Lee");     //문자열 멤버

s1.grade = 4.0;                  //실수 멤버


▶이름 없는 구조체


1. 구조체 정의 시 태그 이름 생략 가능

2. 가독성을 위해 태그 이름은 생략하지 않는 것이 좋음

3. 구조체 변수의 추가 생성은 불가, 추후 구조체 재정의


ex) 예제 프로그램(1)

#include <stdio.h>

#include <stdlib.h>

struct student{

    int number;        //학번

    char name[10];   //이름

    double grade;    //학점

};  //학생이라는 구조체 정의


int main()

{

    struct student s; //구조체 변수 선언


    s.number = 201812300;    //멤버 참조

    strcpy(s.name,"홍길동");

    s.grade = 4.0;


    printf("학번: %d\n", s.number);

    printf("이름: %s\n", s.name);

    printf("학점: %f\n", s.grade);


    return 0;

}


학번: 201812300

이름: 홍길동

학점: 4.000000


ex) 예제 프로그램(2)

#include <stdio.h>

#include <stdlib.h>

struct student{

    int number;

    char name[10];

    double grade;

};


int main()

{

    struct student s;


    printf("학번을 입력하시오:");

    scanf("%d", &s.number);

    printf("이름을 입력하시오:");

    scanf("%s", &s.name);

    printf("학점을 입력하시오:");

    scanf("%lf", &s.grade);

    printf("\n")


    printf("학번:%d\n", s.number);

    printf("이름:%s\n", s.name);

    printf("학점:%f\n", s.grade);


    return 0;

}



학번을 입력하시오: 201812300

이름을 입력하시오: 홍길동

학점을 입력하시오: 3.5


학번: 201812300

이름: 홍길동

학점: 3.500000


7.2 구조체의 활용


▶구조체를 멤버로 가지는 구조체


1. 구조체도 다른 구조체의 멤버로 처리 가능

2. 포인터도 구조체의 멤버로 처리 가능


struct date {    //구조체 선언

int year;

int month;

int day;

};   


struct student {    //구조체 선언

int number;

char name[10];

double grade;

struct date d;    //구조체 안에 구조체 포함

};    


struct student s;    //구조체 변수 선언

s.d.year = 2018;    //멤버 참조

s.d.month = 03;

s.d.day = 09;


▶구조체 변수의 대입과 비교


1. 하나의 구조체를 다른 구조체에 대입하는 연산은 가능

2. 하나의 구조체를 다른 구조체와 비교하는 것은 불가능


struct point{

int x;

int y;

};


int main()

{

struct point p1;

struct point p2;


p2=p1;    //대입 가능


if( p1 == p2 )    //비교  컴파일 오류

printf("p1과 p2는 같습니다.");


if((p1.x == p2.x) && (p1.y == p2.y))    //올바른 비교

printf("p1과 p2는 같습니다.");

}



[응용예제 7.1] 구조체와 배열의 차이점을 비교하시오.


[답] 배열: 같은 type의 자료형 묶음

 구조체: 서로 다른 type의 자료형 묶음


[응용예제 7.2] 구조체 태그와 구조체 변수 선언의 차이점은?


[답] 구조체 태그: 공간확보 X

 구조체 변수 선언: 실질적 공간 확보 O


[응용예제 7.3] 다음 코드의 오류를 찾으시오.

struct book {

char title[50];

int pages;

};

book.pages = 512;


[답] struct book {

     char title[50];

     int pages;

 };

 struct book b;

 b.pages = 512;


[응용예제 7.4] 다음 문장이 참인지 거짓인지 판정하시오.

     (a) 구조체를 선언하면 자동으로 변수가 생성된다.

     (b) 구조체 멤버는 == 연산자를 사용하여 비교할 수 있다.


[답] (a) 거짓, (b) 참


'C언어 > C프로그래밍 기초(2학기)' 카테고리의 다른 글

9강.구조체(3)  (0) 2018.12.09
8강.구조체(2)  (0) 2018.12.03
2강.포인터(2)  (0) 2018.09.23
1강.포인터(1)  (0) 2018.09.12