C언어 구조체 선언과 초기화 및 입력과 출력

C언어 구조체는 서로 다른 종류의 자료형을 하나의 이름으로 묶는 변수의 집합입니다. 구조체 정의는 struct 키워드와 구조체명, 멤버이름 등으로 이루어집니다.

C언어 구조체

구조체는 무엇일까요?? 구조체는 서로 다른 종류의 자료형을 하나의 이름으로 묶을 수 있는 변수의 집합입니다.

자료형이 서로 달라도 의미상으로 연관이 되있다면 같은 데이터에 묶는 것이 유용할 것입니다.

배열은 같은 자료형만 묶을 수 있지만, 구조체는 종류가 다른 자료형을 묶을 수 있다는 차이점이 있습니다.

구조체의 정의

구조체 자료형은 struct 키워드를 구조체명 앞에 붙이면 정의됩니다.

소속 되는 자료형은 마치 함수를 만들듯이 { } 코드 블록 사이에 자신의 자료형과 함께 한 줄씩 기입하면 됩니다.

단 함수와 차이점은 코드 블록 마지막에 세미콜론 ; 을 붙여줘야합니다.

struct 구조체명
{
  자료형1 멤버1;
  자료형2 멤버2;
  자료형3 멤버3;
  ...
};

예를 들어 주식 정보에서 주식 이름(Name), 주가(Price), 가격 변동율(Ratio)을 구조체(struct)로 만든다면, 주식 이름은 문자열(char), 주가는 정수형(int), 가격 변동률은 실수형(float)으로 만들 수 있습니다. 구조체이름은 Stock입니다.

#include <stdio.h>

//구조체 정의
struct Stock
{
  char Name[30]; //주식명
  int Price;     //주가
  float Ratio;   //변동률
};

//main() 함수 본문
int main()
{
  .. .. ...
}

구조체 정의는 main() 함수 밖과 안에서 모두 선언할 수 있습니다. 하지만 main() 함수 안에서 정의하면 main() 함수 밖에서는 구조체를 사용할 수 없습니다.

구조체 변수 선언

구조체 정의에서는 아직 메모리에 데이터가 할당된 상태는 아닙니다. 구조체 변수를 선언해야 메모리에 할당됩니다.

구조체 변수의 선언은 일반 자료형의 변수 선언과 동일합니다. main() 내부에서 구조체 변수명을 선언해주면 됩니다.

int main()
{
  struct 구조체명 구조체변수명;
}

구조체명(Stock), 구조체변수명(Money1)을 설정한 예제입니다.

#include <stdio.h>

//구조체 정의
struct Stock
{
  char Name[30];   //주식명
  int Price;       //주가
  float Ratio;     //변동률
};

//main() 본문
int main()
{
  struct Stock Money1; //구조체명(Stock), 구조체 변수명(Money1)

  return 0;
}

구조체 정의 및 선언 동시

구조체 정의 마지막에 구조체 변수명을 삽입해서 선언을 동시에 진행할 수 있습니다.

//구조체 정의
struct Stock
{

  char Name[30];     //주식명
  int Price;         //주가
  float Ratio;       //변동률

} Money1; //구조체 변수명 선언

구조체 초기화

구조체에 변수값을 대입하는 과정은 배열과 비슷합니다. 전체 데이터를 일괄 삽입할 경우 중괄호를 사용합니다.

#include <stdio.h>

//구조체 정의
struct Stock
{
  int Price;     //주가
  float Ratio;   //변동률
};

//main() 본문
int main()
{
  struct Stock Money1 = { 2000, 12.5 }; //구조체 초기화

  return 0;
}

배열의 원소별 삽입처럼 각각 초기화를 할 경우 구조체변수명.멤버명 = 변수값; 형태를 사용합니다.

#include <stdio.h>

//구조체 정의
struct Stock
{
  int Price;     //주가
  float Ratio;   //변동률
};

//main() 본문
int main()
{
  struct Stock Money1; //구조체 변수명 선언

  Money1.Price = 2000; //구조체 멤버 초기화
  Money1.Ratio = 12.5;

  return 0;
}

구조체 정의, 선언, 초기화를 동시에 할 수도 있습니다.

//구조체 정의
struct Stock
{

  int Price;     //주가
  float Ratio;   //변동률

} Money1 = { 2000, 12.5 }; //구조체 선언 및 초기화

구조체 문자열 초기화

문자열 데이터는 구조체의 멤버에 대입시 strcpy(변수명, "문자열");이라는 문자열 복사 함수를 사용해야 합니다. strcpy() 함수 사용을 위해서 헤더에 #include <string.h> 코드를 추가해줍니다. 변수명에는 구조체변수명.멤버명을 대입합니다.

#include <stdio.h>
#include <string.h>

//구조체 정의
struct Stock
{
  char Name[50];    //주식명
  int Price;        //주가
  float Ratio;      //변동률
};

//main()
int main()
{
  struct Stock Money1;

  strcpy( Money1.Name, "Company" ); //strcpy() 함수 사용
  Money1.Price = 2000;
  Money1.Ratio = 12.5;

  return 0;
}

구조체 멤버의 입력과 출력

구조체의 멤버 요소의 입력과 출력에서 변수명에 구조체변수명.멤버명 형식을 사용합니다.

#include <stdio.h>
#include <string.h>

//구조체 정의
struct Stock
{
	char Name[50];     //주식명
	int Price;         //주가
	float Ratio;       //변동률
};

//main()
int main()
{
	struct Stock Money1; //구조체 변수명 선언

	//주식명 입력
	printf("주식명을 입력하세요.");
	scanf("%s", Money1.Name); //문자열에는 & 삭제

	//주가 입력
	printf("주식 가격을 입력하세요.");
	scanf("%d", &Money1.Price);

	//변동률 입력
	printf("가격 변동률을 소숫점으로 입력하세요.");
	scanf("%f", &Money1.Ratio);

	//구조체 입력값 최종 출력
	printf("%s \n %6d \n %6.1f \n", Money1.Name, Money1.Price, Money1.Ratio);

	return 0;
}

결과

Company
   2000
   12.5

주식명 Company, 주가 2000, 변동률 12.5 입력시 결과입니다.