일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
- 디버깅
- 딥러닝
- 컴퓨터비전
- 데이터베이스
- CSS
- 순환신경망
- JSP
- 상속
- JDBC
- 중학수학
- 파이썬
- 자바 실습
- 자바
- 데이터분석
- 오블완
- 컴퓨터구조
- 혼공머신
- JSP/Servlet
- 자바스크립트
- 개발일기
- rnn
- 정보처리기사실기
- 중학1-1
- SQL
- 머신러닝
- html/css
- 연습문제
- 자바스크립트심화
- 정보처리기사필기
- c언어
- Today
- Total
클라이언트/ 서버/ 엔지니어 "게임 개발자"를 향한 매일의 공부일지
복합 데이터형 3 : 구조체 본문
이제 드디어 구조체 학습에 들어간다. 벌써 9시가 다 되었지만 난 어제처럼 늦게까지 공부를 하고 취침을 하려고 한다. 어제 잠을 얼마 못 자서 그런지 낮잠을 너무나 많이 자버렸다. 그 시간을 만회하고자 오늘 밤은 불철주야 프로그래밍 공부에 매진해 보자.
이번주만 견디면 다음 주에는 많이 힘들지 않을 것 같다. 힘을 내보자. 공부하는 것만이 나의 살길이다!
4. 구조체
한 명의 농구 선수에 관련된 모든 정보를 저장해야 한다고 가정해 보자. 모든 정보를 하나로 묶을 수 있는 데이터 형식으로는 배열이 적합하지 않다. 왜냐하면 배열은 여러 개의 값을 저장할 수는 있지만, 데이터형이 모두 같아야 하기 때문이다. 구조체를 사용하면 서로 관련된 정보를 하나의 단위로 묶어서 저장할 수 있다. 하나의 구조체 안에서 여러 중류의 데이터를 저장할 수 있기 때문에 배열보다 융통성이 있다.
C++에서의 구조체는 객체 지향 프로그래밍의 핵심인 클래스의 기초가 된다. 구조체는 사용자가 정의할 수 있는 데이터형이다. 데이터형의 특성을 정의하는 구조체 선언이 필요하다. 데이터형을 정의한 후에는 그 데이터형의 변수를 생성할 수 있다. 구조체는 두 단계를 거쳐 생성된다.
1. 구조체 서술을 정의하는 단계
- 구조체 안에 저장할 여러 가지 데이터형을 서술하고 이름을 정함
2. 구조체 서술에 따라 구조체 변수를 생성하는 단계
- 구조체 객체를 생성함
구조체 선언
struct inflatable
{
char name[20];
float volume;
double price;
};
이 리스트의 각 항목을 멤버라고 부른다. inflatable 구조체는 3개의 멤버를 가지고 있는 셈이다.
템플릿을 만든 다음에는 그 데이터형의 변수들을 생성할 수 있다. C++에서는 구조체 태그를 기본 데이터형의 이름처럼 사용할 수 있다. 또한 키워드 struct를 생략해도 에러가 발생하지 않는다.
프로그램에 구조체 사용하기
예제 11번 : structur.cpp
구조체 선언을 두는 위치
- main() 함수 안에 여는 중괄호 바로 뒤에
- main() 함수의 앞에
함수의 밖에 선언을 두는 것을 외부 선언이라 한다. 외부 선언은 선언 이후에 나오는 모든 함수들이 사용할 수 있으나, 내부 선언은 그 선언이 들어 있는 함수에서만 사용할 수 있다.
변수도 내부적 또는 외부적으로 선언할 수 있다. 초기화 값들은 반드시 콤마로 구분해야 한다.
구조체가 string 클래스 멤버를 사용할 수 있을까?
문자 배열 대신에 string 클래스 객체를 name 멤버에 사용할 수 있을까?
struct inflatable
{
std::string name;
float volume;
double price;
};
string 클래스 멤버를 가진 구조체의 초기화를 지원하지 않는 낡은 컴파일러를 사용하지 않는 한 가능하다. 독자의 구조체 정의가 std 이름 공간에 접근할 수 있는지 여부를 확인해야 한다. 또 다른 방법으로 name을 std::string형으로 선언할 수 있다.
구조체의 기타 특성
C++에서는 사용자가 정의한 데이터형을 내장 데이터형과 동일한 방식으로 다룰 수 있다. 예를 들어, 구조체를 함수에 매개변수로 전달할 수 있으며, 구조체를 리턴값으로 사용할 수 있다.
대입 연산자를 사용하여 하나의 구조체를 같은 데이터형의 다른 구조체에 대입할 수 있다. 이때에는 한 구조체의 멤버 값들이 상대방 구조체의 해당 멤버에 각각 대입된다. 배열도 대입되는 하나의 멤버가 될 수 있다.
예제 12번 : assgn_st.cpp
bouquet 구조체의 멤버 값들이 choice 구조체의 멤버들에 각각 대입되었다. 구조체 템플릿의 정의와 구조체 변수의 생성을 하나로 결합할 수 있다. 이렇게 하려면 닫는 중괄호 뒤에 변수 이름을 두어야 한다.
struct perks
{
int key_number;
char car[12];
} mr_simith, ms_jones; // 두 개의 perks 변수
이러한 방식으로 변수를 생성할 때 초기화도 함께 처리할 수 있다.
struct perks
{
int key_number;
char car[12];
} mr_glitz =
{
7, // mr_glitz.key_number 멤버의 값
"Packard" // mr_glitz.car 멤버의 값
};
그러나 구조체 템플렛의 정의와 구조체 변수의 선언을 분리해 놓는 것이 프로그램을 더 이해하기 쉽게 만든다.
구조체의 배열
구조체의 배열을 만드는 방법은 기본 데이터형의 배열을 만드는 것과 같다. 예를 들어, inflatable형 구초체 100개를 원소로 가지는 배열을 생성하려면 다음과 같이 할 수 있다.
inflatable gifts[100]; // inflatable형 구조체 100개 배열
cin >> gifts[0].volume; // 첫번째 구조체의 volume 멤버에 입력
cout << gifts[99].price << endl; // 마지막 구조체의 price 멤버를 출력
구조체의 배열을 초기화하는 방법은 구조체 초기화 규칙과 배열 초기화 규칙을 하나로 결합하는 것이다. 즉, 배열 원소가 구조체이므로, 배열 원소의 각 값을 구조체 초기화 형식으로 나타낸다.
예제 13번 : arrstruc.cpp
학습을 마치고
구조체 이야기는 여기까지만 해도 될 것 같다. 나중에 깊이 있게 공부하며 더 많은 것들을 이해하게 될 테니 지금 다 알지 못해도 조급해하지 않기로 했다. 겨우 4장의 절반밖에 학습을 마치지 못했다. 뒤에 있는 내용은 지금 당장 필요한 내용은 아니라 넘어가고 여기까지 4장 연습문제를 풀어보려고 한다.
구조체는 말만 들어도 어려워 보였는데 실제로 공부해 보니 별로 그렇지 않았다. 기본 데이터형이나 별로 다를 게 없었다.
'프로그래밍 언어 > C++' 카테고리의 다른 글
루프와 관계 표현식 1 : for 루프 1 - for문에서 증감/감소 연산자까지 (0) | 2024.08.25 |
---|---|
복합 데이터형 4 : 배열 ~ 구조체 단원 연습문제 풀기 (0) | 2024.08.25 |
복합 데이터형 2 : string 클래스 (0) | 2024.08.25 |
복합 데이터형 1 : 배열과 문자열 (0) | 2024.08.25 |
데이터 처리 3 : 단원 연습문제 풀기 (0) | 2024.08.25 |