C언어에서는 fwrite()와 fread() 함수를 사용하여 구조체(structure) 같은 이진 데이터를 파일에 쓰거나 읽을 수 있습니다. 텍스트 형식이 아닌 메모리의 원본 데이터를 그대로 저장하므로, 대용량 데이터를 빠르게 처리할 때 특히 유용합니다.fwrite() 함수 문법fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream)각 매개변수의 의미는 다음과 같습니다.ptr - 파일에 기록할 요소들이 담긴 배열을 가리키는 포인터입니다.size - 기록할 각 요소의 크기(바
개요 C++에서는 텍스트 형식뿐 아니라 데이터를 바이트 단위로 그대로 저장하는 바이너리(binary) 파일 입출력도 지원합니다. 바이너리 모드를 활용하면 구조체나 배열 같은 데이터를 변환 과정 없이 파일에 직접 기록하고 다시 그대로 읽어올 수 있어 처리 속도가 빠르고 데이터 왜곡 위험도 적습니다. 바이너리 파일에 쓰기(Writing) C++에서 바이너리 파일에 데이터를 기록하려면 write() 메서드를 사용합니다. 이 메서드는 지정한 스트림에 일정 바이트 수만큼 데이터를 기록하며, 기록 시작 위치는 put 포인터가 가리키는 자리입
라인 스플라이싱이란?이 글에서는 C와 C++에서의 라인 스플라이싱(line splicing)에 대해 알아보겠습니다. 프로그래밍을 하다 보면 더블 슬래시 //를 사용해 한 줄 주석을 작성하는 경우가 많습니다. 한 줄 주석은 기본적으로 해당 줄이 끝나면 함께 종료되기 때문에, 다음 줄의 코드에는 영향을 주지 않습니다.그런데 만약 한 줄 주석 끝에 역슬래시(\)를 붙이면 어떻게 될까요? 역슬래시는 컴파일러에게 다음 줄과 현재 줄을 하나로 연결하라고 지시하는 역할을 합니다. 이를 라인 스플라이싱이라고 부릅니다. 따라서 역슬래시로 끝나는 주
이 글에서는 C와 C++에서 전위(prefix) 증감 연산자와 후위(postfix) 증감 연산자의 우선순위를 살펴봅니다.연산자 우선순위의 기본 규칙C/C++에서 증감 연산자와 역참조 연산자의 우선순위는 다음과 같습니다.전위 연산자(++, --)는 역참조 연산자(*)보다 높은 우선순위를 가집니다.후위 연산자(++, --)는 전위 연산자와 역참조 연산자 모두보다 더 높은 우선순위를 가집니다.따라서 ptr이 포인터일 때 다음과 같이 해석됩니다.*ptr++ → *(ptr++) : 포인터 자체를 먼저 증가시킨 후 역참조합니다.++*ptr →
C와 C++은 문법이 매우 비슷해 보이지만, 문자 리터럴(character literal)을 다루는 방식에서 중요한 차이점이 있습니다. 이 차이를 이해하면 두 언어의 타입 시스템을 더 깊이 파악할 수 있습니다.핵심 차이점: char vs intC++에서는 문자 상수의 타입이 char입니다. 반면 C에서는 문자 상수의 타입이 정수형(int)으로 취급됩니다.그 결과, C에서는 32비트 아키텍처 기준으로 sizeof(a)가 4를 반환합니다(단, CHAR_BIT는 8). 하지만 C와 C++ 모두에서 sizeof(char)는 항상 1바이트입
이번 프로그램에서는 C 언어를 사용하여 하트 모양 패턴을 출력하는 방법을 알아보겠습니다. 최종적으로 완성되는 하트 패턴은 다음과 같습니다.패턴 분석하기패턴을 자세히 분석해 보면, 전체를 몇 개의 구역으로 나누어 생각할 수 있습니다.하트의 밑부분: 역삼각형 형태로 이루어져 있습니다.하트의 윗부분: 서로 다른 크기의 두 개의 봉우리(곡선 꼭대기)가 있습니다.봉우리 사이: 두 봉우리 사이에는 공백이 존재합니다.따라서 이 패턴을 완성하려면 각 구역을 담당하는 반복문을 코드 안에서 적절히 배치하고 조합해야 합니다. 아래 예제 코드에서는 중첩
C 언어에서는 표현식의 왼쪽(좌변)에 함수 이름을 사용할 수 없습니다. 반면 C++에서는 참조(reference)를 반환하는 함수를 활용하면 함수 호출 결과를 대입문의 왼쪽에 놓을 수 있습니다.C++ 함수는 포인터를 반환하는 방식과 유사하게 참조를 반환할 수 있습니다. 함수가 참조를 반환하면 사실상 반환 값에 대한 암시적 포인터를 돌려주는 것이므로, 해당 함수가 마치 변수처럼 동작하여 대입문의 좌변에 위치할 수 있게 됩니다.참조 반환 예제다음은 배열의 특정 요소에 대한 참조를 반환하는 간단한 C++ 프로그램입니다.#include &
C와 C++ 문자 상수의 핵심 차이C++에서 문자 상수(character constant)의 데이터 타입은 char입니다. 반면 C 언어에서 문자 상수는 int(정수형)으로 취급됩니다. 이 차이 때문에 C에서는 sizeof(a)가 32비트 아키텍처 기준으로 4를 반환하며, CHAR_BIT는 8입니다. 흥미롭게도 sizeof(char)은 C와 C++ 두 언어 모두에서 1바이트로 동일합니다.즉, 같은 표현식이라도 어떤 언어로 컴파일하느냐에 따라 전혀 다른 결과가 나올 수 있습니다. 아래 예제를 통해 직접 확인해 보겠습니다.C 예제 코드
C와 C++의 void 포인터, 무엇이 다를까?void 포인터는 C와 C++ 모두에서 사용되는 개념이지만, 두 언어 사이에는 중요한 차이점이 존재합니다. 핵심적인 차이는 암시적 형 변환(implicit conversion)의 허용 여부입니다.C 언어에서는 void 포인터를 어떤 포인터 타입에든 명시적 캐스팅 없이 자유롭게 할당할 수 있습니다. 반면 C++에서는 타입 안정성을 중시하기 때문에, void 포인터를 다른 포인터 타입에 할당할 때 반드시 명시적 형 변환(explicit typecasting)을 해주어야 합니다.C에서의 vo
포인터 역참조(Dereferencing)의 의미역참조(Dereferencing)란 포인터가 가리키고 있는 메모리 위치에 저장된 데이터에 접근하거나 조작하는 작업을 말합니다. C와 C++에서는 간접 참조 연산자인 *(애스터리스크)를 사용하여 수행합니다.포인터 변수 앞에 *를 붙이면 해당 포인터가 가리키는 실제 변수에 접근하게 됩니다. 이처럼 포인터를 통해 원본 값에 도달하는 과정을 포인터의 역참조라고 부릅니다.역참조 기본 예제int main() { int a = 7, b; int *p; // 초기화되지 않은 포
이 글에서는 +, ++, -, -- 같은 산술 연산자를 전혀 사용하지 않고 두 개의 숫자를 더하는 방법을 알아보겠습니다.이 문제는 이진 가산기(binary adder) 논리를 활용하면 해결할 수 있습니다. 디지털 회로 설계에서 사용되는 반가산기(half adder)와 전가산기(full adder)는 한 자릿수의 이진수 두 개를 더할 수 있으며, 여러 개의 가산기를 계단식으로 연결하면 더 큰 숫자를 더하는 회로를 만들 수 있습니다.가산기의 핵심 원리는 다음과 같습니다. 먼저 두 숫자에 대해 XOR 연산을 수행하여 자리올림(carry)
힙(Heap) 오버플로란 무엇인가?힙(heap)은 프로그램 실행 중 동적으로 할당되는 변수를 저장하는 프로세스 메모리 영역입니다. C 언어에서는 malloc(), calloc(), realloc() 같은 표준 라이브러리 함수를 통해 힙 영역에 메모리를 할당합니다.힙 오버플로(heap overflow)는 주로 다음과 같은 상황에서 발생합니다.A) 비정상적으로 큰 동적 메모리를 한 번에 할당하는 경우int main() { float *ptr = (float *)malloc(sizeof(float
C 언어에서 변수와 데이터 타입은 앞선 내용에서 다루었습니다. 이번 글에서는 변수를 스코프(scope)와 가시성(visibility)을 기준으로 분류하는 스토리지 클래스(Storage Class)에 대해 자세히 알아보겠습니다. 핵심 개념 이해하기 스코프(Scope) 스코프는 일반적으로 변수의 생명 주기(lifetime)를 의미하는 용어입니다. 즉, 변수가 메모리에 얼마나 오래 유지되고 언제 소멸되는지를 나타냅니다. 가시성(Visibility) 가시성은 변수가 어느 위치에서 보이고, 어디에서 사용할 수 있는지를 뜻합니다. 예를
C 언어의 switch문은 하나의 변수를 여러 값 목록과 차례대로 비교하여 일치 여부를 판단하는 조건문입니다. 비교 대상이 되는 각각의 값을 케이스(case)라고 부르며, switch에 전달된 변수는 각 switch case와 순서대로 검사됩니다.switch문 기본 문법C 프로그래밍 언어에서 switch문의 기본적인 작성 형식은 다음과 같습니다.switch(expression) { case constant-expression : statement(s); break; /* 선택 사항 */ c
함수(Function)는 하나의 작업을 수행하기 위해 함께 묶인 문장들의 집합입니다. 모든 C 프로그램에는 최소한 하나의 함수가 존재하며, 그것이 바로 main() 함수입니다. 가장 간단한 프로그램이라도 필요에 따라 추가적인 함수를 정의할 수 있습니다.코드를 여러 개의 개별 함수로 나누어 작성할 수 있습니다. 코드를 어떻게 나눌지는 프로그래머의 몫이지만, 일반적으로 논리적으로 구분하여 각 함수가 특정 작업 하나를 담당하도록 설계하는 것이 좋습니다.함수 선언(declaration)은 컴파일러에게 함수의 이름, 반환 타입, 매개변수에
이번 장에서는 C 언어의 비트 필드(Bit Fields)가 무엇인지, 그리고 이를 활용해 메모리를 효율적으로 사용하는 방법에 대해 알아보겠습니다.비트 필드가 필요한 이유예를 들어 C 프로그램에서 TRUE/FALSE 값을 저장하는 여러 변수를 status라는 구조체로 묶어 관리한다고 가정해 봅시다.struct { unsigned int widthValidated; unsigned int heightValidated; } status;이 구조체는 8바이트의 메모리 공간을 차지합니다. 그런데 실제로 각 변수에는 0 또는 1
이 글에서는 정수(integer)를 문자열(string)로 변환하는 방법을 살펴보겠습니다.변환 로직은 매우 간단합니다. 핵심은 sprintf() 함수를 사용하는 것입니다. 이 함수는 값을 콘솔 화면에 출력하는 대신 문자열 버퍼에 저장한다는 점이 특징이며, 이것이 printf()와의 유일한 차이점입니다. 호출 시 첫 번째 인자로는 변환된 데이터를 저장할 문자열 버퍼를 전달합니다.입력: 사용자가 숫자 값(예: 42)을 입력합니다.출력: 프로그램은 해당 숫자의 문자열 형태인 42를 반환합니다.알고리즘1단계: 숫자를 인자로 받는다2단계:
이 글에서는 C 또는 C++ 코드에서 if 블록과 else 블록을 동시에 실행하는 특별한 기법을 소개합니다. 일반적으로 if-else 문은 조건에 따라 둘 중 하나만 실행되지만, 약간의 트릭을 사용하면 두 블록을 마치 if-else 문이 없는 것처럼 순차적으로 실행할 수 있습니다.예제 코드핵심 아이디어는 goto 문과 레이블(label)을 활용하는 것입니다. 각 블록 안에 레이블을 배치하고, 서로의 레이블로 제어를 강제로 이동시키는 방식입니다.#include <iostream> using namespace std; int
일반적으로 C/C++ 언어에서는 정수, 문자, 문자열 처리 등의 내장 함수를 사용하기 위해 헤더 파일을 포함시킵니다. 대표적인 출력 함수인 printf() 역시 내장 함수로, stdio.h 헤더 파일에 선언되어 있으며 콘솔에 다양한 형태의 데이터를 출력할 때 사용됩니다.그런데 흥미롭게도 헤더 파일을 포함하지 않고도 printf() 함수를 직접 선언하면 정상적으로 출력할 수 있습니다. 아래는 C 언어에서 헤더 파일 없이 문자열을 출력하는 예제입니다.예제 코드int printf(const char *text, ...); int main
멀티스레딩(Multithreading)은 멀티태스킹(Multitasking)의 특수한 형태입니다. 멀티태스킹이란 컴퓨터가 두 개 이상의 프로그램을 동시에 실행할 수 있도록 해주는 기능을 말합니다. 일반적으로 멀티태스킹에는 프로세스 기반과 스레드 기반의 두 가지 유형이 있습니다.프로세스 기반 멀티태스킹은 프로그램 자체의 동시 실행을 담당하고, 스레드 기반 멀티태스킹은 하나의 프로그램을 구성하는 여러 조각(작업 단위)의 동시 실행을 다룹니다.멀티스레드 프로그램은 동시에 실행될 수 있는 두 개 이상의 부분으로 구성됩니다. 이때 프로그램의