2 minute read

1. C++ 구조체

  • 목적 : 여러 데이터를 하나로 묶기 위해서!

  • 선언 방법

struct Car{
    char ID[LEN];
    int fuel;
    int speed;

    void Accel(){
        //대충 코드
    }

    void Break(){
        //대충코드
    }
};

Car audi;   //구조체 변수 선언, 일반적인 변수 선언과 똑같음
  • 위 코드에서 함수를 밖으로 빼도 된다
struct Car{
    char ID[LEN];
    int fuel;
    int speed;

    void Accel();   //함수 선언
    void Break();
};

void Car::Accel(){  //Accel함수가 Car에 정의되어 있음을 알려줌
    //대충 코드
}

void Car::Break(){
    //대충코드
}
  • 구조체 내에 포함되는 함수가 너무 길면 가독성이 떨어지고
    한눈에 정보가 안들어오기 때문!

2. 클래스(Class)와 객체(Object)

✏️접근제어 지시자

  • 구조체와 달리 클래스는 각각의 변수와 함수의 접근 허용범위를 별도로 선언해야 하기 때문에 필요하다.
  • public : 어디서든 접근 가능
  • private : 상속관계에 놓여있을 때, 자식클래스가 접근 가능
  • protected : 클래스 내에서만 접근 가능
  • 구조체 default : public
  • 클래스 default : private

  • 접근제어 지시자는 특정 위치정보를 알리는 라벨이어서 콜론 (:)이 붙는다.
class Car{
    private:    //같은 클래스 내에서 접근 가능
        char gamerID[ID_LEN];
        int fuel;
        int curSpeed;

    public:     //아무나에게 오픈마인드
        void InitMem(char *ID,  int fuel);
        void Accel(); 
};

void Car::InitMem(char *ID, int fuel){  //초기화 함수
    strcpy(gamerID, ID);
    fuel = fuel;
    curSpeed = 0;
}

void Car::Accel(){
    //대충 메소드 코드
}

int main(void){
    Car run99;  
    run99.InitMem("run99", 100);    //public이므로 내킬 때 부를 수 있음
    run99.Accel();
    //대충 나머지 코드
}

위 코드를 보면 구조체와 달리 main()함수에서 바로 클래스의 변수(ID, fuel, curSpeed)에 접근하여 값을 줄 수 없기 때문에, 아무에게나 열려있는 초기화 함수를 호출하여 변수를 전달한다.
이 초기화 함수는 클래스 내에 선언되어 있어 private으로 정의된 변수에 접근할 수 있다.

main() –> Init() –> Car::변수

✏️용어정리

  • 멤버변수 : 클래스 내에 선언된 변수
  • 멤버함수 : 클래스 내에 정의된 함수(정의를 클래스 밖으로 뺄 수 있음)

✏️C++ 파일분할

헤더파일(.h) : 클래스의 선언
소스파일(.cpp) : 클래스의 정의

//예시
//Car.h 

/* 
ifndef는 "If not defined"의 약자로서 "~을 정의하지 않았다면" 이라는 뜻이다.

 따라서, __CAR_H__를 #define문장으로 정의하지 않았다면 
 #endif 문장 이전 내용을 include영역에 포함시키라는 뜻이다.
 */
#ifndef __CAR_H__
#define __CAR_H__

class Car{
    private:    
        char gamerID[ID_LEN];
        int fuel;
        int curSpeed;

    public:  
        void InitMem(char *ID,  int fuel);
        void Accel(); 
};

#endif
//Car.cpp
#include "Car.h"

void Car::InitMem(char *ID, int fuel){  
    strcpy(gamerID, ID);
    fuel = fuel;
    curSpeed = 0;
}

void Car::Accel(){
    //대충 메소드 코드
}
  • main()함수는 Main.cpp 소스파일을 따로 만들어서 분리하는게 좋다

  • 인라인함수는 헤더파일에 정의되어야 한다.

    보통 컴파일러는 함수가 클래스의 멤버함수인지만 확인하지만,
    인라인함수는 컴파일러가 정의된 코드로 바꿔놓기 때문에 같은 파일에 있어야한다.

3. 객체지향(OOP)

책에는

“객체지향 프로그래밍은 현실에 존재하는 사물과 대상,
그리고 그에 따른 행동을 있는 그대로 실체화 시키는 형태의 프로그래밍이다”

라고 나와있는데, 예전에 자바 공부하면서 내가 대충 이해한 바로는,

변수 = 객체
메소드 = 행동

의 역할을 해주는 것 같다.

“고양이는 생선장수에게서 고등어를 훔쳤다.”

라고 한다면, 고양이와 생선장수가 객체가 될 것이고, 고등어를 훔치는 것이 메소드가 되는 것 같다.

class 고양이{
    int 생선 ;
    void 훔치다();
}

class 생선장수{
    int 생선 ;
    void 사다();
}

이런식?
그리고 여기서 고양이 고영희; 라고 하면 고양이 클래스의 프로퍼티를 갖는 고영희라는 객체가 만들어지는 것이다.

✏️객체생성(동적)

  • ClassName objName; //일반적인 변수의 선언방식
  • ClassName * ptrObj = new ClassName //동적 할당(힙 저장)

✏️메세지패싱

  • 객체간의 대화방법
  • 함수 호출하는 것과 같다

    생선을 훔치고 싶은 고양이(객체)가 생선장수(객체)의 생선을 훔칠 때,
    훔치다() 함수를 호출한다. –> message passing

🤔

“c++이 객체지향 언어이다”라는 것을 확실하게 느끼기 위해선 직접 규모가 꽤 되는 코드를 짜보거나, 프로젝트를 진행해봐야 할 것 같다.
아직은 쪼렙이라,,긴가민가밍숭맹숭한 수준이다.

Tags: ,

Categories:

Updated: