클래스 생성자 (constructor)
* 생성자는 객체가 생성될 때 implicitly(암묵적으로) 호출된다.
* 클래스와 같은 이름으로 정의되고, 값을 반환하지 않는다 (void형과는 다름)
* 기본 생성자(default constructor)는 매개변수를 가지지 않는다.
- 객체 클래스의 데이터 멤버의 생성자만 호출
#include <iostream>
using namespace std;
class GradeBook {
public:
GradeBook(string name)
{
setCourseName(name);
} // 클래스명과 이름이 같고 return 이 없다(void는 아님)
void setCourseName(string name)
{
courseName = name;
}
string getCourseName()
{
return courseName;
}
void displayMessage()
{
cout << "welcome to the grade book for\n" << getCourseName() << "!" << endl;
}
private:
string courseName;
};
int main()
{
GradeBook gradeBook1("cs101 introduction to C++ programming");
GradeBook gradeBook2("cs102 Data Structures in C++");
cout << "gradeBook1 created for course: " << gradeBook1.getCourseName() <<
"\ngradeBook2 created for course: " << gradeBook2.getCourseName() << endl;
return 0;
}
Separating .h and .cpp Files
헤더 파일(header files)
: 클래스 선언부가 위치, 소스 파일과 분리됨. 일반적으로 '.h' 확장자를 가진다
전처리기 지시자
- 헤더 파일을 포함하기 위해 사용된다.
- 사용자 생성 헤더파일 포함 시 #include "myclass.h" / C++ 표준 라이브러리 포함할 때는 #include <iostream>
컴파일 과정에서 헤더의 역할
- C++ 객체는 데이터 멤버만 포함한다.
- 컴파일러 --> 클래스 멤버 함수의 복사본 생성, 모든 클래스에서 이 멤버 함수를 사용할 수 있도록 함
- 4개의 int형 멤버 변수와 2개의 멤버 함수를 가진 클래스 객체 : 4 * 4byte = 16 byte의 크기를 가진다.
private 멤버에 대한 set함수의 용도
- set함수는 데이터를 검증할 수 있다.
- 유효성 검사를 한다. (유효성 검사란 매개변수에 넣은 값이 요구조건에 맞는지 검사하는 것을 의미한다.)
인터페이스(Interface)
- 멤버 함수 이름, 반환형과 매개변수만으로 정의됨(함수 원형)
- public 멤버함수로 정의된다.
이 인터페이스를 정의한 것을 구현(implement) 클래스라고 하는데, 별도의 cpp파일에서 클래스의 멤버함수를 구현한다. - Binary scope resolution operator(::)을 이용해 인터페이스와 멤버함수를 연결한다.
ex) void GradeBook::displayMessage()
- 클래스의 헤더 파일 : 멤버 함수의 원형은 클래스의 public 인터페이스를 기술
#include <iostream>
using namespace std;
#include "GradeBook.h"
//Include the header file to access the class name GradeBook
//Use Binary scope resolution operator ties a function to its class
GradeBook::GradeBook(string name)
{
setCourseName(name);
}
void GradeBook::setCourseName(string name)
{
courseName = name;
}
string GradeBook::getCourseName()
{
return courseName;
}
void GradeBook::displayMessage()
{
cout << "welcome to the grade book for\n" << getCourseName() << "!" << endl;
}
소스 코드 파일은 컴파일 되어 목적 코드를 생성한다.
- 헤더파일과 목적 코드를 클라이언트에 제공
private 멤버에 대한 set함수의 용도
- 데이터를 검증할 수 있다. (유효성 검사 validity checking)
string 멤버 함수(string도 일종의 클래스)
- length() : string 내부 문자 개수 반환
- subsur() : string에서 일부를 반환
#include <iostream>
#include <string>
using namespace std;
#pragma once
class GradeBook{
public:
GradeBook(string);
void setCourseName(string);
string getCourseName();
void displayMessage();
private:
string courseName;
};
//Ex 3-10
GradeBook::GradeBook(string name)
{
setCourseName(name);
} // 클래스명과 이름이 같고 return 이 없다(void는 아님)
void GradeBook::setCourseName(string name)
{
if (name.length() <= 25)
courseName = name;
if (name.length() > 25)
{
courseName = name.substr(0, 25);
cout << "Name \"" << "\"exceed maximum length(25).\n"
<< "Limiting courseName to first 25 characters. \n" << endl;
}
}
string GradeBook::getCourseName()
{
return courseName;
}
void GradeBook::displayMessage()
{
cout << "welcome to the grade book for\n" << getCourseName() << "!" << endl;
}
+ 데이터 멤버 변수는 private 권장, 멤버 함수는 public 권장
+ 데이터 무결성의 이점
헤더 파일 / 소스 파일 / 드라이버 파일 분리
: 클래스 선언이 담긴 헤더파일과, 멤버 함수를 구현한 소스파일, 프로그램이 동작하는 main 함수를 구현한 드라이브 파일로 분리되어 코드를 만들 수 있다.
'Langauge > C++' 카테고리의 다른 글
[열혈 C++] 연산자 오버로딩2 정리 및 예제 풀이 (0) | 2021.05.21 |
---|---|
[열혈 C++] 연산자 오버로딩1 내용 요약 및 예제 풀이 (0) | 2021.05.04 |
Introduction to classes and objects #1 (0) | 2021.03.10 |
[열혈 C++ 프로그래밍] Chapter 07(상속의 이해) (0) | 2021.03.01 |
[열혈 C++ 프로그래밍] Chapter06 (friend와 static그리고 const) 정리 및 문제 해결 (0) | 2021.02.18 |