C++에서 멤버 변수나 멤버 함수가 전혀 없는 빈 클래스(empty class)의 크기는 얼마일까요? 많은 개발자가 직관적으로 0바이트라고 생각하지만, 실제로는 1바이트입니다. 그 이유와 함께 직접 확인할 수 있는 예제 코드를 살펴보겠습니다.왜 빈 클래스의 크기가 1바이트인가?C++ 표준에서는 서로 다른 객체가 반드시 서로 다른 메모리 주소를 가져야 한다고 규정합니다. 만약 빈 클래스의 크기가 0이라면, 같은 클래스로 생성된 여러 객체들이 동일한 주소를 가질 수 있게 되어 이 규칙에 어긋나게 됩니다. 따라서 컴파일러는 데이터가 없더
C++에서 구조체(struct)와 클래스(class)는 문법적으로 거의 동일하지만, 몇 가지 중요한 차이점이 있습니다. 이 차이점을 정확히 이해하면 상황에 맞게 클래스와 구조체 중 어느 것을 선택해야 할지 판단하는 데 큰 도움이 됩니다.클래스와 구조체의 주요 차이점가장 핵심적인 차이는 기본 접근 지정자(default access specifier)입니다.클래스: 모든 멤버가 기본적으로 private로 선언됩니다.구조체: 모든 멤버가 기본적으로 public으로 선언됩니다.즉, 접근 지정자를 명시하지 않으면 클래스의 멤버는 외부에서 직
정적 변수(static variable)는 static 키워드를 사용하여 선언된 변수를 말합니다. 정적 변수의 메모리 공간은 프로그램 전체 실행 과정에서 단 한 번만 할당되며, 이 공간은 프로그램이 종료될 때까지 계속 사용됩니다.정적 변수는 한 번 선언되면 프로그램이 실행되는 동안 계속 존재합니다. 따라서 정적 변수의 수명(lifetime)은 곧 프로그램의 수명과 같습니다.예제 코드다음은 정적 변수의 동작을 보여주는 간단한 C++ 프로그램입니다.#include <iostream> using namespace std; v
객체(Object)는 클래스의 인스턴스입니다. 중요한 점은 메모리가 클래스가 정의되는 시점이 아니라 객체가 실제로 생성되는 시점에 할당된다는 것입니다.C++에서는 함수가 return 키워드를 사용하여 객체를 반환할 수 있습니다. 아래 예제 프로그램을 통해 이를 확인해 보겠습니다.예제 코드#include <iostream> using namespace std; class Point { private: int x; int y; public: Point(int x1 = 0, int y1 =
다형성(Polymorphism)은 객체 지향 프로그래밍(OOP)의 핵심 특징 중 하나로, 하나의 이름이 여러 가지 형태로 동작할 수 있는 능력을 의미합니다. 여러 형태라는 뜻을 가진 이 개념은 C++에서 크게 컴파일 타임 다형성과 런타임 다형성 두 가지로 나눌 수 있습니다. C++ 다형성의 두 가지 유형 컴파일 타임 다형성은 프로그램이 컴파일되는 시점에 어떤 함수가 호출될지 결정되는 방식입니다. 대표적인 예로 함수 오버로딩(Function Overloading)과 연산자 오버로딩(Operator Overloading)이 있습니다.
C++에서 클래스는 public, private, protected 세 가지 접근 지정자 영역을 가지며, 각 영역에는 해당하는 클래스 멤버들이 포함됩니다.클래스의 protected 멤버는 private 멤버와 매우 유사합니다. 두 멤버 모두 클래스 외부에서는 직접 접근할 수 없기 때문입니다. 하지만 결정적인 차이가 하나 있습니다. 바로 파생 클래스(자식 클래스)에서는 protected 멤버에 접근할 수 있지만, private 멤버에는 접근할 수 없다는 점입니다.예제 코드다음은 C++에서 파생 클래스가 기반 클래스의 protected
C++에서 클래스(class)는 public, private, protected라는 세 가지 접근 지정자 섹션을 가질 수 있으며, 각 섹션에는 그에 해당하는 클래스 멤버들이 포함됩니다.private 멤버란?private으로 선언된 데이터 멤버는 클래스 외부에서 직접 접근할 수 없습니다. 오직 해당 클래스의 멤버 함수나 friend로 선언된 함수만이 접근 가능합니다. 또한 접근 지정자를 명시하지 않으면 클래스의 모든 멤버는 기본적으로 private으로 설정됩니다.protected 멤버란?protected 멤버는 private 멤버와
C++에서 변수나 함수 이름 앞에 붙는 이중 콜론(::)은 범위 지정 연산자(scope resolution operator)라고 불립니다. 이 연산자는 특정 식별자가 속한 범위를 명확하게 지정하는 역할을 하며, 대표적인 용도는 다음과 같습니다.1. 클래스 외부에서 멤버 함수 정의하기범위 지정 연산자를 사용하면 클래스 선언부 밖에서 멤버 함수를 정의할 수 있습니다. 클래스 내부에는 함수의 원형만 두고, 실제 구현은 클래스이름::함수이름 형태로 외부에 작성하는 방식입니다. 이를 보여주는 예제 프로그램은 다음과 같습니다.예제 코드#inc
C++에서는 main() 함수가 자기 자신을 호출할 수 있습니다. 함수가 자기 자신을 호출하는 것을 재귀(recursion)라고 부르며, 아래 프로그램은 이를 보여주는 간단한 예제입니다.예제#include<iostream> using namespace std; int main() { static int x = 1; cout << x << ; x++; if(x == 11) { return 0; } main(); }출력 결과위 프로그램을 실행하면
C++에서는 NULL로 초기화된 클래스 포인터를 통해서도 멤버 함수를 호출할 수 있습니다. 언뜻 이상하게 들리지만, 실제로 컴파일되어 실행되는 코드입니다.주의 사항다만 이러한 동작은 정의되지 않은 동작(undefined behaviour)에 해당합니다. 즉, 프로그램이 정상적으로 실행된다는 보장이 전혀 없으며, 실제 결과는 사용하는 컴파일러와 환경에 따라 달라질 수 있습니다. 따라서 실제 프로젝트에서는 이런 방식의 호출을 절대 사용해서는 안 됩니다.예제 코드NULL 포인터로 멤버 함수를 호출하는 과정을 보여주는 프로그램은 다음과 같
에라토스테네스의 체(Sieve of Eratosthenes)는 n이 약 1천만 이하일 때 n보다 작은 모든 소수를 찾는 가장 효율적인 방법 중 하나입니다. 이 알고리즘의 시간 복잡도는 O(n log log n)으로 매우 빠르며, 숫자 하나하나를 나누어 확인하는 단순 반복 방식보다 월등히 우수한 성능을 보여줍니다.아래 프로그램은 에라토스테네스의 체를 구현한 예제입니다.예제#include <bits/stdc++.h>using namespace std;void SieveOfEratosthenes(int num) { &
배열을 0으로 초기화하기C++에서 배열 전체를 0으로 초기화하는 것은 매우 간단합니다. 다음과 같이 작성하면 됩니다.int arr[10] = {0};중괄호 안에 0을 하나만 지정하면 나머지 요소들이 자동으로 0으로 채워져, 배열의 모든 요소가 0으로 초기화됩니다.0이 아닌 값으로 초기화할 때의 한계그러나 위와 같은 방식으로는 배열 전체를 0이 아닌 값으로 초기화할 수 없습니다. 다음 예시를 살펴보겠습니다.int arr[10] = {5};위 코드에서 실제로 5로 초기화되는 것은 첫 번째 요소뿐입니다. 나머지 요소는 모두 0으로 초기화
C++에서는 클래스의 멤버 함수를 NULL 객체 포인터를 통해서도 호출할 수 있습니다. 언뜻 이상하게 들리지만, 실제로 컴파일하여 실행하면 정상적으로 동작하는 경우가 있습니다.주의: 이러한 동작은 C++ 표준에서 정의되지 않은 동작(undefined behavior)에 해당합니다. 따라서 프로그램의 실행 결과에 대한 어떠한 보장도 없으며, 실제 결과는 사용하는 컴파일러와 실행 환경에 따라 달라질 수 있습니다.다음 예제 프로그램을 통해 이를 직접 확인해 보겠습니다.예제 코드#include <iostream> using na
C++에서 정적(static) 클래스 멤버는 static 키워드를 사용하여 정의할 수 있습니다. 클래스 내에 선언된 정적 멤버는 해당 클래스로 생성되는 모든 객체가 공유합니다. 메모리에는 정적 멤버의 복사본이 단 하나만 존재하기 때문에, 객체가 몇 개 생성되더라도 모든 객체가 동일한 멤버를 함께 사용하게 됩니다.그렇다면 정적 멤버는 언제 초기화될까요? 정적 멤버가 다른 방식으로 명시적으로 초기화되지 않은 경우, 클래스의 첫 번째 객체가 생성되는 시점에 자동으로 0으로 초기화됩니다.예제 코드다음 프로그램은 C++에서 정적 클래스 멤버
new 연산자는 힙(heap) 영역에 메모리 할당을 요청하는 C++의 동적 메모리 할당 연산자입니다. 요청한 크기의 메모리가 충분히 남아 있다면, 해당 메모리를 초기화한 뒤 그 시작 주소를 포인터 변수에 반환합니다.new 연산자는 delete로 명시적으로 해제할 때까지 객체를 메모리에 유지해야 하는 경우에만 사용하는 것이 좋습니다. 반대로 new를 사용하지 않고 일반 변수나 객체를 선언하면, 해당 객체는 자신이 선언된 범위(scope)를 벗어나는 순간 자동으로 소멸됩니다. 즉, new로 생성한 객체는 프로그래머가 직접 해제해 주어야
C++에서 지역(로컬) 배열은 함수에서 직접 반환할 수 없습니다. 그 이유는 지역 배열이 스택 메모리에 생성되며, 함수 호출이 종료되는 순간 해당 메모리가 해제되어 더 이상 유효하지 않게 되기 때문입니다. 이미 사라진 배열의 주소를 반환하면 미정의 동작(undefined behavior)이 발생할 수 있습니다.이 문제를 해결하는 대표적인 방법 중 하나는 함수 내부에 정적(static) 배열을 선언하는 것입니다. 정적 배열의 수명(lifetime)은 프로그램 실행 전체와 동일하기 때문에, 함수가 종료된 후에도 메모리에 유지되므로 문제
배열(array)은 동일한 타입의 요소들이 연속된 메모리 공간에 나란히 저장되어 있는 자료 구조입니다. 배열에서 가장 낮은 주소는 첫 번째 요소에 해당하며, 가장 높은 주소는 마지막 요소에 해당합니다. 또한 배열의 인덱스는 0부터 시작해서 배열 크기에서 1을 뺀 값(배열 크기 - 1)까지 이어집니다.C++에서는 배열을 선언할 때 변수를 사용해 초기화할 수도 있고, 실제 숫자 값(리터럴)을 직접 대입해 초기화할 수도 있습니다. 두 방식을 함께 사용하는 예제 프로그램은 다음과 같습니다.예제 코드#include <iostream&g
C++ 정적 멤버 변수란?C++에서 정적(static) 멤버 변수는 static 키워드를 사용하여 정의합니다. 정적 멤버 변수는 메모리에 단 하나의 복사본만 존재하기 때문에, 클래스로부터 생성되는 객체의 수와 관계없이 모든 객체가 이 변수를 공유하게 됩니다.또한 정적 멤버 변수를 별도로 초기화하지 않으면, 해당 클래스의 첫 번째 객체가 생성되는 시점에 자동으로 0으로 초기화됩니다.예제 코드다음 예제는 C++에서 정적 멤버 변수를 선언하고 초기화하는 과정을 보여줍니다.#include <iostream>using namesp
C++에서는 std::to_string 함수를 사용하여 double 타입의 값을 간단하게 문자열(string)로 변환할 수 있습니다. 이 함수는 double 값을 매개변수로 받아, 해당 숫자를 문자 시퀀스 형태로 담고 있는 string 객체를 반환합니다.다음은 실제 동작 과정을 보여주는 예제 프로그램입니다.예제 코드#include <iostream> #include <string.h> using namespace std; int main() { double d = 238649.21316934; s
조합(Combination)과 순열(Permutation)은 조합론(Combinatorics)의 핵심 개념입니다. 순열은 n개의 원소 중에서 하나씩, 일부씩 또는 전체를 한 번에 선택하여 나열하는 서로 다른 순서의 배열을 의미하며, 조합은 순서와 상관없이 원소를 선택하는 서로 다른 방법의 수를 의미합니다.순열과 조합의 공식전체 n개의 원소 중 r개의 원소를 배열할 때의 순열 개수는 다음과 같습니다.전체 n개의 원소 중 r개의 원소를 선택할 때의 조합 개수는 다음과 같습니다.C++ 구현 예제아래는 C++에서 재귀 함수를 이용해 팩토리