클래스를 정의하고 객체를 생성해야만 memory 공간이 생긴다.
1. string 클래스 -> #include <string>
: 문자열에 대한 처리 제공
2. vector 클래스 -> #include <vector>
: 실행 중에 크기를 변경할 수 있는 배열 기능 제공
원소로 사용할 값의 데이터 형을 <>
로 지정
새로운 원소를 추가하려면 push_back()
멤버함수 사용
vector<int> v1; //int값을 저장하는 배열(비어있음)
vector<int>v2(3); //기본값 0으로 초기화된 3개의 원소를 가지는 배열
vector<string>v3; //string 객체를 저장하는 배열
vector<Student*>v4; //Student 구조체 포인터를 저장하는 배열
//push_back() : 배열의 마지막에 해당 원소 추가
v1.push_back(3);
v3.push_back("yu-podong");
v4.push_back(new Student);
class
키원드를 사용하여 클래스를 정의하고, class 내의 멤버를 정의할 때 접근 지정자를 사용할 수 있다.
접근 지정자 : private, protected, public
-> 접근 지정자를 사용하여 정보 은닉과 캡슐화를 구현할 수 있다.
그리고 클래스를 작성할 때는 클래스 선언부와 클래스 구현부로 구성한다. 그래서 class 작성 시, 선언부와 구현부를 file을 2개로 나눠서 작성한다.
클래스 선언부 (class declaration)
class
키워드를 이용하여 클래스 선언한다.클래스 구현부 (class implementation)
이렇게 클래스 선언과 클래스 구현으로 분리하는 이유는 클래스를 '다른 파일에서도 활용'하기 위함이다.
//클래스 선언부 - test.cpp
class Studnet {
public:
//멤버 변수
int studentNum;
string studentName;
//멤버 함수
void printStdInfo();
);
//클래스 구현부 - implementation.cpp
//어떤 클래스의 멤버함수인지 `클래스 이름::`을 작성해야 함
void Student::printStdInfo() {
cout << "학생의 학번은 "<< studentNum << "입니다.";
cout << "학생의 이름은 "<< studnetName << "입니다.";
}
// 1. 객체 생성
Student yuPodong;
// 2. 객체의 멤버 접근 -> 구조체와 비슷
yuPodong.studentNum = 2021001001;
yuPodong.studentName = "yu-podong";
yuPodong.printStdInfo();
.
연산자 사용->
연산자 사용멤버 함수도 함수이기 때문에, 오버로딩과 디폴트 인자 지정이 가능하다.
항상 해당 클래스의 객체만이 멤버 함수를 부를 수 있고, 같은 클래스에 정의된 멤버를 사용할 때는 객체 이름을 지정하지 않아도 된다. (클래스 구현부에서의 얘기)
// 멤버 호출 시, 객체 이름을 지정하지 않아도 되는 이유는, 멤버 함수를 호출한 객체의 것으로 자동적으로 인식이 되기 때문이다.
void Student::printStdInfo() {
cout << "학생의 학번은 "<< studentNum << "입니다.";
cout << "학생의 이름은 "<< studnetName << "입니다.";
}
멤버 함수 안에서는 접근 지정자에 상관없이 클래스의 모든 멤버를 사용할 수 있다.