C++ 8

[C++] CreateDialog() 함수

CreateDialog() 함수는 대화 상장 템플리 리소스에서 모델리스 대화 상자(modeless dialog box)를 만드는 데 사용되는 Windows API의 일부다. 모델리스 대화 상자(modeless dialog box)는 사용자가 애플리케이션의 다른 창과 상호 작용하는 것을 차단하지 않는다. 이는 사용자가 애플리케이션의 다른 부분에 액세스하기 전에 대화 상자와 상호 작용하고 대화 상자를 닫아야 하는 모달 대화 상자(modal dialog box)와는 대조적이다. CreateDialog() 함수는 리소스 스크립트(.rc 파일) 또는 메모리에 정의된 대화 상자를 만드는 데 사용할 수 있다. 대화 상자는 레이아웃, 제어 요소(예: 버튼, 텍스트 상자 등) 및 기타 속성을 지정하는 템플릿을 기반으로 ..

[Tech, C++] Symbol Table (심볼 테이블)

Symbol Table은 컴파일러와 링커에서 사용하는 데이터 구조로, 프로그램에서 사용되는 식별자(변수 및 함수 이름 등) 목록과 유형, 범위(가시성), 메모리 위치 등 각 식별자에 대한 정보를 담고 있다. Symbol Table은 컴파일러와 링커가 프로그램 전체에서 이러한 식별자에 대한 참조를 해결하는 데 도움이 된다. 디버깅의 맥락에서 디버그 심볼 내의 Symbol Table은 디버거가 메모리 주소 및 기타 로우-레벨 정보를 사람이 읽을 수 있는 식별자에 다시 매핑하는 데 도움이 된다. 이 매핑을 통해 디버거는 변수 값을 표시하고, 코드 한 줄씩 단계별로 살펴보고, 기타 고급 디버깅 기능을 제공할 수 있다. 컴파일할 때 Symbol Table은 컴파일러가 각 함수와 변수가 어디에 정의 되어 있고 어떻..

[Tech, C++] Debugging Symbols (디버깅 심볼)

Debugging Symbols은 컴파일 과정에서 프로그램의 바이너리에 추가되는 정보로, 바이너리 명령어를 원래 소스 코드에 다시 매핑하는 역할을 한다. 이러한 심볼에는 변수 이름, 함수 이름, 줄 번호와 같은 세부 정보가 포함된다. 디버거 및 기타 도구는 이를 통해 개발자에게 사람이 읽기 쉬운 형태의 프로그램을 표시해 프로그램의 동작을 분석하고 문제를 쉽게 식별할 수 있다. 아래와 같은 C++ 프로그램이 있다고 가정하자. // main.cpp #include void printMessage() { std::cout

[C++] Pointer (포인터)

포인터는 C와 C++를 비롯해 많은 프로그래밍 언어에서의 기본 개념으로, 메모리 주소에 직접 접근을 제공해 동적 메모리 관리르 가능하게 하며 기타 기능을 제공한다. 그러나 이러한 기능에는 잠재적인 함정이 있다. 포인터 사용의 장점과 단점을 알아보자. 1. 장점 동적 메모리 할당 : (malloc(), calloc(), new 등) 동적 메모리 할당이 가능하며, 이는 애플리케이션의 필요에 따라 런타임 중에 메모리를 할당할 수 있음을 의미한다. 이건은 linked list, tree, graph와 같은 많은 데이터 구조에 필수적이다. 효율성 - 추가로 다룰 예정 : 프로그램의 실행이 더 효율적으로 될 수 있다. 메모리에 직접 접근하면 (데이터를 복사하는 대신) 특정 작업을 더 빠르게 수행할 수 있다. 유연성..

[C++] Overriding (오버라이딩)

C++은 Overloading과 함께 Overriding도 제공한다. overriding은 파생된 클래스에서 기존 클래스의 멤버 함수를 새로운 정의로 재정의하는 것을 말한다. overriding은 주로 inheritance(상속)과 polymorphism(다형성)을 구현할 때 사용된다. 기본 클래스의 함수를 override하려면, 해당 함수는 반드시 'virtual'로 선언돼야 하고, private 멤버 함수는 직접적으로 접근이 불가하다(간접적으로는 reference(참조)를 통해 override 가능). class Animal { public: virtual void sound() { std::cout

[C++] Overloading (오버로딩)

Java와 마찬가지로 C++역시 overloading을 제공한다. overloading은 같은 이름의 함수나 연산자를 여러 번 정의하지만, 매개변수의 유형이나 개수가 달라야 한다. 이를 통해 동일한 함수 이름을 사용해 다양한 데이터 유형에 대한 다양한 작업을 수행할 수 있다. 아래 예시를 살펴보자. 같은 'add'라는 이름을 갖지만 위에는 int에 대한 연산을, 아래는 double에 대한 연산을 수행한다. int add(int a, int b) { return a + b; } double add(double a, double b) { return a + b; }

[C++] Pointer와 Reference (포인터와 참조)

Pointer (포인터)는 다른 변수의 메모리 주소를 보유하는 변수로 * 기호를 사용해 선언한다. // 선언 int *p; // int에 대한 포인터 p // 초기화 및 역참조 int x = 10; *p = &x; // p가 x의 주소를 보유 int value = *p; // value 변수는 *p를 역참조해 이제 10 이라는 값을 보유 // 재할당 int y = 20; p = &y; // p는 이제 y를 가리킴 // Null 포인터 int *q = nullptr; Reference (참조)는 이미 존재하는 변수에 대한 별칭(alias) 또는 다른 이름이다. 포인터처럼 별도의 메모리 주소는 없지만, 참조하는 변수의 주소를 공유한다. &를 사용해 선언하지만 포인터와는 다른 의미를 갖는다. // 선언 int..

[C++] lambda expression (람다 함수)

lambda expression은 익명의 함수 (anonymous functions) 를 정의하는 방법으로, 익명의 함수가 바로 사용되는 곳에 정의된다. 주변 범위 안에서 변수를 가져오기도 하고, 다른 함수의 인수로 사용되기도 한다. 아래 예시를 통해 확인해보자. int x = 10; auto addX = [x](int a) -> int { return a + x; }; int result = addX(5); // result will be 15 1.[x] : 캡처 괄호로, lambda에 사용할 외부 변수를 결정한다. 괄호 []가 비어있으면 외부 변수를 캡처하지 않는 것을 의미한다. 2. (int a) : 일반 함수와 마찬가지로 lambda 함수의 인수를 의미한다. 3. -> int : lambdad의 ..