일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- 문제풀이
- 정보처리산업기사
- 소프티어
- 회고
- 프로그래머스
- 1과목
- 스프링
- CJ UNIT
- java
- MYSQL
- 코딩봉사
- 알고리즘
- 자바
- 시나공
- 백준알고리즘
- 파이썬
- 코틀린
- kotlin
- SW봉사
- 백준
- python
- 데이터베이스
- SQL
- C++
- 코딩교육봉사
- softeer
- 백준 알고리즘
- programmers
- BFS
- 공부일지
- Today
- Total
JIE0025
[C++] 클래스(class), 객체(Object) 본문
바로 전 게시글에서 구조체에 대해서 알아봤다.
마지막에 구조체는 클래스의 일종으로 간주된다고 했었는데
클래스와 구조체의 다른점은
- 선언시 키워드 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함수의 몸체로 대체 되어야함. 즉 선언과 동일한 파일에 저장되어 컴파일러가 동시에 참조할 수 있어야한다.
'기타 학습 > Language' 카테고리의 다른 글
[C++] 생성자와 소멸자, 복사생성자 (0) | 2022.05.17 |
---|---|
[ C++ ] 객체지향 프로그래밍의 개념, 정보은닉과 캡슐화 (0) | 2022.05.16 |
[C++] 구조체 (0) | 2022.05.10 |
[C++] 동적할당 new , 소멸 delete (0) | 2022.05.10 |
[C++] 참조자 (&) (0) | 2022.05.10 |