전체 글

배우고 성찰한 것을 기록하는 블로그입니다.
C, C++

C++) 디폴트 생성자(Constructor)와 소멸자

디폴트 생성자 생성자는 객체가 생성되는 시점에 자동으로 호출되는 멤버 함수. (객체의 생성은 인스턴스 선언 및 new 연산에 따른 동적 생성 두 경우에 의해 생긴다.) 전역 인스턴스가 존재할 경우, main() 함수보다 생성자가 먼저 호출되며, 생성자는 다중 정의가 가능하다. 소멸자 소멸자는 객체가 소멸하는 시점에 자동으로 호출되며 다중 정의가 불가능하다. main()함수가 끝난 뒤에도 호출될 수 있다. 코드 #include class Test { public: Test() { std::cout

C, C++

C++) 클래스 기본 문법

클래스 기본 문법 클래스는 관계에 대해 일절 고려하지 않는다면 함수를 포함하는 구조체라고 볼 수 있다. 클래스에는 생성자, 소멸자 등 문법상 자동으로 호출되는 함수가 존재하며, 이 때문에 C++에서는 Called by ~ 가 중요해진다. (생성자, 소멸자 등의 자동호출 시기를 아는 것이 도움이 된다.) 또한 클래스의 구성요소도 구조체처럼 멤버라고 지칭한다. #include class UserData { public: // 접근제어 지시자 int age; char name[32]; void print() { printf("%d, %s", age, name); } }; int main() { UserData user = { 30, "2DC" }; user.print(); return 0; } 참고로 클래스 ..

C, C++

C++) C++ 스타일 C코드와 this 포인터의 정의

C++ 스타일 C 코드 // C++ 스타일 C 코드 예 #include typedef struct USERDATA { int age; char name[32]; void(*print)(struct USERDATA* pUser); } void printData(USERDATA* pUser) { printf("%d, %s\n", pUser->age, pUser->name); } int main() { USERDATA user = { 30, "2DC", printData }; user.print(&user); return 0; } 위의 코드는 C언어를 C++ 스타일로 짜본 것이다. C언어는 클래스/객체 대신 구조체를 사용하고, 구조체는 기본적으로 메서드를 멤버로 둘 수 없다. 따라서 함수 포인터 멤버를 구조체..

C, C++

C++) OOP에서 객체란 무엇인가

객체란 무엇인가 (깊게 들어갈 필요가 있을까? ...) 객체는 OOP 환경에서 소프트웨어(소스코드)를 구성하는 단위 요소이고 변수 및 그와 관련된 메서드가 모여 이뤄진 하나의 집합체이다. (구조체와는 약간 다르다. 구조체는 변수만 포함하고, 객체는 변수와 함수(메서드)까지 포함한다.) C++에서는 객체를 클래스(Class)로 기술하며, 클래스는 C언어의 구조체와 유사한, 변수와 함수를 멤버로 갖는 하나의 틀이다. #include class USERDATA { public: int age; char name[32]; void printUser() { printf("%d %s", age, name); } }; int main() { USERDATA DC = { 30, "2DC" }; DC.printUser(..

C, C++

C++) Name Mangling

Name Mangling 맹글링은 영단어로 '난도질하다'라는 의미이다. 즉, 네임 맹글링은 말 그대로 어떤 이름을 난도질해버리는 것이다. C++의 식별자 이름은 컴파일러에 의해 C언어처럼 유일한 이름으로 변경된다. namespace의 구분에 의해 중복되는 식별자가 많아질 수 있으므로 이런 기능이 도입되었고, 덕분에 함수 다중 정의(Overloading)가 동작할 수 있게 되었다. 네임 맹글링은 링크 타임의 오류를 디버깅할 때 반드시 알아야 하는 부분이다. #include using namespace std; extern "C" void noManglingFunc() // 네임 맹글링을 시행하지 않음 { cout

C, C++

C++) Namespace

Namespace C++가 지원하는 각종 요소들(변수, 함수, 클래스 및 각종 선언 등)을 한 범주로 묶어주기 위한 문법으로 중첩이 가능하다. 선언할때는 식별자 이름 앞에 ::을 붙여서 표기한다. 사실상 C++의 모든 변수나 함수는 C++ 문법 상 namespace에 속한다고 할 수 있는데, 예시로 모든 전역변수나 함수는 global namespace에 해당한다. #include using namespace std; // 디폴트 네임스페이스가 std가 된다. int nData = 999; // global namespace에 속하는 전역변수 namespace Test // Test namespace 선언 { int nData = 100; // Test::nData void testFunc() // Tes..

C, C++

C++) 함수 템플릿

함수 템플릿 함수 다중 정의(Overloading)를 대체할 수 있는 문법으로, 함수를 만드는 틀 역할을 한다. 즉 코드를 만드는 코드인 셈이다. #include template // 함수 템플릿 선언 T add(T a, T b) { return a + b; } int main() { std::cout

C, C++

C++) 함수 다중 정의(Overloading)

함수 다중 정의(Overloading) 다중 정의는 영문 Overloading에 대한 한글 번역 표기이다. 함수의 이름은 같지만 매개변수 구성이 다른 점이 특징이다. (반환 형식, 호출 규칙은 오버로딩 대상이 아니다.) 디폴트 매개변수와 조합시 모호한 호출이라는 오류가 발생한다. #include int add(int a, int b) { std::cout

C, C++

C++) 범위 기반 for문

범위 기반 for문 C++에서의 배열은 C의 배열보다 유지보수하기 편하다. 범위 기반 for 덕분이다. C++에서 범위 기반 for문은 배열 요소의 갯수만큼 반복횟수가 자동으로 결정되며, 배열 요소의 갯수가 달라져도 반복문을 수정할 필요가 없다. (C에서는 이 작업으로 상당히 고생이 많다고 한다.) 단 컴파일러가 반복횟수를 판단할 수 있어야 사용이 가능하다. int main() { // 범위 기반 for문 int list[] = { 10, 20, 30, 40, 50, 60 }; for (int i = 0; i < 5; i++) std::cout

C, C++

C++) 임시 객체와 r-value 참조

임시 객체 int a(10), b(5), c = a + b; 각각 a, b, c 인스턴스가 있다. 그 중 c 인스턴스는 a 와 b를 더한 값이다. a와 b를 더하는 과정에서 생성되는 인스턴스(값)는 c에 대입된 후 증발될 것이다. 즉, 임시 객체는 이름을 갖지 않으며 본인의 역할을 다 한 뒤 소멸된다. r-value 참조 a + b는 c라는 l-value에 할당되는 r-value라고 할 수 있다. 즉 임시객체는 r-value이다. r-value는 자신의 역할을 다 하면 소멸되지만, 굳이 r-value에 참조를 걸어 변수로 만들어 줄 수도 있다. 선언하는 방법은 자료형&& 식별자 = 임시객체 이다. #include int testFunc(int param) { int result = param * 2; r..

2DC
2DC