C++은 객체 지향 언어로 클래스 사용이 가능하다.
기본적으로 멤버를 private로 간주하며 public: 으로 따로 설정해 줄 수 있다.
클래스를 활용해 만든 변수를 의미한다.
실제 프로그램 상에서 객체가 살아서 동작하도록 해준다.
하나의 클래스에서 여러 개의 서로 다른 인스턴스를 만들 수 있다.
객체를 생성함과 동시에 멤버 변수를 초기화할 수 있다.
생성자는 특별한 메소드로, 클래스의 이름과 동일한 이름의 메소드로 구현된다.
생성자는 반환 값이 없다. 여러 번 정의되어 다양한 방법으로 객체를 초기화 할 수 있다.
다른 인스턴스의 참조를 인수로 받아서, 그 참조를 이용해 자신의 인스턴스를 초기화 할 수 있도록 해준다.
대표적으로 깊은 복사를 이용해 만들어진 인스턴스는 기존의 인스턴스와 다른 메모리 공간에 할당되어 독립적이다.
Other
를 이용해 사용한다.
Ex) Character(String name, int hp) : name(name), hp(hp);
Character(const Character& other){
Name = other.name;
Hp = other.hp;
}
객체의 수명이 끝났을 때 객체를 제거하기 위한 목적으로 사용된다. 객체의 수명이 끝났을 때 자동으로 컴파일러가 소멸자 함수를 호출한다.
생성자와 같이 클래스의 이름과 동일하며~
를 이용해 정의할 수 있다.
Ex) ~Character(){
Cout << “객체가 소멸됩니다.”
}
객체 지향 프로그래밍의 주요한 특성 중 하나로 현실 세계의 상속과 비슷한 개념이다.
부모 클래스의 속성을 자식 클래스에서 그대로 물려 받아 사용하는 것을 의미한다.
자식 클래스는 파생 클래스라고도 불리며:
를 이용해 부모 클래스와 연결한다.
Ex)
#include <iostream>
#include <string>
using namespace std;
class Person { //부모 클래스
private:
string name;
public:
Person(string name) : name(name) {} //멤버 변수 초기화
string getName() {
return name;
}
void showName() {
cout << "이름: " << getName() << '\n';
}
};
class Student : Person { //상속 받는 모습
private:
int studentID;
public:
Student(int studentID, string name) : Person(name) { //name을 물려받음
this->studentID = studentID;
}
void show() {
cout << "학생 번호: " << studentID << '\n';
cout << "학생 이름: " << getName() << '\n';
}
};
int main(void) {
Student student(1, "kim");
student.show();
system("pause");
}
자식 클래스의 인스턴스를 만들 때 가장 먼저 부모 클래스의 생성자가 호출된다. 이후 자식 클래스의 생성자가 호출된다.
반면 자식 클래스의 수명이 다했을 경우 자식 클래스의 소멸자가 먼저 호출된 이후에 부모 클래스의 소멸자가 호출된다.
부모 클래스에서 정의된 함수를 무시하고, 자식 클래스에서 동일한 이름의 함수를 재 정의하는 문법.
오버라이딩을 적용한 함수의 원형은 기존의 함수와 동일한 매개변수를 전달 받는다.
다중 상속
여러 클래스로부터 멤버를 상속받는 것을 의미한다.
Ex) Student(int studentID, string name) : Person(name) , public Temp{
//person과 temp를 다중 상속
동일한 이름의 멤버 함수를 다양한 방식으로 사용하기 위해 사용한다.
Ex) person(){name=”kim”;}
Person(string name) : name(name) {} //person이라는 함수 이름이 같으나 둘 다 사용 가능하다.
객체 지향 프로그래밍에서 중요한 키워드로 캡슐화의 기본 원리는 관련된 함수는 멤버들은 되도록 하나의 클래스에서 관리하는 것이다.
또한 같이 실행되어야 하는 기능들도 하나의 클래스에 넣어서 각 객체가 응집된 기능을 가질 수 있도록 해야한다.
멤버 변수에 접근하기 위해서 public 멤버 함수를 이용해야하나, 특정한 객체의 멤버 함수가 아닌 경우에도 private 멤버에 접근해야 할 때가 있다.
이때프렌드(friend)
키워드를 이용하면 특정한 객체의 모든 멤버에 접근할 수 있다.
Ex)
#include <iostream>
#include <string>
using namespace std;
class Student {
private:
int studentID;
string name;
public:
Student(int studentID, string name):studentID(studentID),name(name){ }
friend Student operator +(const Student& student, const Student& other) { // 연산자 오버로딩 자신과, 다른 문자열을 이어주는 역할로 바꿈
return Student(student.studentID, student.name + " & " + other.name); //friend로 private에 있는 name에 접근
}
void showName() { cout << "이름: " << name << '\n'; }
};
int main(void) {
Student student(1, "kim");
Student result = student + student;
result.showName();
system("pause");
}
두 클래스가 서로 밀접한 연관성이 있으며 상대방의 private 멤버에 접근해야 할 때 사용한다.
Static
을 앞쪽에 붙여 사용한다.
클래스에 포함되어 있는 멤버이지만 모든 객체가 공유하는 멤버.
정적으로 선언된 멤버는 메모리 상에 오직 하나만 할당되어 관리된다.
public으로 선언하면 외부의 어떠한 클래스에서도 접근이 가능하며 일반적으로 싱글톤 패턴 등의 다양한 기능을 위해 사용된다.
Const
를 앞쪽에 붙여 사용한다.
호출된 객체의 데이터를 변경할 수 없는 멤버를 의미한다.
일반적으로 중요한 상수는 상수 멤버 변수로 정의해서 사용하는 관행이 있다.