자료구조, 알고리즘

DS05 - 구조체

0verc10ck 2018. 5. 15. 01:40
반응형

구조체(Structure) 개념              

  어떠한 프로그램을 구현할 때 항상 같은 자료형의 자료들만을 다루지는 않는다.

예를 들어 어떤 회사의 직원 명부를 데이터베이스에 저장하려 한다면, 직원의 이름(문자열), 나이(정수), 

직급(문자열), 연봉(정수)등 다양한 자료형의 자료들을 묶어서 저장해야 할 필요가 있다.

많은 자료를 묶어 표현하는 방법에는 배열이 있다.

하지만 배열의 경우 모든 자료의 자료형이 같아야 하기 때문에 다양한 자료형의 자료는 하나로 묶을 수 없다.

이러한 문제점을 해결하기 위해서는 구조체(Structure)을 사용하면 된다.



구조체의 선언                               

  구조체는 여러 자료형의 변수들을 그룹으로 묶어서 하나의 자료형을 선언하여 사용한다.

구조체는 이름, 자료형, 데이터 항목으로 구성된다.

구조체형 이름은 구조체로 정하는 새로운 자료형의 이름이며 변수이름과 같이 선언되고 사용된다.

구조체의 데이터 항목은 배열의 배열요소와 같이 구조체를 이루는 요소들이다 배열이 요소와 다른점은 배열의

요소는 모두 같은 자료형이기 때문에 배열의 크기만을 정해주면 되지만, 구조체의 경우 요소들의 자료형이 

다를 수 있기 때문에 항목별로 자료형과 항목의 이름(변수명)을 선언해야 한다.


다음은 구조체를 선언하는 두가지 방법이다.


//방법 1
struct employee1
{
    char name[10];
    int age;
    int pay;
};

/* struct 구조체형이름
{
 자료형 항목이름;
}구조체변수이름;
*/

//방법2
typedef struct employee2
{

    char name[10];
    int age;
    int pay;
}inform;

/* typedef struct 구조체형이름
{
 자료형 항목이름;
}구조체변수이름;
*/



구조체를 선언하는 단계를 정리하면 다음과 같다.

-1. 구조체형 선언 : 내부구조를 정의한다.

-2. 구조체 변수 선언 : 구조체형에 따른 변수를 선언한다.

-3. 구조체 변수의 사용 : 내부 항목에 데이터를 저장하고 사용한다.


  방법 1과 방법 2의 차이점은 구조체의 이름 앞에 typedef라는 예약어가 있느냐 없느냐의 차이이다.

예약어 typedef는 특정 자료형을 부르는 별명을 만들때 사용된다.

방법 1과 같이 struct employee1이라는 자료형의 구조체를 선언하려면 "struct employee1 변수이름"의 형식으로 구조체 변수를 선언 할 때마다 struct를 붙여 줘야 한다.

하지만 방법 2와 같이 struct 앞에 typedef라는 별칭을 붙여 typedef struct employee2 이라는 자료형을

inform이라는 별명으로 지정하였다.

이를 통해 구조체 변수를 선언할 때 "struct employee2 변수이름"의 형식이 아닌 "inform 변수이름"의 형식으로

변수를 선언할 수 있다.



 구조체 또한 변수와 마찬가지로 선언과 동시에 초기화 할 수 있다.

구조체의 초기화 방법은 다음과 같다.


struct employee
{
    char name[10];
    int age;
    int pay;
};

struct employee inform = {"Strange", "32", "5200"};



구조체 선언 후 초깃값 리스트를 통해 구조체를 초기화하여 구조체 내부 항목을 초기화 할 수 있다.






데이터 항목의 참조                         

  구조체 변수에 있는 각 데이터항목을 참조하려면 구조체 연산자를 사용해야한다.

구조체 연산자에는 점연산자(.)과 화살표 연산자(->)두가지가 있다.

1. 점 연산자(.)

점 연산자는 구조체 변수에 있는 데이터 항목을 개별적으로 지정할 때 사용한다.


struct employee
{
    char name[10];
    int age;
    int pay;
};

struct employee inform;
inform.name = "Kim";
inform.age = 32;
inform.pay = 5200;



위의 예제는 구조체 변수 inform의 각 데이터 항목을 지정하는 과정이다.



2. 화살표 연산자(->)

  포인터는 모든 자료형에 사용될 수 있으므로 구조체 또한 포인터를 사용할 수 있다.

구조체 포인터에서 포인터가 가리키는 구조체 변수의 데이터 항목을 참조하려면 화살표 연산자를 사용해야한다.




struct employee
{
    char name[10];
    int age;
    int pay;
};

struct employee inform;
struct employee *sptr = &inform;
sptr->name = "kim";
sptr->age = 32;
sptr->pay = 5200;



위의 예제는 구조체 변수 inform의 주소값을 구조체 포인터 sptr에 저장한 뒤, sptr과 화살표 연산자를 이용하여 inform의 각 데이터 항목을 지정하는 과정이다.




구조체의 연산                               

  구조체의 경우 일반 변수와 달리 여러개의 항목으로 이루어져 있기 때문에 일반 변수와 같이 비교연산을 수행

할 수 없다. 하지만 점연산자나 화살표 연산자를 이용하여 구조체의 각 요소들을 비교할 수는 있다.


어떠한 변수의 값을 다른 변수에 복사할 수 있듯이 구조체 또한 어떠한 구조체 변수의 값을 다른 구조체 변수에 

복사 할 수 있다.

하지만 구조체 변수를 복사하려면 복사하려는 구조체들이 같은 구조체여야 한다는 조건이 있다.

형태가 다른 구조체는 자료형이 다른 변수와 같기 때문에 값을 복사 할 수 없다.

반응형

'자료구조, 알고리즘' 카테고리의 다른 글

DS07 - 순차 자료구조와 선형 리스트의 이해  (0) 2018.10.25
DS06 - 재귀함수  (0) 2018.05.15
DS04 - 포인터  (0) 2018.05.13
DS03 - 배열(Array)  (0) 2018.05.12
AL02 - 알고리즘의 성능 분석  (0) 2018.05.07