| 프로그래밍 방식 | 설명 |
|---|---|
| 절차 지향 (Procedural) | 함수 중심, 의식의 흐름대로 코드가 진행됨 |
| 객체 지향 (Object-Oriented) | 객체 중심, 데이터와 동작을 하나로 묶어 조립하는 방식 |
hp, attack, x, yMove(), Attack(), Die()Knight 클래스 설계)#include <iostream> // 입출력 기능 제공
using namespace std; // std:: 생략
#include <iostream> : cout, cin을 사용하기 위해 포함 using namespace std; : std::cout 대신 cout으로 사용 가능 Knight 클래스 선언class Knight
{
public:
// 멤버 함수 선언
void Move(int y, int x);
void Attack();
void Die()
{
hp = 0;
cout << "Die" << endl;
}
public:
// 멤버 변수 선언
int hp;
int attack;
int posY;
int posX;
};
📌 클래스 선언
class Knight : Knight라는 클래스(설계도)를 정의 public: : 외부에서도 접근 가능한 멤버 변수 및 함수 정의 hp, attack, posY, posX : 기사(Knight)의 상태(속성) Move(), Attack(), Die() : 기사(Knight)의 동작(기능) 📌 주요 개념
void Knight::Move(int y, int x)
{
posY = y;
posX = x;
cout << "Move" << endl;
}
void Knight::Attack()
{
cout << "Attack : " << attack << endl;
}
📌 멤버 함수 정의
Knight::Move(int y, int x) : 기사 객체를 (y, x) 위치로 이동 Knight::Attack() : 기사 객체가 공격을 수행하며 attack 값을 출력 📌 클래스 내부에서 정의하지 않은 이유
main() 함수 - 객체 생성 및 사용int main()
{
// 객체 생성 및 초기화
Knight k1;
k1.hp = 100;
k1.attack = 10;
k1.posY = 0;
k1.posX = 0;
Knight k2;
k2.hp = 80;
k2.attack = 5;
k2.posY = 1;
k2.posX = 1;
// 객체의 멤버 함수 사용
k1.Move(2, 2);
k1.Attack();
k1.Die();
return 0;
}
📌 객체 생성 및 사용
1. Knight k1; : k1 객체 생성
2. k1.hp = 100; : 멤버 변수 초기화
3. k1.Move(2, 2); : k1 객체의 Move() 함수 실행
4. k1.Attack(); : k1 객체의 Attack() 함수 실행
5. k1.Die(); : k1 객체의 Die() 함수 실행
📌 k1과 k2는 독립적인 객체
k1과 k2는 각각 다른 메모리 공간을 차지하며, 서로 영향을 주지 않음 Knight 클래스를 사용하지만, 각각의 개별적인 상태를 유지 void Move(Knight* knight, int y, int x)
{
knight->posY = y;
knight->posX = x;
}
📌 절차 지향 방식
Knight 객체의 포인터를 받아 위치를 변경하는 전역 함수 Move(&k1, 2, 2); 처럼 객체를 직접 넘겨야 함 📌 객체 지향 방식
k1.Move(2, 2);
Move()가 Knight 클래스 내부에 포함되어 있어 k1 객체가 직접 동작을 수행 📌 절차 지향 vs 객체 지향
| 방식 | 설명 | 코드 예제 |
|------|------|----------|
| 절차 지향 | 함수를 통해 데이터 변경 | Move(&k1, 2, 2); |
| 객체 지향 | 객체 내부에서 상태 변경 | k1.Move(2, 2); |
struct와 class의 차이struct StatInfo
{
int hp;
int attack;
int defence;
};
📌 C++에서 struct와 class의 차이
| 구분 | struct | class |
|------|---------|--------|
| 기본 접근 지정자 | public | private |
| 사용 목적 | 단순 데이터 저장 | 데이터 + 동작 포함 |
| 예제 | struct StatInfo {...}; | class Knight {...}; |
struct는 기본적으로 모든 멤버가 publicclass는 기본적으로 모든 멤버가 private💡 하지만 C++에서는 struct에도 함수 정의 가능 → class와 거의 동일
Move() 호출 방식 비교 (절차 지향 vs 객체 지향)Move(&k1, 2, 2); // 절차 지향 방식 (전역 함수)
k1.Move(2, 2); // 객체 지향 방식 (멤버 함수 호출)
📌 두 방식의 차이점
Move() 함수가 Knight 객체와 별도로 존재 Move() 함수가 Knight 내부에서 정의되어 k1이 직접 함수 실행 📌 메모리 주소 확인
003827CE lea eax, [k1] // k1을 eax에 넣음
003827D1 push eax
003827D2 call Move (0381447h) // Move 함수를 실행
Move(&k1, 2, 2);와 k1.Move(2, 2);의 실행 방식은 크게 다르지 않지만, Knight 클래스 선언 및 구현class Knight
{
public:
void Move(int y, int x);
void Attack();
void Die()
{
hp = 0;
cout << "Die" << endl;
}
public:
int hp;
int attack;
int posY;
int posX;
};
void Knight::Move(int y, int x)
{
posY = y;
posX = x;
cout << "Move" << endl;
}
void Knight::Attack()
{
cout << "Attack : " << attack << endl;
}
main() 함수int main()
{
Knight k1;
k1.hp = 100;
k1.attack = 10;
k1.Move(2, 2);
k1.Attack();
k1.Die();
return 0;
}