콜백(callback)은 기본적으로 다른 코드에 인자(argument)로 전달되는 실행 가능한 코드를 의미합니다. 이 코드는 특정 시점에 호출되거나 실행될 것으로 기대되는 코드입니다. 다른 방식으로 표현하면 다음과 같습니다.함수의 참조(reference)를 다른 함수의 인자로 전달하여 호출하는 경우, 그 함수를 콜백 함수(callback function)라고 부릅니다.C에서 콜백 구현 방법C 언어에서는 콜백 함수를 호출하기 위해 함수 포인터(function pointer)를 사용해야 합니다. C에는 자바스크립트나 파이썬처럼 함수를
C 또는 C++ 코드에서 다음과 같은 문장을 본 적이 있을 것입니다.c = a+++b;이 한 줄의 코드는 과연 어떤 의미를 가질까요? 변수 a와 b에 각각 2와 5가 저장되어 있다고 가정해 봅시다. 이 표현식은 두 가지 방식으로 해석될 수 있습니다.c = (a++) + bc = a + (++b)증감 연산자에는 후위 증가 연산자(post-increment)와 전위 증가 연산자(pre-increment)가 있으며, 어느 쪽으로 해석되느냐에 따라 결과가 달라집니다.우선순위와 결합 법칙여기서 핵심이 되는 개념은 바로 연산자 우선순위(pre
C++에서 구조체(struct)와 클래스(class)는 기본적으로 거의 동일한 기능을 제공합니다. 두 키워드 모두 멤버 변수와 멤버 함수를 가질 수 있고, 생성자·소멸자도 정의할 수 있습니다. 하지만 몇 가지 중요한 차이점이 존재하는데, 이를 이해하면 상황에 맞게 적절한 키워드를 선택할 수 있습니다.1. 기본 접근 지정자(Default Access Specifier)의 차이가장 큰 차이는 기본 접근 지정자입니다.클래스의 멤버는 기본적으로 private입니다.구조체의 멤버는 기본적으로 public입니다.아래 두 코드를 비교해 보면 그
C 프로그래밍 언어는 1970년대 초 데니스 리치(Dennis Ritchie)가 개발했습니다. 이 언어는 UNIX 운영체제를 재설계하기 위해 만들어졌습니다.그 이전에 UNIX 시스템에서 사용되던 B 언어는 여러 가지 단점을 안고 있었습니다. 구조체(structure)를 지원하지 않았고, 데이터 타입 개념도 존재하지 않았습니다. 이러한 한계를 극복하기 위해 C 언어가 등장하게 되었습니다. C는 높은 수준의 기능성과 운영체제 프로그래밍에 필요한 세밀한 기능들을 모두 갖추고 있으며, 실제로 UNIX 커널 역시 C를 사용해 개발되었습니다.
이스케이프 시퀀스란 무엇인가?대부분의 프로그래밍 언어는 이스케이프 시퀀스(Escape Sequence)라는 개념을 지원합니다. 이스케이프 시퀀스란 문자 앞에 백슬래시(\)를 붙인 형태의 문자 조합으로, 컴파일러에게 일반 문자와는 다른 특별한 의미를 전달하는 역할을 합니다.예를 들어 다음 코드의 \n은 유효한 문자로, 줄 바꿈(new line) 문자를 의미합니다.char ch = \n;여기서 문자 n 앞에 백슬래시(\)가 붙어 있기 때문에 새 줄로 이동하라는 특수한 기능을 갖게 됩니다. 다만 백슬래시(\)가 모든 문자와 조합될 때 특
C와 C++에는 정수형 데이터를 다루기 위한 네 가지 기본 데이터 타입이 있습니다. 바로 short, int, long, long long입니다. 각 데이터 타입은 서로 다른 크기의 메모리 공간을 차지하며, 그 크기는 CPU 아키텍처와 운영체제에 따라 달라질 수 있습니다.예를 들어 int 타입은 어떤 환경에서는 4바이트를 차지하지만, 다른 환경에서는 2바이트를 차지하기도 합니다. 이는 컴파일러에 따라서도 달라지는데, 특히 크로스 컴파일러(cross compiler)를 사용하는 경우 그 차이가 두드러집니다.크로스 컴파일러란?크로스 컴
C 언어에서 const 한정자(qualifier)는 변수를 상수로 선언할 때 사용합니다. 즉, 변수가 한 번 초기화되면 그 이후에는 값을 변경할 수 없습니다. const를 활용하면 프로그램의 안정성을 크게 높일 수 있습니다. 예를 들어, 원주율(PI)처럼 절대 변하지 않아야 하는 값이 있다고 가정해 봅시다. 프로그램의 어떤 부분에서도 이 값이 수정되는 것은 바람직하지 않습니다. 이럴 때 해당 변수를 const로 선언하면 의도치 않은 변경으로부터 안전하게 보호할 수 있습니다. 컴파일러의 동작 방식 const 한정자로 선언된 객체는
스캔셋(Scanset)이란?C 언어의 스캔셋(scanset)은 scanf 계열 함수에서 지원하는 특수한 형식 지정자입니다. %[] 형태로 표현되며, 대괄호 안에는 하나의 문자 또는 여러 개의 문자 집합을 지정할 수 있습니다. 단, 대소문자는 엄격하게 구분됩니다.스캔셋이 적용되면 scanf() 함수는 대괄호 안에 명시된 문자들만 읽어들이고, 나머지 문자는 모두 무시합니다.기본 예제#include<stdio.h>int main() { char str[50]; &nb
C 또는 C++에서 쉼표(,)는 서로 다른 목적으로 사용됩니다. 겉보기에는 같은 기호이지만, 문맥에 따라 연산자로 동작하기도 하고 구분자로 동작하기도 합니다. 이 글에서는 두 가지 용법의 차이점과 실제 동작 방식을 예제와 함께 살펴보겠습니다.1. 연산자로서의 쉼표 (Comma Operator)쉼표 연산자는 이항(binary) 연산자입니다. 먼저 왼쪽 피연산자를 평가한 뒤 그 결과를 버리고, 이어서 오른쪽 피연산자를 평가하여 그 값을 최종 결과로 반환합니다. 특히 쉼표 연산자는 C와 C++ 전체 연산자 중 가장 낮은 우선순위를 가진다
C 언어에서 나머지 연산자(%, 모듈로)에 음수가 포함되면 어떤 결과가 나오는지 알아보겠습니다. 아래 예제 프로그램과 실행 결과를 통해 그 동작 방식을 살펴봅시다.예제 1: 연산자 우선순위와 함께 사용하기#include<stdio.h> int main() { int a = 7, b = -10, c = 2; printf(Result: %d, a % b / c); }실행 결과Result: 3여기서 %와 /는 우선순위가 같기 때문에 왼쪽부터 순서대로 평가됩니다. 따라서 먼저 a % b(즉, 7 % -10)가 계산
이번 글에서는 PRINT(x)라는 매크로를 정의하는 방법을 알아보겠습니다. 이 매크로는 인자로 전달된 x의 값을 별도의 서식 지정 없이 그대로 화면에 출력하는 역할을 합니다.이 문제를 해결하기 위해서는 전처리기가 제공하는 문자열화 연산자(stringize operator, #)를 활용해야 합니다. 매크로 매개변수 앞에 #을 붙이면 전달된 인자가 컴파일 이전 단계에서 자동으로 큰따옴표로 묶인 문자열 리터럴로 변환됩니다. 이렇게 변환된 문자열을 내부적으로 printf() 함수에 넘겨주면, 변수의 값이 아니라 코드에 작성한 인자 자체가
이 글에서는 C 언어에서 여러 줄 매크로(multiline macro)를 작성하는 방법을 알아보겠습니다.여러 줄 매크로는 함수처럼 정의할 수 있지만, 일반적인 함수와 달리 다음과 같은 규칙을 반드시 지켜야 합니다.여러 줄 매크로 작성 시 주의사항매크로의 각 줄이 끝날 때마다 반드시 역슬래시(\) 문자를 붙여야 합니다. 이는 전처리기(preprocessor)에게 다음 줄과 현재 줄이 하나의 명령으로 이어져 있음을 알려주는 줄 연결(line continuation) 기능입니다.중괄호({})를 사용해 매크로 본문을 감싸고 그대로 }로 끝
C 언어와 C++ 언어에서의 구조체(structure)는 이름은 같지만 그 성격과 기능에서 상당한 차이를 보입니다. 특히 C++의 구조체는 클래스(class)와 거의 유사하게 동작하기 때문에, 두 언어의 구조체 차이를 정확히 이해하는 것이 중요합니다. C 구조체와 C++ 구조체의 가장 큰 차이 가장 대표적인 차이점은 접근 제어입니다. C 언어의 구조체는 모든 멤버가 기본적으로 public으로 공개되지만, C++의 구조체는 멤버가 기본적으로 private으로 설정됩니다. 이 외에도 아래 표에서 확인할 수 있듯이 여러 가지 차이점이
C 언어의 익명 공용체와 구조체란?이번 글에서는 C 언어의 익명 공용체(anonymous union)와 익명 구조체(anonymous structure)가 무엇인지 자세히 살펴보겠습니다.익명 공용체와 구조체는 이름 그대로 이름이 없는(unnamed) 공용체와 구조체를 의미합니다. 이름이 없기 때문에 이들만으로는 독립적인 변수(객체)를 생성할 수 없으며, 대신 다른 구조체나 공용체 내부에 중첩(nested)되는 형태로 활용됩니다.익명 공용체와 구조체의 기본 문법익명 공용체와 구조체의 기본적인 선언 형태는 다음과 같습니다.struct
이번 글에서는 C 언어의 복합 리터럴(Compound Literal)에 대해 알아보겠습니다. 복합 리터럴은 C99 표준에서 새롭게 도입된 기능으로, 이름이 없는 익명 객체를 직접 생성할 수 있게 해줍니다.복합 리터럴이란?일반적으로 구조체 변수를 사용하려면 먼저 변수를 선언하고 초기화한 뒤 함수에 전달해야 합니다. 하지만 복합 리터럴을 사용하면 이러한 과정 없이 이름 없는 객체를 즉석에서 만들어 바로 사용할 수 있습니다. 문법은 다음과 같습니다.(타입) { 초기화 값 }즉, 괄호 안에 원하는 자료형을 명시하고, 뒤따르는 중괄호에 초기
C 프로그램의 메모리 레이아웃 개요 C 프로그램이 실행될 때 사용하는 메모리는 하나의 덩어리가 아니라 목적에 따라 여러 개의 영역(세그먼트)으로 나뉘어 관리됩니다. 대표적인 메모리 영역은 다음과 같습니다. 스택 세그먼트(Stack Segment) 힙 세그먼트(Heap Segment) 텍스트 세그먼트(Text Segment) 데이터 세그먼트(Data Segment) 각 영역은 서로 다른 용도와 특성을 가지며, 프로그램의 안정성과 성능을 이해하려면 이 구조를 정확히 아는 것이 중요합니다. 각 메모리 영역의 역할과 특징 1. 스택
C 언어에서 free() 함수는 malloc(), calloc(), realloc()으로 동적 할당된 메모리를 해제하는 데 사용됩니다. 사용법은 매우 간단합니다. 해제하고자 하는 포인터를 인자로 넘겨주기만 하면 됩니다.free(ptr);흥미로운 질문: 크기 정보는 어디에 있을까?여기서 의문이 생깁니다. free() 함수는 포인터만 인자로 받을 뿐, 메모리의 크기를 전혀 전달받지 않습니다. 그렇다면 free()는 대체 어떻게 해제해야 할 메모리 블록의 크기를 알 수 있는 걸까요?힙(Heap) 영역의 비밀: 숨겨진 메타데이터답은 동적
이 글에서는 GCC(GNU Compiler Collection)를 사용하여 C 또는 C++ 소스 코드에서 어셈블리 언어 출력을 생성하는 방법을 알아봅니다.GCC의 -S 옵션이란?GCC는 소스 코드를 컴파일하는 과정에서 발생하는 모든 중간 산출물을 확인할 수 있는 강력한 기능을 제공합니다. 그중 -S 옵션을 사용하면 어셈블러에 전달되기 직전, 즉 컴파일이 완료된 시점의 어셈블리 코드를 확인할 수 있습니다.명령어 사용 문법은 다음과 같습니다.gcc –S program.cpp이 명령을 실행하면 program.cpp 파일이 오브젝트 파일까
C 프로그래밍에서 매크로(Macro)와 함수(Function)는 비슷한 역할을 수행하는 것처럼 보이지만, 내부 동작 방식과 특성에서 중요한 차이가 있습니다. 이 글에서는 두 가지의 차이점을 예제 코드와 함께 자세히 살펴보겠습니다.매크로와 함수의 기본적인 차이가장 큰 차이는 처리 시점에 있습니다. 매크로는 전처리기(Preprocessor)에 의해 처리되므로, 컴파일이 시작되기 전에 모든 매크로가 단순 텍스트 치환 방식으로 확장됩니다. 반면 함수는 전처리 과정을 거치지 않고 직접 컴파일됩니다.또한 매크로는 타입 검사(type check
C 또는 C++에서는 const 키워드를 사용하여 상수 변수를 선언할 수 있습니다. 상수 변수는 한 번 초기화되면 그 값을 다시 변경할 수 없도록 설계되어 있습니다. 하지만 때로는 특정 기법을 통해 상수 변수의 값을 우회적으로 변경해야 하는 경우가 생기기도 합니다.이 글에서는 const 변수에 직접 값을 대입했을 때 발생하는 오류와, 포인터를 활용해 상수 변수의 값을 변경하는 방법을 예제 코드와 함께 살펴보겠습니다.const 변수에 직접 대입하면 발생하는 일const로 선언된 변수에 새로운 값을 대입하려고 하면 컴파일 시점에 에러가