티스토리 뷰

BackEnd/C

[22일차] 1. 구조체와 멤버

JINSUKUKU 2021. 3. 5. 16:47

2021.03.05.금

구조체 선언과 멤버 사용

✔  구조체는 사용자가 임의로 정의한 자료형이라고 볼 수 있다.

✔  구조체를 선언하면 새로운 자료형이 만들어지고, 그 이후부터는 구조체 변수를 만들어 사용할 수 있다.

struct student{
    int num;
    double grade;
};

✔  구조체는 struct 예약어를 사용해 선언한다.

✔  구조체의 이름은 성격에 맞는 적절한 이름을 붙이고, 중괄호 내부 블록 안에 필요한 멤버를 나열한다.

✔  멤버 선언은 구조체를 구성하는 자료형 종류와 이름을 컴파일러에게 알리는 역할을 한다.

✔  선언 형태는 변수와 유사하나, 메모리 저장 공간을 할당받지 않는다는 차이점이 있다.

✔  그리고 마지막으로 중괄호로 블록을 닫아준 뒤에는 반드시 세미콜론을 붙여야 한다.

#include <stdio.h>
//구조체 만들기
struct student{
  int num;
  double grade;	
};
int main(void){
  struct student s1;	//구조체 참조 변수 선언
  s1.num=2;		//멤버 num 초기화
  s1.grade=2.7;		//멤버 grade 초기화
  printf("학번 : %d\n", s1.num);       // num 멤버 출력
  printf("학점 : %.1lf\n", s1.grade);  // grade 멤버 출력
  return 0;
}

✔  구조체를 만든 다음, 메인 함수 내부에서 구조체 변수를 만들어 구조체의 멤버에 접근할 수 있다.

✔  구조체 변수를 선언해야 비로소 저장 공간이 할당되고, 멤버의 공간도 메모리에 연속으로 할당된다.

✔  모든 멤버를 더한 전체 저장 공간이 하나의 구조체 변수가 되므로, 크기는 각 멤버의 크기를 더한 합이 된다.

✔  구조체 변수는 그 안에 여러 멤버를 가지므로, 특정 멤버를 골라서 사용하기 위해 멤버 접근 연산자. 를 사용한다.

 

 

다양한 구조체 멤버
struct profile {
  char * name[20];   //이름
  int age;           // 나이
  double height;     // 키
  char *intro;
};

✔  구조체 멤버로 변수뿐만 아니라 배열, 포인터는 물론이고 이미 선언된 다른 구조체도 사용할 수 있다.

✔  배열이 구조체 멤버인 경우, 구조체 변수를 선언하면 배열 멤버도 그 크기만큼 저장 공간이 할당된다.

✔  변수가 아닌 멤버를 사용할 때에도 멤버 접근 연산자. 을 사용한다.

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

struct profile{
  char * name[20];
  int age;
  double height; 
  char *intro;
};

int main(void){
  struct profile yuni;                
  strcpy(yuni.name,"서하윤");

  yuni.age = 17;                      
  yuni.height = 164.5;        
  //구조체 멤버 char형 포인터는 메모리공간을 할당해야 사용할 수 있다.
  yuni.intro = (char*)malloc(sizeof(char)*80) ;    

  printf("자기소개 : ");
  gets(yuni.intro);                  

  printf("이름 : %s\n", yuni.name);   
  printf("나이 : %d\n", yuni.age);
  printf("키 : %.1lf\n", yuni.height);
  printf("자기소개 : %s\n", yuni.intro);
  free(yuni.intro);              
  return 0;
}

✔  char형 포인터를 멤버로 사용해 문자열을 저장할 수 있지만 키보드로 바로 입력할 수 없다.

✔  포인터는 문자열 자체를 저장할 공간이 없으므로, 따로 동적 할당을 하고 난 뒤에 주소를 저장할 수 있다.

✔  포인터 멤버는 배열 멤버보다 사용이 번거롭지만, 동적으로 사용할 수 있다는 장점이 있다.

✔  각각의 장점이 있으므로 필요에 따라 적절한 멤버를 사용하자.

 

 

구조체의 멤버로 다른 구조체 사용하기
struct profile{
  int age;
  double height;
};

struct student{
  int grade;
  int class; 
  struct profile pf;
};

✔  구조체(student) 멤버로 다른 구조체(profile)를 사용하려면 멤버가 될 구조체가 먼저 선언되어 있어야 한다.

struct student kuku;
kuku.grade=3;
kuku.class=10;
kuku.pf.age=19;
kuku.pf.height=162.5;

✔  student 구조체의 구조체 변수를 만들어 profile 구조체 멤버에 접근하기 위해서는 멤버 접근 연산자. 를 2번 사용해야 한다.

✔  첫 번째 멤버 접근 연산을 통해 student 구조체 내부의 멤버인 pf에 접근하고

✔  두 번째 멤버 접근 연산을 통해 profile 구조체 내부의 멤버에 접근할 수 있다.

 

 

 

 

 

 

 

 

[참고] 한빛미디어-혼자 공부하는 C언어 유튜브 강의 / 엘리스 트랙-혼자 공부하는 C언어 / 길벗-C언어 코딩 도장 / 위키백과

댓글
«   2025/04   »
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
최근에 올라온 글
글 보관함
Total
Today
Yesterday