공부/C & C++

[C++] 클래스 기초 예제

미친사람 2022. 1. 14. 09:38
반응형

대략적인 클래스

#include <iostream>
#include <windows.h>
#include <stdlib.h>

// 네임스페이스 
using namespace std;

// 글자 색상, 배경 색상 변경 
void tbColor(unsigned short textColor = 7, unsigned short backColor = 0) {
	int color = textColor + backColor * 16;

	SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), color);
}

// ======================================================================================= //

// 클래스 생성 
class Person {
// 접근제어자는 3개
// private   : 기본 상태이며 해당 클래스 내부에서만 접근할 수 있다.
// public    : 클래스 외부에서도 접근할 수 있다.
// protected : 상속관계에 해당하는 클래스만 접근할 수 있다.
private:
	int age;
	char name[20];

public:
	// 생성자 -> 구조체가 만들어질 때 반드시 실행을 시켜줌 (초기화 함수)
	// 생성자는 만드는 규칙이 있다.
	// 1. class  명과 동일해야 한다.
	// 2. return 타입이 없다.
	Person(int age, const char* name) {
		cout << ">> 생성자 호출" << endl;
		this->age = age;
		strcpy(this->name, name);
	}

	~Person() {
		cout << ">> 소멸자 호출" << endl;
	}

	void introduce() {
		tbColor(14, 0); cout << "이름 : "; tbColor(11, 0); cout << name << endl;
		tbColor(14, 0); cout << "나이 : "; tbColor(11, 0); cout << age << endl;

		tbColor();
	}
};

int main(void) {
	// 객체 생성 
	// 객체 초기화는 균일 초기화 { } 권장
	Person* p1 = new Person{ 15, "마맘" };

	// 클래스 호출 
	p1->introduce();

	// 클래스 삭제 
	delete p1;

	cout << endl << " ========================================== " << endl << endl;

	// 복사 초기 
	Person c1 = Person(10, "야미몽");

	// 객체는 직접 초기화를 해야 함.
	Person c2(20, "에어로뮤직");

	// 함수 선언과 햇갈릴 수 있으므로 균일 초기화를 권장 
	Person c3{ 40, "로나로나땅땅" };

	return 0;
}

 

클래스를 이용한 예제

#include <iostream>
#include <windows.h>
#include <stdlib.h>

// 네임스페이스 
using namespace std;

// 글자 색상, 배경 색상 변경 
void tbColor(unsigned short textColor = 7, unsigned short backColor = 0) {
	int color = textColor + backColor * 16;

	SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), color);
}

// ======================================================================================= //

class Test {
private:
	int divisor = 2;

public:
	Test() {
		cout << "생성자 호출" << endl;
	}

	~Test() {
		cout << "소멸자 호출" << endl;
	}

	void divide(int num) {
		tbColor(14, 0); cout << num / this->divisor << endl; tbColor();
	}

	// divisor의 값을 다이렉트로 바꾸면 오데이터를 걸러낼 수가 없다.
	// 때문에 class의 중요한 데이터들은 private으로 막아놓고 검증 코드가
	// 작성된 안전한 함수를 이용해 값을 바꿔주도록 한다. ==> 캡슐
	void setDivisor(int num) {
		if (num == 0) {
			cout << "오류 발생 :: 0은 넣을 수 없습니다." << endl;
			return;
		}

		this->divisor = num;
	}
};

int main(void) {
	Test t1;

	t1.setDivisor(0);

	t1.divide(10);
	t1.divide(100);
	t1.divide(1000);
	t1.divide(10000);

	return 0;
}

 

반응형