본문 바로가기
컴퓨터 공학/C, C++

[ C ]커스텀 자료형 이해하기1_구조체란? 정의/선언/용도/초기화

by hahehohoo 2020. 7. 24.
반응형

 C언어 구조체(struct)란? 정의/선언/용도/초기화

 

이제까지 기본 자료형을 써왔습니다. int(4바이트)나 short(2바이트) 등등 말이죠. 그런데 3바이트짜리 자료형을 사용하고 싶으면 어떻게 해야할까요? 3바이트짜리 기본 자료형은 없습니다. 그래서 기본 자료형으로는 그 크기를 할당받을 수 없습니다. 바로 이 때 커스텀(Custom) 자료형을 활용합니다. 사용자 정의 자료형(User efined data type)이라고도 하여 우리가 새로운 자료형을 정의할 수 있다는 뜻입니다. 

 

 

신발을 커스터마이징 하는것처럼요~ 출처: http://www.vogue.co.kr/2016/11/11/customize/

 

 

■ 구조체 정의

 

그 중 하나인 구조체에 대해 알아보겠습니다. 구조체를 선언할 때 사용하는 키워드 struct은 '건축물'을 뜻하는 영어 단어 structure을 의미합니다. 말 그대로 여러 부품을 조립하여 하나의 건축물을 이룬 것인데, C언어에서 구조체 역시 여러 자료형을 가진 변수들을 하나의 패키지로 만들어 놓은 것을 뜻합니다. 왜 데이터를 묶어서 사용하면 좋을까요? 잠시 프로그래밍을 떠나 현실 세계를 생각해봅시다. 

 

지금 몇 시인가요?  3시 10분입니다. 

오늘은 몇 일이죠?  7월 22일입니다. 

 

둘의 공통점을 찾으셨나요? 위의 질문은 하나의 정보로만 전달할 수 없습니다. 몇 시인지 알려줄 때 '시'단위만 사용할 수 없죠. 때에 따라(거의 대부분) '분'도 함께 언급해야합니다. 몇 일인지 대답해줄 때도 마찬가지입니다. 이렇게 여러 정보를 하나로 묶을 때 의미가 부여되는 경우 구조체를 사용하면 편리합니다. 

 

그럼 이해를 더욱 돕기 위해 프로그램상 마우스의 좌표 정보를 저장하고 관리해야 한다고 가정하겠습니다. 

 

struct point // point라는 이름의 구조체 정의
{
   int xpos; //point 구조체를 구성하는 멤버 xpos;
   int ypos; //point 구조체를 구성하는 멤버 ypos;
};

 

point라는 구조체를 정의하였습니다. point라는 자료형을 만든 것이지요. 구조체의 멤버로는 기본 자료형을 넣을 수 있습니다. 끝에 세미콜론(;) 붙이는거 잊지 마세요. 

이제 이 point 자료형으로 변수를 선언해보겠습니다. 

 

 

 

 

■ 구조체 선언

 

구조체를 선언할 때는 struct이라는 키워드를 사용합니다.

 

struct point point1;  //struct 자료형 변수명;

 

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

struct point
{
   int xpos;
   int ypos;
} point1, point2, point3;

 

그럼 이제 구조체 변수 point1 안에는 int형 변수 xpos와 ypos가 있습니다. 구조체 안에 있는 멤버에 어떻게 접근해야 할까요? 

 

point1.xpos = 30; // 구조체 변수 이름.구조체 멤버의 이름

 

.연산자를 이용해서 접근하면 됩니다. 그럼 point 구조체 기반의 예제를 보겠습니다. 

 

#include <stdio.h>
#include <math.h>

struct point
{
   int xpos;
   int ypos;
};

int main(void)
{
   struct point point1, point2;
   double distance;
   
   fputs("point1 pos: ",stdout); // 표준 출력 스트림에 "point1 pos: "을 출력
   scanf("&d %d", &point1.xpos, &point1.ypos); // 구조체 멤버를 대상으로도 &연산을 할 수 있음
   
   fputs("point1 pos: ",stdout); // 표준 출력 스트림에 "point2 pos: "을 출력
   scanf("&d %d", &point2.xpos, &point2.ypos);// 입력받은 값을 저장 
   
   distance=squrt((double)((point1.xpos-point2.xpos) * (point1.xpos-point2.xpos) +(point1.ypos-point2.ypos) * (point1.ypos-point2.ypos)));
   
   printf("두 점의 거리는 %g 입니다. \n ", distance);
}

 

두 개의 구조체 변수를 선언하여 두 점 거리를 계산하는 코드입니다. 

구조체의 멤버를 대상으로 & 연산을 할 수 있습니다. 

 

■ 구조체 초기화

구조체의 초기화 방법은 배열의 초기화와 동일합니다. 멤버의 순서대로 값을 나열하면 됩니다. 

 

struct point point1 = {10, 20};

 

이렇게 초기화 과정에는 문자열 저장을 위해 strcpy 함수를 호출할 필요가 없습니다. 

 

 

 

 

 

 

-----------------------------------

C언어 문법 총정리

목록 보러가기 

-----------------------------------

 

 

 

 

반응형


댓글