C++ 기본 개념

김경환·2021년 8월 11일
0

C/C++

목록 보기
4/5

클래스

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를 앞쪽에 붙여 사용한다.
호출된 객체의 데이터를 변경할 수 없는 멤버를 의미한다.
일반적으로 중요한 상수는 상수 멤버 변수로 정의해서 사용하는 관행이 있다.

0개의 댓글

관련 채용 정보