[c++][7강] 클래스 기초
1. c++에서의 구조체 변수 선언
c언어 c++
struct Car basicCar; => Car basicCar; // c++에서는 struct 키워드 생략 가능
2. 구조체 속 함수와 기호상수(enum)
//구조체 안에 함수 삽입가능
struct Car
{
enum //열거체(#define ID_LEN 20 과 같은 역할)
{
ID_LEN =20, //타입이 없을 시 정수형
MAX_SPD =200,
FUEL_STEP =2,
ACC_STEP =10
};
char userID[ID_LEN];
int fuel;
int speed;
void showCarState(){...} //구조체 안에 함수 삽입 가능 *인자 전달이 필요없다는 것이 유용
void Accel(){...}
void Break(){...}
}
2-1 외부로 빼낸 함수
-구조체 안 함수가 너무 길어질 경우 밖으로 뺄 수도 있음.
단 void Car::ShowCarState(){...} Car::을 통해 Car에 속해있다는 것을 정의 해줘야 함.
구조체 안에는 void showCarstate();로 어떤 함수가 있는지만 명시(프로토 타입만 정의)
3. 클래스와 구조체의 차이점
-타입만 다름 struct car{};가 class car{};로
-클래스는 기본 제한자가 private임.
public | 어디서든 접근 가능 |
protected | 상속, 유도 클래스에서의 접근 가능 |
private | 클래스 내(에 정의된 함수)에서만 접근 가능 |
class Car
{
private: //이 밑으로는 다 private
char gamerID[CAR_CONST::ID_LEN]; //멤버 변수
int fuel;
int carSpeed;
public: //이 밑으로는 다 public
void InitMevers(char ID, int fuel); //멤버 함수
void Accel();
}
4. c++에서의 파일 분할
-클래스의 선언은 일반적으로 헤더파일에 삽입해야함.
-인라인 함수(클래스 안에 정의된 함수)는 헤더파일에 함께 정의 되어야함.
-ex)Car.h Car.cpp
<lab실습>
lab1)lamp 밝기 조절
Lamp.h
#pragma once
class Lamp {
private:
bool m_isOn;
int m_illuminance;
public:
void powerOnOff();
void changeLight();
void showStatus();
void init();
};
Lamp.cpp
#include <iostream>
#include "Lamp.h" //""은 현재 디렉토리에서 불러옴(사용자정의 헤더파일)
using namespace std;
void Lamp::powerOnOff() {
m_isOn = !m_isOn;
}
void Lamp:: init() {
m_isOn = false;
m_illuminance = 1;
}
void Lamp::changeLight() {
if (m_isOn) {
if (m_illuminance < 3)
m_illuminance++;
else
m_illuminance = 1;
}
}
void Lamp::showStatus() {
if (m_isOn)
cout << "밝기 : " << m_illuminance<< "\n";
}
Lamp_Test.cpp
#include "Lamp.h"
#include <iostream>
int main() {
Lamp lamp1;
lamp1.init();
lamp1.powerOnOff();
lamp1.changeLight();
lamp1.changeLight();
lamp1.changeLight();
lamp1.changeLight();
lamp1.showStatus();
return 0;
}
lab2) 사용자로부터 lamp 조종
lamp.cpp와 lamp.h는 lab1과 동일
user.h
#pragma once
#include <string>
#include "Lamp.h"
using namespace std;
class User {
private:
string m_name;
public:
void turnOnOff(Lamp& lamp); //lamp레퍼런스 변수
void changeLight(Lamp& lamp);
void init();
};
user.cpp
#include "User.h"
void User::turnOnOff(Lamp& lamp) {
lamp.powerOnOff();
}
void User::changeLight(Lamp& lamp) {
lamp.changeLight();
}
void User::init() { //user 멤버변수 초기화
m_name = "No Name";
}
lamp_test.cpp
#include "Lamp.h"
#include "User.h"
#include <iostream>
int main() {
Lamp lamp1;
lamp1.init();
Lamp lamp2;
lamp2.init();
Lamp lamp3;
lamp3.init();
User user1;
user1.init();
user1.turnOnOff(lamp2);
user1.turnOnOff(lamp3);
user1.changeLight(lamp2);
cout << "lamp1 상태\n";
lamp1.showStatus(); //lamp1은 꺼져있어서 상태 출력x
cout << "lamp2 상태\n";
lamp2.showStatus();
cout << "lamp3 상태\n";
lamp3.showStatus();
return 0;
}
결과화면
※내가 가지고 있는 멤버를 사용할 때는 ' . '을 사용(ex lamp1.m_isOn) 포인터변수로 가리키고 있는 멤버를 사용할 때는 ' ->'사용(ex p_lamp->init())
lab3) lamp 동적할당, 포인터변수, 배열
#include "Lamp.h"
#include "User.h"
#include <iostream>
int main() {
Lamp lamp1;
lamp1.init(); //내가 가진 lamp이므로 ' . ' 사용
Lamp* p_lamp = &lamp1; //lamp1의 주소값을 갖는 포인터 변수
Lamp* p_lamp2 = new Lamp(); //동적할당
p_lamp->init();
p_lamp->init();
p_lamp2->powerOnOff();
p_lamp2->changeLight();
//배열 만들때
Lamp lamp3[4];
lamp3[0].init();
return 0;
}
lab4) tv+user클래스