C++ (11) 썸네일형 리스트형 static ? Static Function (정적 함수) class A { public : A() {} ~A() {} private: int m_iData; static int m_stIData; public: static void Static_Print() { //m_iData = 10; // 에러 : 정적 함수 내부에서는 일반 멤버 변수를 사용할 수 없다. m_stIData = 10;// 컴파일 성공 : 정적 변수는 사용 가능하다. } void This_Print() { } }; int main() { A instA; // 정적 함수를 호출하는 방법 A::Static_Print(); instA.Static_Print(); A::This_Print(); // 에러 : 멤버 함수는 객체로 통해서만 접근이 가능하다 in.. C++ Type Cast 1. static_cast - 논리적으로 변환 가능한 타입을 변환한다. - 컴파일 타임에 형변환에 대한 타입 오류를 검사한다. 샘플 코드 int main() { // static_cast int iData= 0; float fData = 0.f; iData = static_cast(fData); // 논리적 형변환이 문제 없음 int* pIData = nullptr; float* pFData = nullptr; pIData = static_cast(pFData); // 에러 : 잘못된 형식 변환입니다. return 0; } 2. const_cast - 포인터(Pointer), 참조(Reference)값의 const(상수성)을 제거해준다. 샘플 코드 int main() { // const_cast cons.. 얕은 복사(Shallow Copy) 깊은 복사(Deep Copy) 복사 생성자가 호출될 시 사용자가 직접 오버로딩 하지 않았다면 기본 복사 생성자가 자동으로 호출된다. 이때, 일어나는 복사는 얕은 복사가 일어난다. 그럼 얕은 복사와 깊은 복사의 차이는 무엇인가? 얕은 복사(Shallow Copy) 객체가 가진 멤버들의 값을 복사될 객체의 멤버 값으로 1:1 복사가 된다. 만약 어떤 메모리를 참조하고 있는 타입이 멤버에 있는 경우는 값과 멤버가 복사되는 것이 아니라 참조 하고 있는 메모리의 값을 복사하게 된다. 깊은 복사(Deep Copy) 값만의 복사가 값과 참조하고 있는 메모리까지 전부 복사를 의미한다. 위 얕은 복사에서 int* m_pAdress를 두개의 객체가 공유하는 형식이 아닌 각 객체마다 참조하고 있는 메모리를 별도로 가지고 있는걸 의미한다. 하지만 이런 작.. 복사 생성자(Copy Constructor) 클래스명(const 클래스명& _이름) 타입이 복사 생성자를 호출하는 인자 타입이다. 복사 생성자는 클래스가 객체화 될 때 기본적으로 생성되는 생성자이다. 즉 복사 생성자를 사용자가 정의하지 않아도 기본적으로 만들어지는 생성자라는 의미다. 즉, 인자로 들어오는 객체의 멤버들을 자신의 멤버들에게 복사하는 일을 담당한다. class ClassA { public: ClassA() {} ClassA(const ClassA& _copyCls) { cout 레퍼런스(Reference)와 포인터(Pointer) 차이 1. 포인터는 자신이 가리키는 주소 값을 언제든 변경할 수 있고 레퍼런스는 초기화할 때 반드시 값을 할당해줘야 한다. int main() { int number_1 = 10; int number_2 = 20; // 주소 값 변경이 가능하다. int* pI = &number_1; pI = &number_2; int &refI; // 에러 : 참조(레퍼런스) 변수는 초기화가 필요하다. int &refI = number_1; refI = number_2; // number_1의 참조가 되는것이 아닌, number_2의 값이 들어간다. return 0; } 2. 포인터는 운영체제에 따라 4, 8바이트 메모리 크기, 레퍼런스는 자신이 참조하는 메모리의 크기를 가지게 된다. class TestClass { publ.. 다중 상속(Diamond of Death)의 문제점 다중상속은 하나의 클래스가 여러 클래스를 상속 받는 것을 의미한다. 단, 상속의 상속을 받는 형태가 아니다. 아래와 같은 코드를 다중 상속이라 한다. class AAA { } class BBB { } class CCC : public AAA, public BBB { } 자식 클래스(CCC Class)는 AAA, BBB 클래스를 상속받는다. 이런 형태를 두고 다중 상속이라 한다. 위와 같은 멤버가 아무것도 없는 클래스에 대하여는 "무슨 문제가 발생하지?" 라는 의문이 생길 수 있다. 다중 상속의 문제점 - 1 class AAA { public: int m_iData; }; class BBB { public: int m_iData; }; class CCC : public AAA, public BBB { };.. 상속을 사용하는 의미 상속만을 얘기한다면 '코드의 재사용' 한 문장으로 얘기할 수 있다. 게임으로 예를들면 캐릭터는 기본적으로 가지는 수치로는 아래와 같이 5가지의 수치가 존재한다고 가정해보자. -> 체력(HP), 마나(MP), 스테미너(SP), 공격력(ATK), 방어력(DEF) 상속을 사용하지 않은 경우 - 직업마다 같은 수치를 매번 생성하는 번거로움이 필요하다. 공통적으로 사용하는 변수, 함수가 많아질수록 해당 작업은 매우 비효율적인 코드 방법이된다. 상속을 사용한 경우 - 사용을 사용해서 구현한 경우 캐릭터 클래스(부모 클래스)가 하나 더 생성되었지만, 사용하지 않은 경우처럼 각 직업마다 매번 같은 멤버를 추가해 사용할 필요 없이 부모 클래스 멤버에 접근하여 자신 직업에 맞게 변경하여 사용할 수 있다. 이 처럼 코드의 .. 순수 가상 함수(Pure Virtual Function) - 선언만 있고 구현이 없는 가상 함수를 의미한다. 말 그대로 기초 클래스로서 의미만 가지고 있을 뿐 구현부는 자신을 상속 받는 자식 클래스에서 구현할 수 있도록 하는 용도의 클래스이다. - 순수 가상 함수를 하나라도 가지고 있는 클래스는 추상 클래스(Abstract Class)가 되며 객체화 할 수 없다. - 추상 클래스를 상속 받는 자식 클래스에서 순수 가상 함수를 구현하지 않으면 해당 클래스도 추상화된다. class AbstractClass { public: AbstractClass() {} ~AbstractClass() {} public: virtual void PureVirtualFunction() = 0; // 순수 가상 함수 }; class ChildClass : public Abstract.. 이전 1 2 다음