본문 바로가기

C++

c++ 1 (클래스 / 객체지향 - 게임 개발에 매우 중요한 개념)

c++ 는 c언어 그 자체에 객체지향의 개념을 얹은 형태

구조체 struct { ... } 라는 개념에 전용 함수 foo(){ ... } 가 들어가는 형태

즉, 구조체 확장 개념이 클래스

 

c와 c++ 구조체 차이

#include <iostream>
#include <cstdlib>


struct Marine {
    int hp;
    int mp;
    int range;
};


int main(){
    // Marine*m = (Marine*)malloc(sizeof(Marine));
    // free(m);
    Marine*m = new Marine();
    delete m;
    
    // int* myArray = (int*)malloc(sizeof(int) * 10);
    // free(myArray);
    int* myArray = new int[100]; // 사이즈 지정
    delete[] myArray;
    
    std::cout << "Hello World : " << std::endl;
    
    return 0;
}

 

OOP (Object Oriented Programming)

객체 지향 프로그래밍

 

프로그래밍에서 말하는 객체란 속성과 행동을 갖고 있는 개체

속성에 해당하는 것이 멤버 변수, 행동에 해당하는 것이 멤버 함수

#include <iostream>
#include <cstdlib>


struct Marine {
    int hp;
    int atk;
    // 멤버 변수

    void attackTo();
    void moveTo();
    void holdPosition();
    // 멤버 함수
};

 

Abstraction (추상화)

: 어떤 개체가 갖고있는 속성이나 행동을 프로그래밍할 목적에 맞게 간추려내고 

필요한 부분만 가져와서 프로그램에 맞게 변형시키고 간추리는 것

(멤버 변수, 멤버 함수에 동일하게 적용 가능)

 

#include <iostream>
#include <cstdlib>


struct Person {
    int age;
    int gender;
    int name[100];
    // 멤버 변수로 표현된 모습 (속성)
    
    void work() {}
    void off() {}
    // 출근, 퇴근이라는 함수를 갖고 있을 수 있다, 멤버 함수 (행동)
    
    // 이렇게 속성과 행동을 나누는 것 -> 추상화 Abstraction
};
#include <iostream>
#include <cstdlib>


struct Marine {
    int hp = 40;
    int atk = 6;
    float movement = 4.62;
    int atkspeed = 62;
    int def = 0;
    int range = 4;
    // 멤버 변수로 표현된 모습 (속성)
    // 게임상에 실제로 필요한 내용들만 속성으로 가져와서 하나의 유닛으로 취급 ->  추상화
};
#include <iostream>
#include <cstdlib>


struct Peorson {
    void goToWork();
    void workoff();
    void leave();
    void vacation();
    // 필요 없는 부분을 다 빼내고 필요한 내용들만 행동으로 만들어 두는 것 -> 함수에서의 추상화
};

상속 (Inheritance)

: 상속이란 어떤 객체의 속성을 그대로 물려받아 재사용을 할 수 있다는 것

 

우리가 객체를 활용하다 보면 공통된 속성들이 많이 나오게 된다

이런 공통된 속성들을 잘 묶어내게 되면 더 큰 집합을 만들 수 있고 

더 큰 집합체계에서 하나의 단일 개념을 만들 수 있다

이 더 큰 집합을 하나의 클래스로 봤을 때 이 클래스를 상속받아

다른 클래스를 정의하여 코드의 재사용성을 높이고 좀 더 구조적인 개발을 할 수 있다

struct Zealot {
    int shieldAmount = 60;
    int shieldRegen = 2;
    int shieldAmmor = 0;
    int hp = 80;
};


struct Dragon {
    int shieldAmount = 80;
    int shieldRegen = 2;
    int shieldAmmor = 0;
    int hp = 100;
};


// 질럿과 드래곤은 실드량, 실드 방어력, 초당 실드 재생량을 둘 다 갖고 있다 이걸 묶어서 관리하는 방법 -> 상속
   실드량, 실드 방어력, 초당 실드 재생량을 프로토스유닛이라는 클래스에서 할당을 해주고
   이 프로토스유닛이라는 클래스를 그대로 상속받아서
활용하게 되면  
   일일이 유닛을 만들때마다 변수로 선언해 줄 필요 없이 그냥 변수의 값만을 할당해주면 된다
struct ProtossUnit{
    int shieldAmount = 0;
    int shieldRegen = 2;
    int shieldAmmor = 0;
    int hp = 0;
};


struct Zealot : public ProtossUnit {
    Zealot() {
        hp = 80;
        shieldAmount = 60;
    }
};

// Zealot은 ProtossUnit의 부분집합 (Zealot은 ProtossUnit의 모든 속성을 다 갖고 있으면서 추가적으로 다른 속성을 갖고있기 때문)
   질럿은 프로토스 유닛이다 -> 참
   질럿 -> 프로토스 유닛 (자식 클래스 -> 부모 클래스 로 표시)

struct Dragon : public ProtossUnit {
    Dragon(){
        hp = 100;
        shieldAmmor = 80;
    }
};

다형성 (Polymorphism) : 상속에서 파생 되는 것

이런 상속이라는 개념은 다형성이라는 개념을 추가로 만들어낸다.

다형성은 예시를 들어가면서 설명하는 게 가장 이해가 빠르다

동물을 상속받은 닭이 프로그래밍된 코드상에 있다면

닭이라는 개체는 동물이라는 클래스라고 볼 수 있다.