c언어 #9 - 구조체 (국비11일차)

오늘은 c언어의 마지막이다.

나의 목표는 안드로이드 앱 개발이기 때문에 이 정도 기초를 다지고

다음 주부터 2일은 c++을 배우게 된다.

 

오늘 배울 목차

    1. 구조체란 무엇일까?
    2. 구조체 문법

 

 

 

1. 구조체란 무엇일까?

구조체(Struct) - 서로 연관있는 변수를 묶어서 관리하는 문법 (발전해서 class로 )

 

만약 학생 성적 Data를 저장해야 하는 상황이라고 가정해 보자.

 

1. 학생 이름 "Sam"
2. 국어 성적 80
3. 영어 성적 70
4. 평균 75.0

 

그럼 우리는 지금까지 배운 대로

char* name;
int kor = 80;
int eng = 70;
double avg = 75.0;

이렇게 변수를 만들 것이다.

 

그런데 한 반의 Data를 저장한다고 하면 어떻게 해야 할까?

며칠 전 배운 배열로 될까?

 

우선 답은 아니다.

배열은 같은 자료형만 묶을 수 있다.

그런데 우리가 저장하려는 자료형은 서로 다른 자료형이다.

 

하지만 배열로 묶는 방법이 존재한다.

이름끼리 배열로 묶고,

국어 성적끼리 묶고, 영어 성적끼리 묶고

평균끼리 묶는 방식이 가능하다.

 

이런 방법도 괜찮은 방법이지만

매번 다른 배열을 조회해야 한다는 단점이 있다.

우리가 원하는 것은

하나의 박스 안에 연관된 자료가 다 들어있는 것이다.
(근데 우리가 배운 자료형 1개당 1개의 데이터만 저장 가능한데...?)

 

바로 '구조체'가 하나의 변수에 여러 개의 데이터를 저장가능하게 하는 것이다.

 

2. 구조체 문법

 

우선 구조체 문법은 파스칼 표기법을 사용한다.

파스칼 표기법은 모든 단어의 첫 글자를 대문자로 사용하는 것이다.

( ex. UserAge )

 

우선 main 함수 전에 구조체를 설계해줘야 한다.

struct Student
{
char name;
int kor;
int eng;
double avg;
}

이렇게 설계를 해주고

main 함수 안에

자료형 변수를 선언하듯

선언해줘야 한다.

 

그럼 각각의 이름, 성적, 평균에 어떻게 데이터를 넣을까?

바로

 

변수명을 쓰고 .(마침표)를 찍으면

이렇게 사용가능한 목록이 나온다.

이를 선택하거나 입력해서 대입해 주면 된다.

 

이때 stu. 뒤에 있는 

name, kor, eng, avg를 멤버(member)변수라고 한다.

이렇게 맴버 변수끼리 연산도 가능하다.

 

더 나아가서 새로운 함수를 만들어서 

구조체를 파라미터로 사용해 쓸 수도 있다.

 

이때, 함수의 프로토타입을 struct 설계 밑에

써야 한다.

 

 

구조체끼리의 중첩도 가능하다!!

구조체 중첩

 

사진을 보면 Address라는 구조체를 설계하고

이 구조체를 Person 안에 넣었다.

 

이 구조체에 넣을때는 .(마침표)를 찍었을 때 

안에 있는 구조체를 선택하고 한번 더 .(마침표)를 찍어서

멤버 변수를 선택해 주면 된다.

(앞으로 java에서 매우 많이 사용할 것이니 완벽히 이해는 못해도 느낌을 알아가자)

 

구조체 배열

 

또 구조체를 배열을 이용해 사용해서 여러 명의 데이터를 쉽게 제어할 수 있다.

 

 

포인터를 써서 구조체 제어

 

포인터를 써서 구조체를 제어할 땐

새로운 방법을 사용하게 된다.

 

위 사진처럼 포인터 변수 pp를 만들게 되고

이를 이용해 출력하려면 우리가 배운 포인터의 특징을 이용해

*pp.name 이렇게 해야 한다. 

그러나 연산의 우선순위에 따라 .(마침표)가 우선되어

*가 뒤늦게 계산된다.

따라서 ( )를 통해 우선순위를 조정해줘야 하는 상황이 나타난다.

그러나 이런 방법의 표현을 좀 더 깔끔하고 직관적이게 하기 위해

-> 를 사용해서 

포인터로 구조체를 제어할 수 있다.

 

 


 

여기까지 해서 c언어가 끝났다.!!!!

Java를 하기 전에 C++을 약간 배우고

넘어가면 더 수월하다고 하니
잠시 C++을 공부할 것이다.