간단 지식/C

03. 구조체, 공용체, 열거형

납작한돌맹이 2020. 11. 6. 04:28
반응형
  • 구조체

자바에 생성자가 있어 개발의 편의성, 다양성이 향상된다면 c언어에는 구조체가 있다. 구조체란, 서로 다른 변수의 형태를 하나의 block으로 묶는 기법이다. 이로 인해 함수에 데이터를 넘길 때 구조체만 넘기면 되는 큰 이점이 생긴다.

구조체형과 변수 선언 형태는 아래와 같다.

typedef struct 이름{

      멤버1 ~ n;

} 별칭;

구조체별칭 변수이름;

이는 typedef을 이용한 구조체 선언 방식으로, 개발자의 편의성을 위해 구조체에 별칭을 붙일 수 있게 해준다. 변수에 값을 대입하는 형식은 다음과 같다.

변수이름.멤버 = 값;

 

원래 정식 선언 방식은 아래와 같다.

struct 이름{

      멤버1 ~ n;

}

struct 구조체이름 변수이름;

차이점이 보이는가? typedef를 사용하면 변수를 선언할 때 struct를 생략해도 된다. 사용할 구조체 타입의 변수가 많을수록 장점은 극대화 될 것이다.

 

아래 간단한 예제를 보자.

#include <stdio.h>
#include <stddef.h>

void main() {
    typedef struct _student {
        char name[10];
	int age;
	char grade;
    }student;      ------------------------------(1)
    
    printf("%d", sizeof(student));    -----------(2)
    
    printf("%d", offsetof(student, name)); ------(3)
    printf("%d", offsetof(student, age));
    printf("%d", offsetof(student, grade));
        
    student s1;
    strcpy_s(s1.name, 8, "sohyeon");   ----------(4)
    s1.age = 23;
    s1.grade = 'B';
}

코드라인 (1). student라는 별칭을 가진 _student라는 이름의 구조체를 선언하였다.

코드라인 (2). 할당받은 크기를 알아보니 20byte가 나왔다. 멤버를 보면 배열 10byte, int 4byte, char 1byte 인데 계산이 맞지 않는다. 바로 padding 때문이다. 구조체를 정렬할 때 멤버들 중 가장 큰 자료형 크기의 배수로 정렬한다. 위 예제의 멤버 중 가장 크기가 큰 것은 배열 10byte이다. 따라서 필요한 15byte를 담을 수 있는 10byte의 배수는 20byte이므로 5byte의 padding이 생기게 된다.

코드라인 (3). 각 멤버가 20byte 중 어떤 위치에 배치되었는지 출력해보았다. 결과는 0 12 16으로, 이상한 점 없이 잘 확인되었다.

코드라인 (4). 구조체 변수 s1을 선언하고 값을 대입해보았다.

 

구조체도 결국엔 하나의 데이터 타입이기 때문에 구조체로 배열을 만들 수 있다. 구조체 배열은 각 인덱스에 모든 멤버가 포함된다. 아래 예제를 보자.

void main() {
    typedef struct _student {
        char name[10];
	int age;
	char grade;
    }student;     
    
    student s1[3];	       -----------(1)
    strcpy_s(s1[0].name, 4, "ksh");
    s1[0].age = 20;
    s1[0].grade = 'A';
    
    student s2[2] = {      -----------(2) 
    	{ "kim", 20, 'a' },
        { "park", 21, 'b' }
    };    
}

구조체 배열을 초기화하는 방법은 2가지가 있다. 코드라인 (1)처럼 각 열에 대한 각각의 멤버에 값을 집어넣는 방법과, 코드라인 (2)처럼 한 번에 열과 멤버에 대해 값을 넣는 방법이 있다.

 

구조체 포인터, 역참조, malloc 등에 대해 더 알고 싶다면 다음 글로 넘어가자.

다음 글: 2020/12/02 - [1학년/c언어] - 04. 구조체 - 포인터, malloc, 화살표연산자, 역참조

 

04. 구조체 - 포인터, malloc, 화살표연산자, 역참조

이전 글에서 구조체의 개념과 기본 예제, 그리고 구조체 배열에 대해서 설명했다. 이전 글: 2020/11/06 - [1학년/c언어] - 03. 구조체, 공용체, 열거형 03. 구조체, 공용체, 열거형 구조체 자바에 생성자

20plus3.tistory.com

  • 공용체

구조체는 메모리에서 각 멤버들이 갖는 공간이 분리되어 있다. 그러나 공용체는 메모리를 멤버들이 같이 사용한다. 따라서 특수한 경우에만 사용되는데 따로 쓰이기보단 struct 내부에 들어가서 쓰인다. 예를 들어 사용자 이름과 전화번호 또는 주민번호를 입력해야 하는 프로그램을 만들어야 한다고 가정해보자. struct 내부에 char name, int phone, int num 을 멤버로 넣어도 무관하지만, 메모리 절약을 위해 struct 내부에 char name과 union을, 그리고 그 union에는 int phone, int num을 멤버로 넣어주는 게 현명한 개발법이다. 

아래는 공용체와 공용체 변수의 선언 형식이다.

union 이름{

    멤버 1~n;

}

union u;

 

 

  • 열거형

자바의 열거형과 다를 것 없이 단순 수(1,2,3...)을 기호로 표현하는 기법이다. 변수의 범위가 정해져 있을 때 숫자보다 쉽게 파악할 수 있도록 문자 혹은 단어로 표현할 수 있다.

사용 형식은 아래와 같다.

enum 이름{

   기호 1~n;

}

enum 이름 변수;

변수에는 기호만 대입 가능하다.

 

아래 링크는 자바에서의 열거형이니 한 번씩 읽어보자.

2020/05/10 - [1학년/Java] - 04. 참조타입변수 - String, 배열, 열거

 

04. 참조타입변수 - String, 배열, 열거

String 자바에서 문자열은 변수 String에 저장한다. 특이점이 있다면 String은 다른 참조타입변수들과는 달리 저장된 문자열이 같으면 객체를 공유하게 되어 같은 객체를 참조하게 한다. 따라서 아래

20plus3.tistory.com

 

(이 글이 도움이 됐다면 광고 한번씩만 클릭 해주시면 감사드립니다, 더 좋은 정보글 작성하도록 노력하겠습니다 :) )

반응형