[C++기초] 5. 객체지향 프로그래밍1

INDEX

OOP란

객체지향 프로그래밍

Java vs C++

Java C++
클래스 클래스
개체 개체
생성자 생성자
함수 오버로딩 함수 오버로딩
힙에 개체 생성하기 입에 개체 생성하기
  스택에 개체 생성하기
  복사 생성자
  소멸자
  연산자 오버로딩

클래스 접근 제어자

접근제어자

개체 생성, 스택 힙

개체 생성

Java의 경우

//스택 메모리에 만들지 못함

//힙 메모리에 만들기 (느림)
Vector* a = new Vector();

C++의 경우

//스택 메모리에 만들기 (빠름)
Vector a;

//힙 메모리에 만들기
Vector* a = new Vector();

스택

개체 배열 생성, 개체 소멸

개체 배열

Java의 경우

Vector[] list = new Vector[10];
//백터를 10개 담을 수 있는 공간
//10개의 "포인터"를 힙에 만듦

C++ 의 경우

Vector* list = new Vector[10];
//백터 10개를 만듦
//10개의 백터 개체를 힙에 만듦

Vector** list = new Vector*[10];
//10개의 포인터를 힙에 만듦

개체 소멸

Java의 경우

Vector a = new Vector();

//...

a = null; //메모리 할당을 즉시 해제하지 않음

C++의 경우

Vector* a = new Vector();
Vector** list = new Vector[10];

delete a; //메모리가 즉시 해제
a = null; //안 해도 됨

delete[] list; //[]를 반드시 넣을 것
list = NULL; //안 해도 됨

클래스 멤버 변수 초기화

기본 값

Java가 멤버 변수를 0으로 초기화하는 방법

Vector a = new Vector();

//C의사코드
void* ptr = malloc(sizeof(Vector));
memset(ptr, 0, sizeof(Vector));
a = (Vector*)ptr;

new/delete와 malloc()/free()의 차이점

클래스 생성자, 초기화 리스트

생성자

Java의 경우

public class Vector
{
	private int x;
	private int y;
	// 매개변수 없는 생성자
	// 안 만들어도 상관없음
	public Vecotr()
	{
		x = 0;
		y = 0;
	}
}

C++의 경우

class Vector
{
public:
	//매개변수 없는 생성자
	Vecotr() : mX(0), mY(0)
	{
	}
private:
	int mX;
	int mY;
}

초기화리스트

class X
{
	const int mNameSize;
	AnotherClass& mAnother;
	
	X(AnotherClass& another)
		: mNameSize(20)
		, mAnother(another)
	{
	}
};
class X
{
	const int mNameSize;
	AnotherClass& mAnother;
	
	X(AnotherClass& another)
	{
		//에러!
		mNameSize = 20;
		//에러!
		mAnother = another
	}
};
// Header 파일 ~
class Vector
{
public:
	Vector();
	Vector(int x, int y);
private:
	int mX;
	int mY;
}

// Cpp 파일 ~
Vector::Vector()
	: mX(0)
	, mY(0)
{
}
Vector::Vector(int x, int y)
	: mX(x)
	, mY(y)
{
}

클래스 기본 생성자, 컴파일러가 하는 일

기본 생성자

컴파일러가 하는 일

클래스 생성자 오버로딩, 소멸자

생성자 오버로딩

소멸자

클래스 안에서 동적 메모리 할당

MyString.h

class MyString
{
public:
	MyString();
	~MyString();
private:
	char* mChars;
	int mLength;
	int mCapaciy;
};

MyString.cpp

MyString::MyString()
	: mLength(0)
	, mCapaciy(15)
{
	mChars = new Char[mCapaciy + 1];
}

MyString::~MyString()
{
	delete[] mchars;
	// mCapacity = 0;
	// mChars = NULL;
}

클래스 const 멤버 함수

const 란?

구조체(Struct) vs 클래스(Class)

구조체 vs 클래스

구조체에 관한 코딩 표준