본문 바로가기

전체 글142

객체 초기화 방법 1. 생성자 본문 대입 (기존 방식)이 방식은 생성자 본문 { } 안에서 = 연산자를 사용하여 이미 생성된 멤버 변수에 값을 대입하는 방식입니다.class Player {public: std::string name; // 복잡한 객체 int level; // (1) 생성자 본문 대입 방식 Player(std::string n, int l) { // name 멤버는 여기서 'n' 값을 할당받기 전에, // 이미 기본값("")으로 초기화된 상태입니다. name = n; // 불필요한 대입 복사 발생 level = l; } }; 이 방식은 초기화 후, 대입이라는 2 단계를 거치게 됩니다. 즉, name 멤버 변수가 생성자.. 2026. 1. 9.
new 할당과 초기화 1. ( ) 소괄호를 사용한 초기화new T(args) 형태로 사용하는 전통적인 방식입니다. 2010년 이전부터 사용되던 방식이며, 기본적으로 인수가 있는 생성자를 호출할 때 사용됩니다. • 사용 예시 : new int(10), new Player("Warrior", 55) • 빈 초기화 : new int() 처럼 인수를 비워두면 0으로 값이 초기화됩니다. • 단점 (안정성) : 소괄호 방식은 int i = 3.14;처럼 정밀도 손실이 발생하는 "좁아지는 변환(Narrowing Conversion)" 을 허용합니다. 이는 잠재적인 버그의 원인이 될 수 있습니다. 2. { } 중괄호를 사용한 초기화 new T{args} 형태로 사용하는 모던 C++ (C++11 이후) 방식입니다. 유니폼 초기화라고 .. 2026. 1. 9.
스택(Stack)과 힙(Heap) : 책임과 수명의 차이 왜 메모리에는 힙(Heap)이 필요해졌을까?초기의 프로그램은 작업을 시작하고, 일을 끝내고, 메모리를 함께 정리하는 방식으로 동작했습니다. 이건 메모리가 이런 방식으로 설계되어 있기 때문입니다. 이 방식은 단순하고 빠르며, 실수할 여지도 적었습니다.문제는 프로그램이 점점 커지면서 생겼습니다. 작업이 끝나도 계속 유지되어야 하는 데이터가 필요해진 것입니다. • 여러 작업에서 공통으로 사용하는 데이터 • 언제 사라질지 미리 알 수 없는 데이터 • 프로그램 전체에서 오래 유지되어야 하는 데이터 이런 데이터들은 기존처럼 “작업이 끝나면 무조건 정리되는 메모리” 에 둘 수 없었습니다.그래서 운영체제는 필요한 만큼 만들고, 원하는 시점까지 유지할 수 있는 메모리 공간을 따로 마련했습니다. 이 공간을 기존 공간과 .. 2026. 1. 8.
복사의 종류와 차이점 1. 값 복사(Value Copy) vs 주소 복사(Address Copy)"무엇을 복사했는가?"에 대한 형태적 구분입니다.값 복사 (Value Copy)객체가 가진 값 자체를 복사합니다. C++의 기본 대입 연산자나 복사 생성자는 기본적으로 값 복사입니다.int b = a; 또는 A a2 = a1; • 특징 : 복사된 두 변수는 메모리상에서 서로 완전히 독립적입니다.주소 복사 (Address Copy)데이터가 저장된 메모리 주소값만 복사합니다.int* p2 = p1; 또는 참조(&)를 통한 전달. • 특징 : 복사본과 원본이 같은 메모리 주소를 가리키며 실체를 공유합니다. 2. 얕은 복사(Shallow Copy) vs 깊은 복사(Deep Copy)"복사 결과가 어떤 의미를 갖는가?"에 대한 결과적.. 2026. 1. 8.
매크로란 무엇인가? 매크로(Macro)는 **‘큰 단위, 한 번에 묶은 것’**을 뜻하는 그리스어 makros 에서 나온 말입니다.우리가 흔히 쓰는 micro(아주 작은 단위)의 반대 개념이기도 합니다.즉, 매크로란 여러 작은 작업을 하나의 큰 단위로 묶는 개념입니다. 1. 일상에서의 매크로 사용예를 들어 프로그램을 종료할 때 매번 다음과 같은 반복 작업을 한다고 가정해 보겠습니다.1. 메뉴를 선택2. 저장을 선택3. 프로그램 종료 버튼을 선택 이처럼 반복적이고 단순한 작업이 있을 때, 이를 하나로 묶어 클릭 한 번에 처리하는 방식이 바로 매크로입니다.게임에서도 같은 개념을 쉽게 찾아볼 수 있습니다.Q → W → E → R 이러한 일련의 키 입력을 F5 키 하나로 등록해 실행할 수 있다면 훨씬 편리할 것입니다.정리하면, 매.. 2026. 1. 5.
전방 선언 컴파일러에게 사용하고자 하는 객체 타입만 알려서 컴파일을 가능하게 하는 것을 전방 선언이라고 합니다.코드로 보면 매우 단순합니다class Player; 이 한 줄 코드로 • Player 라는 타입 이름이 존재한다. • 구현은 모른다. • 멤버도 모른다. • 크기도 모른다 그래도 컴파일은 됩니다.결국 전방 선언이라는 것은 헤더 포함 (#include) 을 회피하고, 컴파일에게는 최소한의 타입 정보만을 제공함으로써 결과적으로 컴파일 시간을 절약하기 위한 방법이라고 할 수 있습니다. 단, 여기에는 몇가지 조건이 있습니다. 1. 포인터 멤버나 참조 (가능)class Player;class Enemy{ Player* target; // OK}; 이 경우 포인트의 크기는 주소값이므로 고정이고 Player.. 2026. 1. 5.