[C++] Chapter 03 - 클래스의 기본

Lee Jeong Min·2020년 12월 27일
0

Cpp

목록 보기
3/16
post-thumbnail
post-custom-banner

03-1 C++에서의 구조체

구조체는 연관 있는 데이터를 묶을 수 있는 문법적 장치
C++에서는 typedef을 선언하지 않아도 구조체를 선언하고 나서 변수를 선언할 수 있음

EX)struct Car basicCar; -> Car basicCar;
원래라면 typedef struct Car {...} Car;로 정의를 해주어야
변수선언 시 Car basicCar로 바로 사용할 수 있지만 C++에선
상관 없다는 이야기

C++에서는 구조체 안에 함수를 삽입하는 것을 허용하므로 다음과 같이 정의할 수 있음

struct Car
{	
    char gamerID[ID_LEN];
    int fuelGauge;
    int curSpeed;
    void ShowCarState(){...};
    void Accel(){...};
}

함수가 구조체 내에 삽입되면서 구조체 내에 선언된 변수에 직접접근이 가능해짐!

구조체안의 ENUM상수의 선언

namespace CAR_CONST
{
    enum
    {
    	ID_LEN = 20,
        MAX_SPD = 200,
        FUEL_STEP = 2,
        ACC_STEP = 10,
        BRK_STEP = 10
    }
}

다음과 같이 이름공간안에 열거형을 선언해두고 필요한 구조체 안에서 CAR_CONST::ID_LEN과 같이 사용을 하면 어느 영역에서 사용되는 상수 인지 쉽게 알 수 있어서 가독성이 좋아짐.

함수는 외부로 뺄 수 있다.

struct Car
{
	...
    void ShowCarState();
    void Accel();
    ...
};

void Car::ShowCarState()
{
	...
}
vpod Car::Accel()
{
	...
}

이렇게 함수 선언과 정의를 구분하여 작성하는 것이 가독성에 도움이 됨.

위에서 언급한 함수 선언과 정의를 구분하여 작성할 시에 주의해야 할 점은 구조체 안에 함수가 정의 되어 있을 시 '함수를 인라인으로 처리해라!' 라는 의미가 내포되어 있어서 정의를 할 시 다음과 같이 작성을 해주어야한다.
inline void Car::ShowCarState() {...}
inline void Car::Accel() {...}

03-2 클래스(Class)와 객체(Object)

클래스와 구조체의 유일한 차이점

기존에 사용하던 struct를 대신해서 class를 사용하면 구조체가 아닌 클래스가 된다. 둘의 유일한 차이점은 class의 기본접근 제어자가 private이기 때문에 클래스 내에 선언된 함수에서만 접근이 가능함.

  • public : 어디서든 접근 허용
  • protected : 상속관계에 놓여있을 때, 유도 클래스에서의 접근 허용
  • private : 클래스 내(클래스 내에 정의된 함수)에서만 접근 허용

용어정리: 객체(Object), 멤버변수, 멤버함수

구조체 변수, 클래스 변수라는 표현을 사용하지 않는데 그 이유로 구조체와 클래스는 변수의 성격만 지니는 것이 아니기 때문에 변수라는 표현을 대신해서 객체(Object)라는 표현을 사용한다.

클래스를 구성하는 변수를 가리켜 '멤버변수'라고 하며 클래스를 구성하는 함수를 '멤버함수'라고 한다.

C++에서 파일분할

  • Car.h --> 클래스의 선언을 담음
  • Car.cpp --> 클래스의 정의(멤버함수의 정의)를 담음
<Car.h>

class Car
{
private:
    char gamerID[CAR_CONST::ID_LEN];
    int fuelGauge;
    int curSpeed;
public:
	void InitMembers(char * ID, int fuel);
    void ShowCarState();
    void Accel();
    void Break();
};
<Car.cpp>

void Car::InitMembers(char * ID, int fuel) {...}
void Car::ShowCarState() {...};
void Car::Accel() {....};
void Car::Break() {...};

인라인 함수는 헤더파일에 함께 넣어야 한다.

그 이유로 컴파일 과정에서 함수의 호출문이 있는 곳에 함수의 몸체 부분이 삽입되어야 하기 때문이다.


03-3 객체지향 프로그래밍의 이해

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

하나의 객체가 다른 하나의 객체에게 메시지를 전달하는 방법은 함수호출을 기반으로 하며 객체지향에서는 이러한 형태의 함수호출을 가리켜 '메시지 전달'이라고 함

FruitSeller의 클래스 내의 함수
int SaleApples(int money)
{
    int num = money/APPLE_PRICE;
    numOfApples -= num;
    myMoney += money;
    return num;
}
FruitBuyer의 클래스 내에 있는 함수
void BuyApples(FruitSeller &seller, int money)
{
    numOfApples += seller.SalesApples(money); // 상호작용 하는 모습
    myMmoey -= money;
}

위의 두 함수를 보면 과일을 사는 사람이 BuyApples이란는 함수를 호출해 다른 하나의 객체(Seller)에게 seller.SalesApples(money)를 실행함으로 써 메시지를 전달하고 있고, 서로 상호작용하는 모습을 볼 수 있음.

profile
It is possible for ordinary people to choose to be extraordinary.
post-custom-banner

0개의 댓글