Topic 1: 클래스의 탄생 - 구조체에서 클래스로 🚀
🎯 학습 목표
- 구조체의 한계점과 클래스의 필요성을 이해할 수 있다
- 클래스와 객체의 개념을 명확히 구분할 수 있다
- 클래스를 선언하고 객체를 생성하는 방법을 익힐 수 있다
- 구조체와 클래스의 차이점을 설명할 수 있다
🤔 구조체의 한계점
지난 시간에 배운 구조체, 기억나시나요? 구조체는 관련된 데이터를 묶어주는 훌륭한 도구였죠!
하지만 구조체에는 아쉬운 점이 있었어요:
struct BankAccount {
string owner;
double balance;
};
int main() {
BankAccount myAccount;
myAccount.owner = "김철수";
myAccount.balance = 1000000;
// 😱 문제점: 누구나 잔액을 직접 수정 가능!
myAccount.balance = -999999; // 말도 안 되는 값!
return 0;
}문제점들:
- 🔓 데이터가 완전히 노출되어 있음
- ❌ 잘못된 값을 막을 방법이 없음
- 🤷 데이터를 처리하는 함수가 구조체와 분리되어 있음
🎨 클래스의 등장!
클래스는 구조체의 이러한 문제들을 해결하기 위해 탄생했습니다!
클래스는 데이터와 그 데이터를 처리하는 함수를 하나로 묶은 것입니다.
붕어빵 틀과 붕어빵 🍥
클래스와 객체의 관계를 이해하는 가장 쉬운 방법:
- 클래스 = 붕어빵 틀 (설계도)
- 객체 = 붕어빵 (실제 만들어진 것)
// 클래스 = 붕어빵 틀
class FishBread {
// 붕어빵의 속성과 기능 정의
};
// 객체 = 실제 붕어빵
FishBread bread1; // 팥 붕어빵
FishBread bread2; // 슈크림 붕어빵
FishBread bread3; // 피자 붕어빵📝 첫 번째 클래스 만들기
기본 문법
class 클래스이름 {
public: // 공개 영역
// 멤버 변수
// 멤버 함수
private: // 비공개 영역
// 보호할 데이터
}; // 세미콜론 필수!실습: 게임 캐릭터 클래스
#include <iostream>
#include <string>
using namespace std;
// 게임 캐릭터 클래스
class GameCharacter {
public: // 공개 영역 - 외부에서 접근 가능
// 멤버 변수
string name;
int level;
// 멤버 함수
void introduce() {
cout << "안녕하세요! 저는 " << name << "입니다!" << endl;
cout << "현재 레벨: " << level << endl;
}
void levelUp() {
level++;
cout << name << "의 레벨이 올랐습니다! 🎉" << endl;
cout << "현재 레벨: " << level << endl;
}
};
int main() {
// 객체 생성 (캐릭터 생성)
GameCharacter hero;
hero.name = "용사";
hero.level = 1;
// 멤버 함수 호출
hero.introduce();
hero.levelUp();
hero.levelUp();
// 또 다른 캐릭터 생성
GameCharacter wizard;
wizard.name = "마법사";
wizard.level = 5;
wizard.introduce();
return 0;
}실행 결과:
안녕하세요! 저는 용사입니다!
현재 레벨: 1
용사의 레벨이 올랐습니다! 🎉
현재 레벨: 2
용사의 레벨이 올랐습니다! 🎉
현재 레벨: 3
안녕하세요! 저는 마법사입니다!
현재 레벨: 5🔄 구조체 vs 클래스
개선된 은행 계좌 예제
#include <iostream>
#include <string>
using namespace std;
// 클래스로 개선한 은행 계좌
class BankAccount {
private: // 비공개 영역 - 직접 접근 불가!
string owner;
double balance;
public: // 공개 영역 - 외부에서 사용 가능
// 계좌 개설
void createAccount(string name, double initialAmount) {
owner = name;
if (initialAmount >= 0) {
balance = initialAmount;
cout << owner << "님의 계좌가 개설되었습니다! 💳" << endl;
} else {
balance = 0;
cout << "초기 금액이 잘못되었습니다. 0원으로 설정합니다." << endl;
}
}
// 입금
void deposit(double amount) {
if (amount > 0) {
balance += amount;
cout << amount << "원 입금 완료! 💰" << endl;
} else {
cout << "입금 금액이 잘못되었습니다! ❌" << endl;
}
}
// 출금
void withdraw(double amount) {
if (amount > 0 && amount <= balance) {
balance -= amount;
cout << amount << "원 출금 완료! 💸" << endl;
} else {
cout << "출금할 수 없습니다! ❌" << endl;
}
}
// 잔액 조회
void checkBalance() {
cout << owner << "님의 잔액: " << balance << "원" << endl;
}
};
int main() {
BankAccount myAccount;
// 계좌 개설
myAccount.createAccount("김철수", 10000);
// 정상적인 거래
myAccount.deposit(5000);
myAccount.checkBalance();
// 잘못된 거래 시도 - 클래스가 보호해줌!
myAccount.deposit(-1000); // 거부됨
myAccount.withdraw(100000); // 거부됨
myAccount.checkBalance();
return 0;
}🎯 클래스의 장점
1. 📦 캡슐화 (Encapsulation)
데이터와 기능을 하나로 묶어서 관리합니다.
2. 🔒 정보 은닉 (Information Hiding)
중요한 데이터를 보호하고 안전한 방법으로만 접근하게 합니다.
3. 🎨 추상화 (Abstraction)
복잡한 내부 구현을 숨기고 쉬운 인터페이스만 제공합니다.
4. ♻️ 재사용성 (Reusability)
한 번 만든 클래스를 여러 곳에서 재사용할 수 있습니다.
💡 핵심 정리
- 클래스: 객체를 만들기 위한 설계도 (틀)
- 객체: 클래스로부터 만들어진 실체
- 멤버 변수: 클래스 안의 데이터
- 멤버 함수: 클래스 안의 함수
- public: 외부에서 접근 가능
- private: 클래스 내부에서만 접근 가능
✅ 실습 체크리스트
🚀 다음 시간 예고
다음 시간에는 캡슐화와 접근 제어에 대해 더 자세히 알아볼 거예요!
- public, private, protected의 차이점
- getter/setter 메서드 패턴
- 왜 데이터를 숨겨야 하는지
“클래스는 객체지향 프로그래밍의 시작입니다! 🎯”
Last updated on