Topic 1: 구조체 기초 🏗️
🎯 학습 목표
- 구조체의 개념과 필요성을 이해할 수 있다
- 구조체를 선언하고 멤버에 접근하는 방법을 익힐 수 있다
- 구조체를 활용한 실제 프로그램을 작성할 수 있다
- 구조체와 기본 타입의 차이점을 설명할 수 있다
🤔 구조체가 왜 필요할까요?
학생의 정보를 저장한다고 생각해보세요. 이름, 나이, 성적을 각각 다른 변수로 관리한다면 어떨까요?
// ❌ 비효율적인 방법
string student1_name = "김철수";
int student1_age = 20;
double student1_grade = 3.8;
// 학생이 여러 명이라면...?
string student2_name = "이영희";
int student2_age = 19;
double student2_grade = 4.2;
문제점: 관련된 데이터가 흩어져 있어 관리하기 어려워요!
해결책: **구조체(struct)**로 관련된 정보를 하나로 묶어서 관리할 수 있습니다! 📦
📚 구조체란 무엇인가?
구조체는 서로 다른 타입의 데이터들을 하나로 묶어서 새로운 자료형을 만드는 것입니다.
비유로 이해하기: 📦 택배 상자처럼 생각해보세요!
- 택배 상자 = 구조체
- 상자 안의 각 물건 = 멤버 변수
- 물건의 실제 내용 = 데이터
하나의 상자에 이름표, 주소, 전화번호를 함께 넣어두면 관리가 쉬워지죠!
🔧 구조체 선언하기
기본 문법
struct 구조체이름 {
데이터타입 멤버변수1;
데이터타입 멤버변수2;
// ...
}; // 세미콜론 필수!
간단한 예제: 학생 정보 구조체
#include <iostream>
#include <string>
using namespace std;
// 학생 정보를 담는 구조체 정의
struct Student {
string name; // 이름
int age; // 나이
double grade; // 학점
};
int main() {
// 구조체 변수 만들기
Student student1;
student1.name = "김철수";
student1.age = 20;
student1.grade = 3.8;
// 정보 출력
cout << "이름: " << student1.name << endl;
cout << "나이: " << student1.age << "세" << endl;
cout << "학점: " << student1.grade << endl;
return 0;
}
🎨 구조체 초기화 방법들
1. 개별 대입
Student s1;
s1.name = "김철수";
s1.age = 20;
s1.id = "2024001";
s1.grade = 3.8;
2. 중괄호를 이용한 초기화
// 순서대로 한번에 초기화
Student s2 = {"이영희", 19, 4.2};
// 일부만 초기화 (나머지는 기본값)
Student s3 = {"박민수", 21}; // grade는 0.0으로 초기화
🏪 실전 예제: 상품 정보 관리
구조체 없이 상품을 관리한다면?
// ❌ 흩어져 있는 정보들
string product_name = "노트북";
int product_price = 800;
bool product_available = true;
구조체로 깔끔하게!
struct Product {
string name;
int price;
bool available;
};
// ✅ 관련된 정보를 하나로 묶음
Product laptop = {"노트북", 800, true};
Product mouse = {"마우스", 30, false};
구조체 함수 활용 패턴
// 구조체를 받는 함수
void displayProduct(const Product& p) { // 참조로 받기 (효율적)
cout << p.name << ": " << p.price << "만원" << endl;
}
// 구조체를 수정하는 함수
void applyDiscount(Product& p, double rate) { // 참조로 받아서 수정
p.price *= (1.0 - rate); // 할인 적용
}
// 구조체를 반환하는 함수
Product createProduct(string n, int s, double p) {
Product newProduct = {n, s, p, true};
return newProduct; // 구조체 전체를 반환
}
왜 이것이 중요한가?
🔗 관련 데이터를 묶어서 실수를 줄입니다
📦 하나의 단위로 쉽게 전달하고 저장할 수 있습니다
🔧 유지보수가 쉬워집니다 - 새 필드 추가도 간단!
📖 코드 가독성이 향상됩니다 - 의미가 명확해집니다
🎮 구조체 설계 원리: 게임 캐릭터
좋은 구조체 설계란?
게임 캐릭터를 예로 구조체 설계 원리를 알아보겠습니다:
// 기본 캐릭터 정보
struct Character {
string name; // 이름
int level; // 레벨
int currentHP; // 현재 체력
int maxHP; // 최대 체력
int attack; // 공격력
int defense; // 방어력
};
구조체 설계 원칙
1. 관련있는 데이터끼리 묶기
// ❌ 관련없는 것들을 섞으면 안됨
struct BadExample {
string playerName;
int score;
string weatherToday; // 게임과 무관한 데이터!
double playerHeight;
};
// ✅ 관련있는 캐릭터 정보만
struct Character {
string name;
int level;
int hp;
int attack;
};
2. 의미있는 이름 사용
// ❌ 의미없는 이름
struct Data {
int a, b, c, d;
};
// ✅ 명확한 의미
struct Character {
string name;
int level;
int health;
int mana;
};
3. 적절한 데이터 타입 선택
struct Character {
string name; // 문자열: 이름
int level; // 정수: 레벨 (1, 2, 3...)
double healthPercent; // 실수: 체력 비율 (0.0~1.0)
bool isAlive; // 불린: 생존 여부
};
구조체로 함수 개선하기
// 구조체 없이 (복잡함)
void attackMonster(string name, int& hp, int& attack, int damage) {
// 여러 매개변수 관리가 복잡
}
// 구조체 사용 (깔끔함)
void takeDamage(Character& player, int damage) {
player.currentHP -= damage;
if (player.currentHP < 0) {
player.currentHP = 0;
}
}
🤔 생각해보기
왜 구조체가 필요할까요?
- 데이터 정리: 흩어진 변수들을 하나로 모음
- 실수 방지: 관련 데이터를 빼먹을 가능성이 줄어듦
- 코드 재사용: 같은 구조를 여러 곳에서 사용 가능
- 유지보수: 구조 변경이 한 곳에서만 이루어짐
간단한 실습
#include <iostream>
using namespace std;
struct Book {
string title;
string author;
int pages;
double price;
};
int main() {
// 여기에 코드를 작성하세요
// 1. Book 구조체 변수를 하나 만들기
// 2. 적절한 값으로 초기화하기
// 3. 책 정보를 출력하기
return 0;
}
💡 구조체 사용 시 주의사항
1. 세미콜론 필수
struct Student {
string name;
int age;
}; // ← 이 세미콜론을 잊지 마세요!
2. 멤버 접근 연산자
Student s;
s.name = "김철수"; // 점(.) 연산자 사용
3. 초기화되지 않은 멤버
struct Test {
int a;
int b;
};
Test t; // a, b는 쓰레기 값을 가질 수 있음
cout << t.a; // ❌ 위험한 코드!
// ✅ 올바른 방법
Test t2 = {0, 0}; // 또는
Test t3{}; // 기본 초기화
🧪 퀴즈 타임!
🤔 퀴즈 1: 다음 구조체 선언에서 잘못된 점은?
struct Book
string title;
int pages;
double price;
}
정답: 중괄호 뒤에 세미콜론(;)이 없습니다!
struct Book {
string title;
int pages;
double price;
}; // ← 세미콜론 필수!
🤔 퀴즈 2: 다음 코드의 출력 결과는?
struct Point {
int x;
int y;
};
Point p = {10, 20};
cout << p.x + p.y;
정답: 30
p.x는 10, p.y는 20이므로 10 + 20 = 30이 출력됩니다.
🤔 퀴즈 3: 부분 초기화의 결과는?
struct Data {
int a;
int b;
int c;
};
Data d = {5, 10};
cout << d.a << " " << d.b << " " << d.c;
정답: 5 10 0
a는 5, b는 10으로 초기화되고, c는 명시되지 않아 0으로 기본 초기화됩니다.
🎯 연습 문제
연습 1: 도서 관리 시스템
책의 정보(제목, 저자, 페이지 수, 가격)를 담는 구조체를 만들고, 3권의 책 정보를 입력받아 출력하는 프로그램을 작성하세요.
💡 힌트
- Book 구조체를 정의하세요
- 배열이나 vector를 사용해서 여러 책을 저장하세요
- 반복문을 사용해서 입력과 출력을 처리하세요
연습 2: 성적 관리 프로그램
학생의 정보(이름, 국어, 영어, 수학 점수)를 저장하는 구조체를 만들고, 총점과 평균을 계산하여 출력하는 프로그램을 작성하세요.
💡 힌트
- 구조체에 총점과 평균을 계산하는 멤버를 추가하거나
- 별도의 함수를 만들어서 계산하세요
연습 3: 직원 정보 시스템
직원의 정보(이름, 부서, 입사년도, 연봉)를 관리하는 구조체를 만들고, 근무 년수를 계산하여 표시하는 프로그램을 작성하세요.
💡 힌트
- 현재 년도에서 입사년도를 빼면 근무 년수를 구할 수 있습니다
- ctime 라이브러리를 사용하면 현재 년도를 얻을 수 있습니다
🎉 마무리
구조체는 C++에서 데이터를 효율적으로 관리하는 핵심 도구입니다!
오늘 배운 내용:
- 🏗️ 구조체의 개념과 필요성
- 📝 구조체 선언과 초기화 방법
- 🔧 멤버 접근 연산자 사용법
- 💻 실전 프로그래밍 예제들
다음 단계:
- Topic 2에서는 구조체 배열과 포인터를 학습합니다
- 구조체를 더 효율적으로 다루는 방법을 배우게 됩니다
- 동적 메모리 할당과의 조합도 살펴볼 예정입니다
구조체를 잘 이해했다면, 이제 더 복잡한 데이터 구조를 다룰 준비가 된 것입니다! 💪