구조체는 프로그램 개발을 위한 매우 중요한 요소로써, 앞으로 코드를 다루일이 있다면 반드시 익히 가야하는 개념입니다. 구조체는 하나이상의 변수를 묶어서 새로운 자료형을 정의하는 도구를 말합니다.

예를들어서, 학생정보시스템을 만든다고 가정할때, 학생들의 이름,키,몸무게,주소 등을 학생마다 선언하고 관리해야한다면 여간 까다롭고 귀찮은 일이 아니다. 이럴때, 구조체를 이용하면 한 학생의 정보를 표현하는 여러가지 변수를 하나로 묶어버릴수가 있다. 이렇게해서 등장한 개념이 구조체이다. 

ex)

struct student
{
char name[30];    //student구조체를 구성하는 멤버 name
int height;          //student구조체를 구성하는 멤버 height
int weight;       //student구조체를 구성하는 멤버 weight
int address;   //student구조체를 구성하는 멤버 address

}

▶ 위의 예시와 같이 구조체 변수의 선언과 접근은 아래와 같다.


struct    type_name   val_name  //구조체 변수선언의 기본 형태

         구조체 이름  /구조체 변수이름


즉, 위의 구조체 student에 구조체 변수를 선언하고자 한다면,

struct student Namja; 와 같이 선언 할수가 있다.

Namja구조체 변수 안에는 


char name[30];   
int height;        
int weight;    
int address;          

의 변수들이 존재한다. 구조체 변수를 선언함으로써 student의 멤버들을 그대로 상속받을 수가
는것이다.  

▶ 구체의 접근법은 아래와 같다.

구조체 변수의 이름.구조체 멤버의 이름

ex) Namja.height = 180;  // 구조체 변수 Namja의 멤버 height에 180을 저장

구조체를 정의함과 동시에 변수를 선언할 수도 있다.

struct student
{
int height;        
int weight;    
} boy1, girl1;

이는 student 구조체를 정의함과 동시에 student형 구조체 변수 boy1, girl1을 선언하는 문장이다.
그리고 구조체 변수의 선언과 동시에 초기화는 중괄호를 통해서 초기화할 값을 명시하면 된다.

struct student boy={"180", "75"};



▶  구조체와 배열 & 포인터

먼저, 구조체 배열이란, 구조체 변수들이 여러개 모인 배열을 의미한다. 예를들면 위의 student 구조체에서 남학생이면 10명이면 struct student boy[10]; 과 같은 형태로 구조체를 선언할수가 있다.

point형 구조체의 포인터 변수는 아래와 같이 선언되고 초기화된다.

struct student
{
int height;        
int weight;    
}

struct student boy= {178,70}; //  student형 구조체의 boy 변수를 선언과 동시에 초기화
struct student *ptr = &number;  // 구조체 point 변수 ptr이 구조체 변수 boy를 가리킨다

접근법은 
(*ptr).height=180;  // ptr이 가리키는 구조체 변수의 멤버 height에 180을 저장
(*ptr).weight=75;  // ptr이 가리키는 구조체 변수의 멤버 weight에 75를 저장


▶  typedef 선언과 구조체

typedef는 기존의 존재하는 자룡형의 이름을 사용자가 원하는 형태로 새이름을 부여하는 것을 말한다.

이것이 왜 구조체와 연관이 있는가 하면, 위의 예를 다시 가지고 설명한다면,

구조체 변수의 선언시
struct student boy; 로 선언해야 한다.

하지만 이를 typredef를 사용해서 선언후 사용한다면,


typedef struct student  Student;  // struct student 대신에 Student 이름을 부여함.


이제 struct student boy;의 명령이 간편하게 Student boy; 로 줄었다.


그래서 많은 프로그래머들이 변수의 이름의 첫글자를 대문자로 지정하여 구조체의 선언시 typedef가 적용된 형태의 축약형을 많이 사용한다. 생략가능함을 염두해 두고 코드를 유념해서 보기를 바란다.



▶ 구조체의 또다른 접근법 : 포인터 연산자 ->


이는 위의 구조체 멤버변수 접근방식 (직접방식)과는 다른 방법으로써, 간접접근 방식이라 할수가 있다.

(대부분 힙에 할당된 기억장소에 접근할 때)

= 포인터와 같은 참조변수를 이용하여 구조체 변수의 주소값에 접근하기 위해서 -> 연산자를 사용하여 접근한다.


예를 들어보자.


#include <stdio.h>

#include <stdlib.h>

#include <string.h>


typedef struct smartphone  //다음부터 smartphone만 입력하면 구조체 선언을 하도록 typedef 선언

{

char name[30];

int price;

}Apple;   // 구조체의 선언과 구조체 변수 apple의 선언.


int main(void)

{

Apple *applephone;  //구조체변수 Apple형의 참조변수 applephone선언


applephone = (Apple*) malloc(sizeof(30)); //힙에 메모리를 할당하라.

//(Apple*)는 형을 의미하고, 30 메모리 만큼의 동적할당값을 applephone 참조변수에게 할당하라. 


strcpy(Apple->name, "아이폰5");

Apple->price = 800;

printf("%s %d \n", Apple->name, Apple->price);

free(applephone);

return 0;


}



메모리 동적할당에 대한 자세한 설명은, 아래의 블로그 게시글을 참고하자.

http://rus1031.blog.me/80187120151





+ Recent posts