관리 메뉴

JIE0025

[C++] 클래스(class), 객체(Object) 본문

기타 학습/Language

[C++] 클래스(class), 객체(Object)

Kangjieun11 2022. 5. 11. 14:12
728x90

 

바로 전 게시글에서 구조체에 대해서 알아봤다. 

마지막에 구조체는 클래스의 일종으로 간주된다고 했었는데

 

클래스와 구조체의 다른점은 

- 선언시 키워드 struct > class 로 바뀐다는 것 

- 구조체변수 초기화의 방법을 사용하지 못한다. struct s = {1,2,3};

 

클래스 내에서 선언된 변수는 클래스 내에 선

Car c1;

 

 

클래스의 접근제어 지시자

- public : 어디서든 접근허용

- protected : 상속 관계에서 유도 클래스에서 접근허용

- private : 클래스 내에서만 접근 허용 (클래스 내 정의된 함수)

 

 

 

윤성우 열혈 C++책에서 가져온

>> 접근제어 지시자 + namespace + enum + class 예제 

 

정보은닉을 위해 변수는 private, 접근위한 함수는 public으로 설정된다. 

#include <iostream>
#include<string>

using namespace std;

namespace CAR_CONST {

	enum {
		ID_LEN = 20, MAX_SPEED = 200, FUEL_STEP = 2,
		ACC_STEP = 10, BRK_STEP = 10
	};

}
class Car {

private:
	char gamerId[CAR_CONST::ID_LEN];
	int fuelGauge;
	int curSpeed;

public:
	void InitMember(char* id, int fuel);
	void ShowCarState();
	void Accel();
	void Break();

};

void Car::InitMember(char* id, int fuel) {
	strcpy(gamerId, id);
	fuelGauge = fuel;
	curSpeed = 0;
}

void Car::ShowCarState() {
	cout << "소유자id : " << gamerId << endl;
	cout << "연료량 : " << fuelGauge << endl;
	cout << "현재속도 : " << curSpeed << endl;
}

void Car::Accel() {
	if (fuelGauge <= 0) {
		return;
	}
	else {
		fuelGauge -= (CAR_CONST::FUEL_STEP);
	}

	if ((curSpeed + CAR_CONST::ACC_STEP) >= CAR_CONST::MAX_SPEED) {
		curSpeed = CAR_CONST::MAX_SPEED;
		return;
	}
	curSpeed += CAR_CONST::ACC_STEP;
}

void Car::Break() {
	if (curSpeed < CAR_CONST::BRK_STEP){
		curSpeed = 0;
		return;
	}
	curSpeed -= CAR_CONST::BRK_STEP;
}

int main() {

	Car run01;
	run01.InitMember("run01", 100);
	run01.Accel();
	run01.Accel();
	run01.Accel();
	run01.ShowCarState();
	run01.Break();
	run01.ShowCarState();

	return 0;
}

 

 

 

Object 객체

구조체와 클래스의 변수 

 

멤버변수(클래스 내에 구성 /선언 된 변수)

Car 클래스의 멤버변수는

char gamerId[CAR_CONST::ID_LEN];
int fuelGauge;
int curSpeed;

 

멤버 함수 (클래스를 구성하는 함수)

void InitMember(char* id, int fuel);
void ShowCarState();
void Accel();
void Break();

 

 

 

헤더파일로의 분리

- Car.h 클래스의 선언을 담는다.

- Car.cpp 클래스의 정의(멤버함수의 정의)를 담는다.

 

 

클래스의 선언 : 컴파일러가 Car클래스와 관련된 문장의 오류를 잡아내는데 필요한 최소한의 정보

클래스의 정의 : 컴파일에 필요한 정보는 없고 링커에 의해 하나의 실행파일로 묶이면 됨.

 

 

위의 예제를

Car.h 

Car.cpp

Main.cpp 로 나누어보자.

//Car.h

#ifndef __CAR_H__
#define __CAR_H__

namespace CAR_CONST{
	enum{
    	ID_LEN =20 , MAX_SPD =200, FULL_STEP = 2,
    	ACC_STEP = 10, BRK_STEP = 10
    };
}
class Car {
private:
	char gamerId(CAR_CONST::ID_LEN);
    int fuelGuage;
    int curSpeed;
public:
	void InitMember(Char *id, int fuel);
    void ShowCarState();
    void Accel();
    void Break();
};

#endif
// Car.cpp
#include <iostream>
#include<string>
#include "Car.h"

using namespace std;

void Car::InitMember(char* id, int fuel) {
	strcpy(gamerId, id);
	fuelGauge = fuel;
	curSpeed = 0;
}

void Car::ShowCarState() {
	cout << "소유자id : " << gamerId << endl;
	cout << "연료량 : " << fuelGauge << endl;
	cout << "현재속도 : " << curSpeed << endl;
}

void Car::Accel() {
	if (fuelGauge <= 0) {
		return;
	}
	else {
		fuelGauge -= (CAR_CONST::FUEL_STEP);
	}

	if ((curSpeed + CAR_CONST::ACC_STEP) >= CAR_CONST::MAX_SPEED) {
		curSpeed = CAR_CONST::MAX_SPEED;
		return;
	}
	curSpeed += CAR_CONST::ACC_STEP;
}

void Car::Break() {
	if (curSpeed < CAR_CONST::BRK_STEP){
		curSpeed = 0;
		return;
	}
	curSpeed -= CAR_CONST::BRK_STEP;
}
// main.cpp

int main() {

	Car run01;
	run01.InitMember("run01", 100);
	run01.Accel();
	run01.Accel();
	run01.Accel();
	run01.ShowCarState();
	run01.Break();
	run01.ShowCarState();

	return 0;
}

 

 

 

** 인라인 함수는 헤더파일에 같이 넣기 

ShowCarState와 Break를 인라인화 한다음, Car.cpp에 두면 컴파일 에러가 발생한다.

컴파일 과정에서 함수의 호출문이 있는 부분에 함수의 몸체부분이 삽입되어야 하는데

 

메인에서 Break 가 호출되었을때

- 인라인 함수가 아니라면 > Car의 멤버 함수인지만 체크하고 컴파일 완료

- 인라인 함수라면 > 컴파일러에 의해 호출문장 자체가 Break함수의 몸체로 대체 되어야함. 즉 선언과 동일한 파일에 저장되어 컴파일러가 동시에 참조할 수 있어야한다.