C++ 코드를 읽다 보면 멤버 함수 선언의 가장 끝에 const 키워드가 붙어 있는 경우를 종종 발견하게 됩니다. 과연 이 const는 어떤 의미를 가질까요?함수 선언 끝에 const를 붙이면 해당 함수가 상수 멤버 함수(constant member function)로 지정됩니다. 상수 멤버 함수란, 호출된 객체의 멤버 변수를 수정할 수 없는 함수를 의미합니다. 즉, 함수 내부에서 객체의 상태를 변경하려는 시도 자체가 컴파일 오류로 처리됩니다. 객체를 안전하게 다루기 위해 프로그램에서 상수 멤버 함수를 사용하는 것이 권장됩니다.상수
C++에서 unsigned char란 무엇인가?C++에는 문자 하나를 저장하는 char 자료형이 있습니다. 그런데 코드를 보다 보면 unsigned char라는 표현도 자주 등장합니다. 이번 글에서는 unsigned char가 정확히 무엇을 의미하는지, 그리고 signed char와는 어떤 차이가 있는지 알아보겠습니다.signed char와 unsigned char의 기본 개념signed char와 unsigned char는 모두 문자 하나를 저장하는 데 사용됩니다. 변수에는 문자 자체가 아니라 해당 문자의 ASCII 값이 저장된다
C++에는 네 가지 캐스트 연산자(static_cast, dynamic_cast, const_cast, reinterpret_cast)가 있으며, 그중 static_cast와 dynamic_cast가 가장 자주 사용됩니다. 두 연산자는 모두 타입 변환을 수행하지만 검사 시점과 용도가 다르므로, 상황에 맞게 올바르게 선택하는 것이 중요합니다.static_cast: 일반적인 타입 변환에 사용되는 캐스트입니다. 컴파일러가 수행하는 암시적 형변환(implicit type coercion)과 동일한 규칙으로 동작하며, 필요에 따라 명시적으로
이 글에서는 반복문(loop)과 조건문(conditional statement)을 전혀 사용하지 않고 1부터 1000까지 출력하는 방법을 알아봅니다.반복문을 쓸 수 없다면 일반적으로 재귀(recursion)를 떠올리게 되지만, 이 문제에서는 조건문 역시 사용할 수 없다는 추가 제약이 있습니다. 조건문이 없으면 재귀 함수의 기저 사례(base case)를 만들 수 없으므로, 재귀 방식도 사실상 사용하기 어렵습니다.해결 아이디어: 정적 멤버와 생성자 활용여기서는 정적(static) 멤버 변수와 생성자를 활용해 이 문제를 해결합니다. 핵
C++에는 컴파일 시점에 자동으로 치환되는 사전 정의 매크로(predefined macros)가 여러 개 존재합니다. 그중에서도 __FILE__, __LINE__, __FUNCTION__은 디버깅과 로깅(log) 작업에서 특히 유용하게 활용됩니다. 이번 글에서는 세 매크로의 역할과 실제 사용 예제를 살펴보겠습니다.1. __FILE__ — 현재 파일 경로__FILE__ 매크로는 현재 컴파일 중인 소스 파일의 전체 경로를 문자열 리터럴로 반환합니다. 로그 파일을 생성할 때 어떤 파일에서 오류가 발생했는지 기록해야 하는 경우에 매우 유용
이 글에서는 C++ 클래스의 변환 생성자(converting constructor)가 무엇인지 자세히 알아보겠습니다. 먼저 생성자는 클래스의 특수한 멤버 함수로, 다음과 같은 고유한 특징을 가집니다.함수 이름이 클래스 이름과 동일하다별도의 반환값을 가지지 않는다객체가 생성될 때 자동으로 호출된다생성자는 클래스의 객체를 만들기 위해 사용되며, 인수를 받을 수도 있고 받지 않을 수도 있습니다.변환 생성자란?생성자가 단 하나의 인수만 받도록 정의되면, 그 생성자를 변환 생성자라고 부릅니다. 변환 생성자는 다른 타입의 값(예: int, d
이번 글에서는 C와 C++에서 말하는 재진입 함수(reentrant function)가 무엇인지 살펴보겠습니다. 어떤 함수가 실행되는 도중에 인터럽트(interrupt)에 의해 중단되더라도, ISR(Interrupt Service Routine, 인터럽트 서비스 루틴)의 처리가 끝난 후 중단된 지점부터 안전하게 작업을 다시 이어갈 수 있다면, 그 함수를 재진입 함수라고 부릅니다.이러한 재진입 함수는 재귀 호출(recursion), 하드웨어 인터럽트 처리처럼 하나의 함수가 동시에 여러 흐름에서 실행될 수 있는 상황에서 반드시 필요합니
C와 C++에서는 디버깅이나 로깅 작업 시 현재 실행 중인 함수의 이름을 손쉽게 확인할 수 있도록 특수한 식별자들을 제공합니다. 이번 글에서는 __FUNCTION__, __func__, __PRETTY_FUNCTION__ 세 가지의 차이점과 각각의 용도를 자세히 살펴보겠습니다. 세 가지 식별자의 기본 개념 __FUNCTION__과 __func__는 사실상 동일한 역할을 합니다. 둘 다 현재 함수의 이름만을 문자열로 반환하며, 일부 구버전의 C 및 C++ 컴파일러에서는 __func__를 지원했습니다. __func__는 C99 표준
C++에서 volatile 한정자(qualifier)는 변수를 선언할 때 함께 지정하는 키워드로, 컴파일러에게 이 변수의 값은 언제든지 외부 요인에 의해 변경될 수 있다고 알려주는 역할을 합니다. 이를 통해 컴파일러는 해당 변수에 대한 과도한 최적화를 수행하지 않게 됩니다.volatile의 주요 특징volatile 키워드가 붙은 변수는 메모리 할당이 제거되지 않습니다.변수 값이 CPU 레지스터에 캐싱되지 않으며, 항상 메모리에서 직접 읽고 씁니다.값은 할당된 순서 그대로 변경되며, 컴파일러가 임의로 재배치하지 않습니다.volatil
싱글톤(Singleton) 디자인 패턴은 하나의 클래스에 대해 오직 단 하나의 객체(인스턴스)만 생성되도록 제한하는 소프트웨어 설계 원칙입니다. 시스템 전체에서 하나의 객체만으로 동작을 조율해야 할 때 매우 유용하게 사용됩니다.예를 들어, 파일에 로그를 기록하는 로거(Logger)를 생각해 볼 수 있습니다. 여러 곳에서 로그를 남기더라도 파일 접근은 한 곳에서만 관리하는 것이 안전하므로, 이런 경우 싱글톤 클래스로 로거를 구현하는 것이 좋습니다.싱글톤 패턴의 핵심 구현 요소C++에서 싱글톤 클래스를 만들려면 다음 세 가지가 필요합니
C나 C++ 프로그래밍을 하다 보면 int와 const int&의 차이가 헷갈리는 경우가 많습니다. 이 글에서는 두 선언이 어떻게 다른지, 그리고 각각 어떤 의미를 가지는지 자세히 살펴보겠습니다.int란 무엇인가?int는 기본적인 정수형(integer) 데이터 타입입니다. 변수를 일반적인 방식으로 선언하면 해당 변수는 자유롭게 읽고 수정할 수 있습니다.int a = 10; a = 20; // 정상적으로 값 변경 가능const int&의 의미const int&는 int const&와 동일한 표현입니다. 이는 상수
cin.ignore() 함수는 C++에서 입력 버퍼에 남아 있는 하나 이상의 문자를 무시하거나 제거할 때 사용하는 함수입니다.ignore() 함수가 실제로 어떻게 동작하는지 이해하려면, 먼저 이 함수 없이는 발생하는 전형적인 문제 상황을 살펴보는 것이 좋습니다.왜 입력 버퍼를 비워야 할까요?프로그래밍을 하다 보면 불필요하게 남아 있는 버퍼를 비워야 하는 경우가 있습니다. 그래야 다음 입력이 원하는 변수에 올바르게 저장되고, 이전 변수의 버퍼에 섞여 들어가는 일을 막을 수 있습니다.예를 들어, cin으로 숫자를 입력받은 직후 문자 배
C 언어에서 변수의 범위(scope)는 어떻게 결정될까요? 이 글에서는 C에서 변수의 스코프가 지정되는 방식을 예제와 함께 살펴보겠습니다. 정적 범위(Static Scope)란? C 언어의 변수는 항상 정적 범위(static scope), 즉 렉시컬 스코프(lexical scope) 규칙을 따릅니다. 정적 범위란 변수의 바인딩(binding)이 프로그램의 소스 코드 텍스트만으로 결정된다는 의미입니다. 즉, 어떤 변수 이름이 실제로 어느 변수를 가리키는지는 프로그램 실행 중의 함수 호출 스택과는 무관하며, 코드 작성 시점의 구조에 따
C 언어에서 전역 변수의 재선언(re-declaration)이 가능한지, 그리고 어떤 조건에서 오류가 발생하는지 살펴보겠습니다. 먼저 지역 변수의 경우부터 확인한 뒤, 전역 변수와 비교해 보겠습니다.지역 변수의 재선언: 컴파일 오류 발생다음 코드는 같은 함수 내에서 변수를 두 번 선언하는 예제입니다.#include <stdio.h>int main(){ int a; int a = 50; printf(a
C 프로그래밍에서 volatile(휘발성) 한정자가 어떤 의미를 가지는지 살펴보겠습니다. volatile 한정자는 변수를 선언할 때 적용하며, 컴파일러에게 해당 변수의 값이 언제든지 변경될 수 있음을 알려주는 역할을 합니다. volatile의 주요 특징 volatile 키워드는 메모리 할당을 제거할 수 없습니다. 변수를 CPU 레지스터에 캐싱할 수 없습니다. 값은 할당 순서대로만 변경됩니다. 그렇다면 volatile 키워드는 어떻게 사용할까요? 다음과 같이 선언하면 됩니다. volatile int a; int volatil
이 글에서는 C 또는 C++에서 전처리기(Preprocessor)가 어떻게 작동하는지 자세히 살펴보겠습니다.전처리기란 실제 컴파일이 시작되기 이전 단계에서 컴파일러에게 정보를 처리하도록 지시하는 명령어입니다. 즉, 소스 코드가 본격적으로 컴파일되기 전에 필요한 사전 작업을 수행하는 역할을 담당합니다.전처리기 지시문의 기본 규칙모든 전처리기 지시문은 # 기호로 시작하며, 한 줄에서 지시문 앞에는 공백 문자만 올 수 있습니다. 또한 전처리기 지시문은 C++ 문장이 아니기 때문에 세미콜론(;)으로 끝나지 않는다는 점을 기억해야 합니다.지
이번 글에서는 C/C++에서 while(1)과 while(0)의 차이점에 대해 자세히 알아보겠습니다. while은 C와 C++에서 사용되는 반복문으로, 조건을 검사한 뒤 해당 조건이 참(true)인 동안 루프 내부의 문장들을 계속 실행합니다.while(1): 무한 루프while(1) 또는 while(0이 아닌 임의의 값)은 무한 루프(infinite loop)를 만들 때 사용됩니다. 1 또는 0이 아닌 값은 항상 참으로 평가되기 때문에, 별도의 종료 조건 없이는 루프 내부의 문장들이 영원히 반복 실행됩니다.따라서 이러한 무한 루프에
C의 __func__ 식별자란?C 언어에는 현재 실행 중인 함수의 이름을 문자열로 얻을 수 있는 __func__라는 사전 정의된 식별자가 있습니다. 이는 디버깅이나 로깅 작업 시 매우 유용하게 활용됩니다.일부 구버전의 C 및 C++ 컴파일러에서는 __FUNCTION__이라는 매크로로 동일한 기능을 제공하기도 했습니다. __func__는 C99 표준부터 공식적으로 도입되었으며, 함수 본문 내에서 해당 함수의 이름을 담고 있는 정적 문자열처럼 동작합니다.참고로 __func__는 매크로가 아니라 식별자(identifier)라는 점에 유의
이번 글에서는 C 언어의 restrict 키워드가 무엇인지 살펴보겠습니다. restrict 키워드는 C99 표준에서 처음 도입되었으며, 컴파일러 최적화와 밀접한 관련이 있는 키워드입니다. 그럼 restrict 키워드가 실제로 어떤 역할을 하는지 자세히 알아보겠습니다. 타입 한정자로 사용: restrict 키워드는 포인터 선언 시 포인터의 타입 한정자(qualifier)로 사용됩니다. 새로운 기능을 추가하지 않음: 이 키워드 자체는 새로운 기능을 제공하지 않습니다. 대신 프로그래머가 컴파일러에게 수행 가능한 최적화에 대한 정보를 전
C 언어에서 구조체(struct) 변수에는 어떤 연산을 적용할 수 있을까요? 결론부터 말하면, 구조체 변수에 기본적으로 허용되는 연산은 대입(assignment) 연산뿐입니다. 두 구조체를 비교하는 동등성 검사(==)나 기타 다른 연산자는 구조체에 직접 사용할 수 없습니다.구조체 대입 연산 예제아래 예제는 복소수를 표현하는 구조체를 정의하고, 각 구조체 변수에 값을 초기화한 뒤 출력하는 코드입니다.#include <stdio.h> typedef struct { // 복소수 객체를 위한 구조체 정의 int real,