Chapter 7

GraGrass·2024년 2월 8일

구조체

구조체 정의

1. 구조체의 유용성과 필요성

구조체

  • 하나 이상의 변수를 그룹 지어서 새로운 자료 형을 정의
  • 그룹 지어진 변수들은 서로 다른 자료형이어도 됨
  • 포인터, 배열도 그룹에 속할 수 있음

구조체의 유용성

  • 관리가 편리해지고 코드도 간결해짐
  • 함수 return 타입으로 구조체 사용 -> 여러 데이터를 한 번에 return 가능

구조체의 필요성

  • 배열은 같은 자료형만 가져야 함
  • 다양한 자료형을 묶으려면 구조체가 필요

2. 구조체의 정의

struct point // point라는 이름의 구조체 선언
{
	int x; // 구조체 멤버 int x
    int y; // 구조체 멤버 int y
};

int main(void){
	struct point p1;
    p1.x=10; // p1의 멤버 x에 10 대입
    p1.y=20; // p1의 멤버 y에 20 대입
    // ...
    return 0;
};

사용자 정의 자료형

  • 기본 자료형 변수를 묶어서 만들어진 새로운 자료형
  • 사용자 정의 자료 형도 포함 가능

구조체 멤버

  • 구조체를 이루는 변수들
  • x, y는 point 구조체의 멤버가 됨

구조체 멤버 접근

  • 멤버 접근 연산자 .을 사용
  • Java, C++ 등에서 클래스 방식으로 확장되어 사용

3. 구조체의 선언

정의와 동시에 선언

struct point
{
	int x;
    int y;
} p1,p2,p3;

정의, 선언 분리

struct point
{
	int x;
    int y;
};

int main(void){
	struct point p1,p2,p3;
    // ...
    return 0;
}
  • 선언 시 struct라는 키워드를 반드시 붙여야 함
  • 컴파일러에게 point 자료형은 구조체로 정의되어있다 알려주는 역할
  • C++은 구조체를 클래스로 간주 -> 붙이지 않아도 됨

4. 구조체 초기화

배열 초기화 문법

struct person{
	char name[20];
    char phone[20];
    int age;
};

int main(void){
	struct person p={"gildong","010-1234-5678", 21};
    // ...
    return 0;
}
  • 배열 초기화 문법을 구조체에 적용
  • 중괄호 안에 모든 배열 요소들을 순서대로 초기화하는 방법이 구조체 변수에 적용됨

멤버 지정 초기화

int main (void){
	struct person p ={.age=21, .name="gildong", .phone="010-1234-5678"};
}
  • 구조체 변수 멤버를 지정하여 초기화 (C99)
  • 순서는 중요하지 X

구조체 활용

1. 구조체의 배열

구조체와 배열

#include <stdio.h>
struct person{
	char name[20];
    char phone[20];
};

int main(void){
	struct person pArray[3]={
    	{"KIM","123"},
        {"LEE","456"},
        {"PARK","789"}
    };
    // ...
    return 0;
}
  • 구조체 배열의 초기화
  • 구조체 배열도 선언과 동시에 초기화 가능

2. 구조체 연산 & Return

구조체 변수의 연산

  • 구조체는 기본 자료형에 비해 제한된 연산만이 허용됨
  • 대표적으로 대입 연산이 허용되며, 그 외는 적용 불가능
  • C에서는 배열 대입이 불가능 -> 이를 극복하기 위해 구조체 대입 사용

구조체 변수의 return

#include <stdio.h>

struct simple{int a,b;};

struct simple getdata(void)
// simple 구조체를 return하는 함수 getdata
{
	//...
    tmp.a=rand()%100, tmp.b=rand()%100;
    return tmp;
}

int main(void){
	struct simple s=getdata();
    return 0;
}
  • 구조체 변수도 함수의 반환값이 될 수 있음

다른 사용자 정의 자료형

1. typedef

개요

#include <stdio.h>
struct Data{
	int data1;
    int data2;
};

typedef struct Data Data; // 같은 이름 사용 가능

int main(void){
	Data d= {1,2}; // struct 키워드 생략
    return 0;
}
  • typedef로 구조체 변수 선언 시, struct 키워드 생략 가능
  • 주로 헤더 파일에 typedef 사용
    ex. FILE, size_t

2. 공용체

개요

union data{
	int d1;
    double d2;
    char d3;
};
  • 공용체도 많은 부분이 구조체와 비슷한 특징을 지님
  • 선언 방식은 구조체와 완전히 일치
  • 공용체는 서로 다른 자료형의 변수를 하나의 메모리 공간에 공유하는 경우에 사용됨 (저장할 자료 형이 일정하지 않을 경우)

메모리 구조

  • 구조체: 구조체 멤버 변수 d1,d2,d3의 메모리 각각 할당
  • 공용체: 멤버 중 가장 메모리를 많이 요구하는 멤버에 맞춰 메모리 할당 -> H/W programming을 하는 경우 유용하게 사용

3. enum

정의

enum color {RED=1, GREEN=3, BLUE=5};

enum color c;
c=RED; // c=1
c=GREEN; // c=3
c=BLUE; // c=5
  • color 형 변수의 선언이 가능해짐
  • 생성된 color 변수는 RED, GREEN, BLUE 중 하나의 값을 가질 수 있음
  • RED, GREEN, BLUE 라는 이름의 상수도 선언 가능 (값은 1,3,5가 됨)

활용

#include <stdio.h>
enum ele_type {TRI=3, TETRA=4, PENT=5};
typedef enum ele_typle ELE_TYPE;

int main(void){
	enum ele_type e1=TRI;
    ELE_TYPE e2=TETRA;
    enum ele_type e3=PENT;
    
    printf("%d %d %d\n",e1,e2,e3);
    printf("%d %d %d\n",TRI,TETRA,PENT);
    
    return 0;    
}
  • enum 정의 시 상수값 지정 X -> 0부터 1씩 증가하는 것으로 자동 할당
  • enum은 변수가 지니는 값에 의미를 부여할 수 있고, 가독성이 높아짐
profile
올해는 진짜 갓생 산다

0개의 댓글