Class & Object
- 클래스와 구조체의 차이점은 struct 키워드 대신 class 키워드를 사용한다는 것이다. 이러한 클래스는 앞선 구조체와 같은 방법으로는 호출할 수 없다. 클래스는 정의 과정에서 각각의 변수 및 함수의 접근 허용범위를 별도로 선언해야 한다.
- C++의 접근제어 지시자는 세가지가 존재한다.
- public: 어디서든 접근허용
- protected: 상속관계에 놓여있을 때, 유도 클래스에서의 접근허용
- private: 클래스 내에서만 접근허용
#include <iostream>
#include <cstring>
using namespace std;
namespace STUDENT_CONST
{
enum
{
NAME_LEN = 9
};
}
class Student
{
private:
char studentName[STUDENT_CONST::NAME_LEN];
int studentNum;
int studentLevel;
public:
void InitMembers(char *Name, int ID, int Level);
void ShowStudentInfo();
void Pronunciation();
};
void Student::InitMembers(char *Name, int ID, int Level)
{
strcpy(studentName, Name);
studentNum = ID;
studentLevel = Level;
}
void Student::ShowStudentInfo()
{
cout << "Student Name: " << studentName << endl;
cout << "Student Number: " << studentNum << endl;
cout << "Student Level: " << studentLevel << endl;
}
void Student::Pronunciation()
{
if (studentLevel > 4)
return;
else
studentLevel++;
}
int main(void)
{
Student zelda;
zelda.InitMembers("Zelda", 19860221, 0);
zelda.ShowStudentInfo();
zelda.ShowStudentInfo();
zelda.ShowStudentInfo();
return 0;
}
- 클래스의 용어는 다음과 같다.
- 객체: 클래스로 선언된 변수
- 멤버변수: 클래스 내에 선언된, 클래스를 구성하는 변수
- 멤버함수: 클래스 내에 정의된, 클래스를 구성하는 함수
- C++에서의 파일분할
- 헤더파일: 표준 라이브러리 함수가 선언되어 있는 파일
// File: tmp.h
#ifndef _TMP_H // 헤더파일의 중복포함 방지를 위해서 사용하는 매크로
#define _TMP_H // 헤더파일의 중복포함 방지를 위해서 사용하는 매크로
// 함수의 형을 선언하여 호출 시, 인수의 형태를 알린다.
// 형을 알리는 C/C++코드에는
// #define / enum / struct 헤더 부 / 클래스 선언 부 / 함수 형
// 등이 대표적이다.
int add(int a, int b);
#endif // 헤더파일의 중복포함 방지를 위해서 사용하는 매크로
- extern: 외부변수, C언어에서 외부에 존재하는 변수를 사용하게 해주는 키워드
// add.c
int x = 100;
int y = 1000;
// main.c
extern int a;
extern int b;
int main(void)
{
printf(" a: %d, b: %d\n",a,b);
return 0;
}
- 링커: 하나 이상의 목적 파일을 가져와, 이를 단일 실행 프로그램으로 병합해주는 프로그램이다.
- 보통 어떠한 클래스에 대해, 클래스의 헤더파일과 클래스의 코드파일이 나뉘어 지면, 헤더파일의 경우 클래스의 선언을 담고, 코드파일의 경우 클래스의 정의(멤버함수의 정의)를 담는다.
// Stu.h
#ifndef __STU_H__
#define __STU_H__
namespace STUDENT_CONST
{
enum
{
NAME_LEN = 9
};
}
class Student
{
private:
char studentName[STUDENT_CONST::NAME_LEN];
int studentNum;
int studentLevel;
public:
void InitMembers(char *Name, int ID, int Level);
void ShowStudentInfo();
void Pronunciation();
};
#endif
// stu.cpp
#include <iostream>
#include <cstring>
#include "Stu.h"
using namespace std;
void Student::InitMembers(char *Name, int ID, int Level)
{
strcpy(studentName, Name);
studentNum = ID;
studentLevel = Level;
}
void Student::ShowStudentInfo()
{
cout << "Student Name: " << studentName << endl;
cout << "Student Number: " << studentNum << endl;
cout << "Student Level: " << studentLevel << endl;
}
void Student::Pronunciation()
{
if (studentLevel > 4)
return;
else
studentLevel++;
}
#include "Stu.h"
int main(void)
{
Student zelda;
zelda.InitMembers("Zelda", 19860221, 0);
zelda.ShowStudentInfo();
zelda.ShowStudentInfo();
zelda.ShowStudentInfo();
return 0;
}
- 이때, 만일 인라인 함수를 사용하게 된다면, 인라인 함수는 헤더파일에 함께 넣어야 한다.
- 이렇게 파일을 분리하는 과정은 필수적이므로, 숙지해 둘 필요가 있다.