C 표준 라이브러리의 int rename(const char *old_filename, const char *new_filename) 함수는 old_filename이 가리키는 기존 파일의 이름을 new_filename으로 변경하는 역할을 합니다. 이 함수를 활용하면 파일 이름을 바꾸는 것은 물론, 경로를 함께 지정해 파일을 이동시키는 것도 가능합니다.rename() 함수 선언int rename(const char *old_filename, const char *new_filename)매개변수 설명old_filename −
C 표준 라이브러리의 int remove(const char *filename) 함수는 지정된 파일을 삭제하여 더 이상 접근할 수 없도록 만듭니다. 이 함수는 stdio.h 헤더 파일에 선언되어 있으며, 파일 시스템에서 파일을 영구적으로 제거할 때 사용됩니다.함수 선언int remove(const char *filename)매개변수와 반환값매개변수: 이 함수는 삭제할 파일의 이름을 담고 있는 C 스타일 문자열(filename)을 인자로 받습니다. 경로가 포함된 전체 파일명을 사용할 수도 있습니다.반환값:성공 시: 0을 반환합니다.실
이 글에서는 C++에서 복사 생성자(copy constructor)를 어떻게 구현하고 활용하는지 자세히 알아보겠습니다. 본격적인 구현 방법에 앞서, 복사 생성자가 정확히 무엇인지부터 짚고 넘어가겠습니다. 복사 생성자란? 복사 생성자(copy constructor)는 같은 클래스의 기존 객체를 이용해 새로운 객체를 초기화하면서 생성하는 특수한 생성자입니다. 복사 생성자는 주로 다음과 같은 상황에서 호출됩니다. 같은 타입의 다른 객체로부터 새 객체를 초기화할 때 함수의 인자로 객체를 전달하기 위해 복사할 때 함수의 반환값으로 객체를
C++ 프로그래밍을 하다 보면 사용자로부터 입력받은 문자열이 숫자로만 이루어져 있는지 확인해야 하는 경우가 자주 발생합니다. 예를 들어, 입력 검증 단계에서 숫자만 허용해야 하거나, 문자열을 정수로 변환하기 전에 안전성을 확인해야 할 때가 그렇습니다.여기서 말하는 숫자 문자열(numeric string)이란 모든 문자가 0부터 9 사이의 범위에 속하는 문자열을 의미합니다. 반대로 알파벳이나 특수문자가 하나라도 포함되어 있다면 일반 문자열로 분류됩니다.기본 원리해결 방법은 매우 간단합니다. 문자열의 각 문자를 처음부터 끝까지 하나씩
C++ 클래스에는 정적(static) 멤버, 즉 정적 함수나 정적 변수를 선언할 수 있습니다. 이 중 정적 변수는 클래스 내부에서 선언만 가능하며, 실제 메모리 할당과 초기화는 반드시 클래스 정의 외부에서 이루어져야 합니다.정적 멤버 변수를 초기화하려면 클래스 이름 뒤에 범위 지정 연산자(::)를 붙이고, 그 다음에 변수 이름을 명시한 후 원하는 값을 대입하면 됩니다. 이렇게 초기화된 정적 변수는 프로그램 전체에서 단 하나의 복사본만 유지되며, 모든 객체가 이 값을 공유하게 됩니다.다음 예제 코드는 정적 멤버 변수의 초기화 기법을
C++에서는 변수의 참조(reference)를 함수에 전달할 수 있습니다. 이를 흔히 참조에 의한 호출(Call by Reference)이라고 부릅니다.참조에 의한 호출이란?참조에 의한 호출 방식에서는 인자(argument)의 값 자체가 아니라 그 참조(주소)가 형식 매개변수(formal parameter)로 복사되어 전달됩니다. 따라서 함수 내부에서는 호출 시 사용된 실제 변수에 직접 접근하게 되며, 매개변수에 가한 변경 사항이 원본 변수에도 그대로 반영됩니다.값을 참조로 전달하려면 다른 인자와 마찬가지로 참조를 함수에 넘기면 되
C/C++ 표준 라이브러리 함수 void free(void *ptr)는 이전에 malloc, calloc, realloc 호출을 통해 동적으로 할당된 메모리를 해제하는 역할을 합니다. 동적 메모리를 더 이상 사용하지 않게 되면 반드시 이 함수를 호출하여 메모리 누수(memory leak)를 방지해야 합니다.free() 함수 선언void free(void *ptr)이 함수는 포인터 ptr을 매개변수로 받습니다. ptr은 malloc, calloc 또는 realloc으로 이전에 할당된 메모리 블록을 가리키는 포인터이며, 해당 메모리가
C++11부터 표준 라이브러리에 포함된 <random> 헤더를 사용하면 외부 라이브러리 없이도 고품질 난수를 손쉽게 생성할 수 있습니다. 기존의 rand() 함수보다 난수 품질이 뛰어나고 다양한 분포를 지원하기 때문에, 현대 C++에서 난수 생성은 이 라이브러리를 활용하는 것이 권장됩니다.아래 예제에서는 random_device 객체를 단 한 번 사용해 mt19937 난수 생성기의 시드(seed)를 설정했습니다. random_device는 mt19937에 비해 속도가 느리지만 별도의 시드 지정이 필요 없으며, 운영체제로부
C++에서는 clock() 함수를 사용해 프로세스의 실행 시간을 손쉽게 측정할 수 있습니다. 이 함수는 <ctime> 헤더 파일(C 언어에서는 time.h)에 정의되어 있으며, 프로그램이 시작된 후 경과한 프로세서 시간을 클록 틱(clock tick) 단위로 반환합니다.경과 시간을 구하는 원리는 간단합니다. 작업 시작 전에 clock()으로 시간을 기록하고, 작업이 끝난 후 다시 한 번 시간을 측정한 뒤 두 값의 차이를 계산하면 됩니다. 이렇게 얻은 차이 값을 초 단위로 변환하려면 CLOCKS_PER_SEC(초당 클록 틱
C++11에서 도입된 범위 기반 for 루프(range-based for loop)는 컨테이너의 요소를 간결하게 순회할 수 있게 해주는 편리한 문법입니다. 하지만 표준 C++11에는 이 루프를 역방향(뒤집힌 순서)으로 순회하는 기능이 기본적으로 제공되지 않습니다.이러한 한계를 해결하기 위해 널리 사용되는 Boost 라이브러리를 활용할 수 있습니다. Boost는 강력하고 검증된 다양한 기능을 제공하는 오픈소스 C++ 라이브러리 모음으로, 그중 boost::adaptors::reverse()를 사용하면 배열이나 컨테이너를 별도의 복사
C++11에서 처음 도입된 람다(lambda)는 다른 함수 호출문 안에 중첩될 수 있는 익명 함수 객체입니다. 람다 표현식을 auto 키워드와 함께 사용하면 변수에 저장해 두고 나중에 재사용할 수도 있습니다.C++14에서는 람다 표현식이 한층 개선되어 제네릭 람다(generic lambda)를 지원하게 되었습니다. 매개변수 타입을 auto로 선언하면 컴파일러가 전달된 인자의 타입을 자동으로 추론하기 때문에, 마치 템플릿처럼 여러 타입에 대해 동작하는 람다를 만들 수 있습니다. 예를 들어 정수 덧셈, 실수 덧셈, 문자열 연결까지 하나
C++에서 난수 생성하기이번 글에서는 C++를 사용해 난수(random number)를 생성하는 방법을 알아보겠습니다. 여기서는 0부터 특정 값까지 범위 내에서 난수를 생성하며, 이 프로그램에서는 최대값을 100으로 설정했습니다.이 작업을 수행하기 위해 C 표준 라이브러리에 포함된 srand() 함수를 사용합니다. void srand(unsigned int seed) 함수는 rand 함수가 사용하는 의사 난수 생성기(pseudorandom number generator)에 시드(seed) 값을 설정하는 역할을 합니다.srand()
C++에서 const 타입의 멤버 변수는 선언과 동시에 초기화해야 하기 때문에, 일반적인 방식으로는 생성자 본문 내부에서 값을 대입할 수 없습니다. 그렇다면 생성자를 이용해 const 변수를 어떻게 초기화할 수 있을까요?초기화 리스트(Initializer List) 사용하기const 값을 생성자로 초기화하려면 반드시 초기화 리스트(initializer list)를 사용해야 합니다. 초기화 리스트는 클래스의 데이터 멤버를 초기화하는 데 사용되는 문법으로, 초기화할 멤버들의 목록은 생성자 이름 뒤의 콜론(:) 다음에 위치하며, 각 멤버
이 글에서는 C++에서 문자열의 사전순(lexicographical order) 다음 순열을 생성하는 방법을 알아봅니다. C++ 표준 라이브러리가 제공하는 next_permutation() 함수를 활용하면 몇 줄의 코드만으로 손쉽게 구현할 수 있습니다.사전순 다음 순열이란?사전순 다음 순열이란 현재 문자열의 모든 문자를 사전식 순서로 재배치했을 때, 현재 값보다 바로 다음으로 큰 순열을 의미합니다. 예를 들어 ACB의 다음 순열은 BAC입니다. 반면 BBB나 DCBA처럼 이미 가장 마지막 순열인 경우에는 더 큰 순열이 존재하지 않으
C++는 함수 오버로딩(Function Overloading)을 지원하는 언어입니다. 즉, 같은 이름의 함수라도 매개변수의 개수나 타입이 다르면 여러 버전을 정의할 수 있습니다. 하지만 모든 경우에 오버로딩이 허용되는 것은 아닙니다. 컴파일러가 함수들을 구분할 수 없는 상황에서는 오버로딩이 성립하지 않으며, 이 경우 컴파일 에러가 발생합니다.이 글에서는 C++에서 함수 오버로딩이 불가능한 대표적인 다섯 가지 경우를 코드 예제와 함께 살펴보겠습니다.1. 반환 타입만 다른 경우함수의 시그니처(함수 이름과 매개변수 목록)가 완전히 동일하
C++ 프로그래밍에서 size_t와 int는 모두 정수형이지만, 용도와 특성이 전혀 다릅니다. 두 타입을 혼동해서 사용하면 이식성 문제나 예상치 못한 버그를 일으킬 수 있으므로, 각각의 차이점을 명확히 이해하는 것이 중요합니다. size_t란 무엇인가? size_t는 <cstddef> 헤더에 정의된 부호 없는(unsigned) 정수 타입으로, 주로 객체의 크기나 배열의 인덱스, 메모리 블록의 바이트 수를 표현하는 데 사용됩니다. sizeof 연산자의 반환 타입이 바로 size_t입니다. 주요 차이점 비교 1. 부호(S
이 글에서는 Linux 환경에서 C++를 사용하여 프로그램의 메모리 사용량 통계를 확인하는 방법을 소개합니다.프로세스의 메모리 관련 세부 정보는 /proc/self/stat 파일에서 모두 얻을 수 있습니다. 이 파일에는 현재 실행 중인 프로세스에 대한 다양한 커널 통계가 기록되어 있으며, 여기서는 그중 가상 메모리(Virtual Memory) 크기와 상주 집합 크기(Resident Set Size, RSS) 두 가지 값을 추출하는 방법을 다룹니다.가상 메모리(vsize): 프로세스에 할당된 전체 가상 주소 공간의 크기RSS(rss)
C++로 프로그래밍을 하다 보면 어떤 정수가 몇 자리 숫자로 이루어져 있는지 확인해야 하는 경우가 종종 있습니다. 이번 글에서는 전통적인 반복문을 이용한 방법과, 로그 함수를 활용한 더 간결한 방법, 총 두 가지 방식을 소개합니다.방법 1: 나눗셈을 이용한 반복문가장 기본적인 방법은 숫자를 10으로 계속 나누면서 0이 될 때까지 나눈 횟수를 세는 것입니다. 정수를 10으로 나눌 때마다 마지막 자릿수가 하나씩 제거되므로, 나눈 횟수가 곧 자릿수가 됩니다.예제 코드#include <iostream>using namespace
C++ 프로그램 안에서 메모장(notepad)과 같은 서드파티 애플리케이션을 직접 실행하는 방법을 알아보겠습니다. 이 작업은 생각보다 훨씬 간단하며, 명령 프롬프트에서 사용하는 명령어를 그대로 활용할 수 있습니다.system() 함수를 이용한 프로그램 실행핵심은 C 표준 라이브러리의 system() 함수입니다. 이 함수에 실행하고자 하는 애플리케이션의 이름을 문자열로 전달하면, 운영체제가 해당 프로그램을 자동으로 열어줍니다.예를 들어 notepad.exe를 전달하면 윈도우 환경에서 메모장이 즉시 실행됩니다. 같은 방식으로 계산기(c
C++에서 예외 처리를 할 때 catch 블록이 어떻게 동작하는지, 그리고 예외 객체의 타입 변환(type conversion)이 어떤 규칙을 따르는지 알아보겠습니다. 많은 개발자들이 착각하기 쉬운 부분이 바로 이 타입 변환인데, catch 블록은 일반적인 함수 호출과 달리 암시적 타입 변환이 적용되지 않는다는 점이 핵심입니다.첫 번째 예제: char 타입 예외와 int catch 블록먼저 간단한 코드를 살펴보고, 어떤 결과가 출력되는지 그 이유를 분석해 보겠습니다.#include <iostream> using names