74. 구조체

학생1) 여러 데이터를 하나의 형식으로 정의할 수 없을까? 학생2) 학생의 번호와 이름을 하나의 변수로 사용할 수 있게 하고 싶구나. 구조체를 이용하면 여러 개의 멤버를 하나의 형식으로 정의할 수 있어.

프로그래밍 언어에서는 공통적으로 사용할 기본적인 형식들을 제공하죠.
그리고 프로그램 목적에 맞게 개발자가 형식을 정의하여 사용할 수 있는 문법을 제공하고 있어요.
이러한 문법을 사용자 정의 형식이라 불러요.

C언어에서 개발자가 형식을 정의하여 사용하는 문법에는 구조체, 공용체, 열거형이 있어요.
구조체와 공용체는 여러 개의 멤버를 하나의 형식으로 묶어 사용할 수 있게 정의하는 문법이예요.
그리고 열거형은 사용할 수 있는 값들을 열거하는 형식이죠.

구조체는 C언어에서 가장 많이 사용하는 사용자 정의 형식이예요.
여러 개의 데이터를 하나의 형식으로 묶어서 정의할 수 있어요.
학생의 번호, 이름을 구조체로 정의하면 학생 구조체 변수 하나만 선언해서 번호와 이름을 사용할 수 있어요.
구조체에 정의한 모든 멤버를 위한 메모리를 할당해 주어 사용하기 편해요.
이에 반해 공용체는 멤버 중에 가장 메모리 사이즈가 큰 멤버만큼의 메모리만 할당해요.
따라서 공용체를 사용하면 한 순간에 하나의 의미로만 사용할 수 있고 다른 멤버의 의미는 사용하지 못해요.

먼저 구조체를 살펴볼게요.

구조체는 C언어에서 가장 많이 사용하는 사용자 정의 형식이예요.

예를 들어 우리가 회원 관리 프로그램을 만든다고 가정할게요.
회원마다 아이디, 이름, 주소, 나이, 성별을 관리하고 최대 30명의 회원 데이터를 관리한다고 할게요.

한 명의 아이디를 관리하기 위해 char 형식을 원소로 하는 배열이 필요하겠죠.
따라서 여러 명의 회원 이름을 관리하기 위해서는 char 형식을 원소로 하는 배열이 원소인 배열을 선언해야겠죠.
이름, 주소도 마찬가지로 배열을 원소로 하는 배열이 필요하겠죠.

여러 회원의 나이와 성별을 관리하기 위해 정수형을 원소로 하는 배열을 선언해야죠.

이처럼 변수를 선언하면 한 명의 회원 데이터에 접근하기 위해 여러 개의 변수를 사용해야겠죠.
구조체를 정의해서 사용하면 배열 하나만 선언해서 관리할 수 있어요.
struct [태그명]
{
   [멤버 형식] [멤버 이름];
   … 중략
};

구조체를 정의할 때는 struct 키워드를 사용해요.
프로그램 내에 여러 개의 구조체를 정의할 수 있기 때문에 struct 키워드 뒤에 구분하기 위한 태그명을 사용하죠.
그리고 { }을 지정하여 내부에 구조체의 멤버 형식과 멤버 이름을 정의해요.

이처럼 구조체를 정의하면 struct 키워드와 태크명을 사용하여 변수를 선언할 수 있어요.
그리고 구조체도 배열처럼 여러 개의 멤버로 구성해서 초기화할 때 블럭에 초기값을 나열해요.

이처럼 구조체 형식 변수를 선언할 수 있지만 typedef 문법으로 새로운 형식 이름을 정의하여 사용할 수 있어요. 그리고 구조체 형식 변수로 멤버에 접근할 때는 구조체 변수명과 멤버명 사이에 .를 표시하여 구분한답니다.

◈ 구조체로 Member 형식 정의

◈ 실행 결과

 

구조체 형식을 입력 인자로 전달하면 값을 복사하여 버그가 발생할 수 있어요.

예를 들어 학생 구조체에 이름과 아이큐가 있다고 가정할게요.
학생이 공부하면 아이큐가 올라가게 할거예요.
학생 구조체 형식 변수를 입력 인자로 전달하여 학생의 아이큐를 변경하면 어떻게 될까요?

◈ 구조체 형식 변수로 멤버 사용할 때 버그

◈ 실행 결과

 

인자를 전달할 때 값을 복사하여 전달해서 입력 매개 변수와 호출한 곳의 변수는 다른 메모리예요.
따라서 값을 복사한 입력 매개 변수를 변경할 뿐 원본 학생 구조체 변수의 값은 아무런 영향을 받지 않아요.

따라서 구조체로 정의한 형식의 데이터를 인자로 전달할 필요가 있을 때는 구조체 포인터로 전달하세요.
구조체 포인터 변수일 때 변수명과 멤버명 사이에 오른쪽 화살표 (->)를 표시하여 멤버에 접근하세요.
◈ 구조체 포인터로 멤버 사용

◈ 실행 결과

 

구조체를 사용하여 회원 관리 프로그램을 만들면 구조체 형식을 원소로 하는 배열을 선언하여 관리가 쉬워져요.

◈ 구조체 Member 형식을 원소로 하는 배열

 

그리고 C언어에서는 구조체 비트 필드 문법을 제공하고 있어요.
구조체의 멤버 선언문 뒤에 콜론을 명시한 후 정수를 사용하면 메모리를 비트 단위로 배정할 수 있어요.
결혼 유무(0,1)처럼 값의 종류가 적은 멤버를 여러 개 포함할 때 구조체 비트 필드를 이용하면 메모리를 줄일 수 있어요.

예를 들어 볼게요.

위처럼 Data 형식을 정의하면 Data의 크기는 1바이트랍니다.
married와 hsacar, hashouse는 1비트에 배정해요.
그리고 age는 5비트를 배정하여 전체를 합하면 1바이를 배정하는 것이죠.
◈ 구조체 비트 필드 사용

◈ 실행 결과


[C언어 무료 동영상 강의] 74. 구조체, 75. 공용체, 76. 열거형