전체 코드

✅ 1. 객체지향 프로그래밍(OOP)란?

💡 프로그래밍 패러다임 비교

프로그래밍 방식설명
절차 지향 (Procedural)함수 중심, 의식의 흐름대로 코드가 진행됨
객체 지향 (Object-Oriented)객체 중심, 데이터와 동작을 하나로 묶어 조립하는 방식
  • 객체(Object) : 프로그램을 구성하는 독립적인 단위(플레이어, 몬스터 등)
  • 클래스(Class) : 객체를 생성하기 위한 설계도(템플릿)
  • 객체 = 속성(데이터) + 기능(동작)
    • 속성(데이터) : hp, attack, x, y
    • 기능(동작) : Move(), Attack(), Die()

📌 2. 객체지향 코드 예제 (Knight 클래스 설계)

✅ 2.1 헤더 포함 및 네임스페이스 설정

#include <iostream>  // 입출력 기능 제공
using namespace std; // std:: 생략
  • #include <iostream> : cout, cin을 사용하기 위해 포함
  • using namespace std; : std::cout 대신 cout으로 사용 가능

✅ 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;
};

📌 클래스 선언

  • class Knight : Knight라는 클래스(설계도)를 정의
  • public: : 외부에서도 접근 가능한 멤버 변수 및 함수 정의
  • hp, attack, posY, posX : 기사(Knight)의 상태(속성)
  • Move(), Attack(), Die() : 기사(Knight)의 동작(기능)

📌 주요 개념

  • 객체는 클래스의 인스턴스(실제 생성된 것)
  • 클래스 자체는 메모리에 올라가지 않으며, 객체가 생성될 때 메모리를 차지함

✅ 2.3 멤버 함수 구현 (클래스 외부)

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 값을 출력

📌 클래스 내부에서 정의하지 않은 이유

  • 클래스 외부에서 구현하는 것이 코드 가독성과 유지보수에 유리
  • 클래스 내부에서 정의할 수도 있지만, 큰 프로젝트에서는 유지보수를 위해 보통 외부에서 구현

✅ 2.4 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() 함수 실행

📌 k1k2는 독립적인 객체

  • k1k2는 각각 다른 메모리 공간을 차지하며, 서로 영향을 주지 않음
  • 같은 Knight 클래스를 사용하지만, 각각의 개별적인 상태를 유지

📌 3. 절차 지향 방식과 객체 지향 방식 비교

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); |


📌 4. structclass의 차이

struct StatInfo
{
    int hp;
    int attack;
    int defence;
};

📌 C++에서 structclass의 차이
| 구분 | struct | class |
|------|---------|--------|
| 기본 접근 지정자 | public | private |
| 사용 목적 | 단순 데이터 저장 | 데이터 + 동작 포함 |
| 예제 | struct StatInfo {...}; | class Knight {...}; |

  • struct는 기본적으로 모든 멤버가 public
  • class는 기본적으로 모든 멤버가 private

💡 하지만 C++에서는 struct에도 함수 정의 가능 → class와 거의 동일


📌 5. 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);의 실행 방식은 크게 다르지 않지만,
    • 객체 지향 방식이 코드의 가독성과 유지보수 측면에서 더 유리함

📌 6. 최종 코드 정리

🔹 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;
}

profile
李家네_공부방

0개의 댓글