본문 바로가기

C++13

참조 반환(Return by Reference)의 이해와 활용 C++ 에서 함수 리턴 시 발생하는 복사 비용을 줄이고, 원본 데이터를 효율적으로 제어하는 원리에 대해 정리합니다. 1. 함수 리턴 시 '임시 복사본' 이 생성함수는 내부에서 return 문을 만나면, 반환할 값을 임시 메모리에 복사하여 생성해 둡니다. 이때 복사 비용이 1번 발생하게 됩니다.Item GetItem(){ return item_; // item_를 복사하여 '임시 객체'를 생성 후 반환}여기서 주의할 점은 item_가 클래스의 멤버 변수라 하더라도, 멤버 변수 원본 데이터가 직접 반환되는 것이 아니라 임시 객체를 거쳐서 반환된다는 점입니다. 따라서 이 임시 객체는 해당 문장이 끝나면 소멸하는 존재이므로, 외부에서는 참조 형태로 받을 수 없습니다.Item& a = GetItem(); /.. 2026. 1. 27.
베스트 프랙티스(Best Practice) : 전문적인 C++ 코드의 기준 '베스트 프랙티스(Best Practice, BP)'는 단순히 잘 작동하는 코드를 넘어, 가장 효율적이고, 안정적이며, 협업에 최적화된 코드를 작성하기 위한 업계 표준이자 검증된 안전 규칙을 의미합니다. BP는 수많은 명명 규칙, 초기화 원칙, 설계 패턴 등을 포함하는 광범위한 개념입니다.개발자가 BP를 따라야 하는 근본적인 이유는 다음과 같습니다. 1. 안전성 (Safety) 확보BP는 코드 내부의 예측 불가능한 '함정'을 피하게 해줍니다. 안전성 BP는 매우 광범위하며, 아래는 개발자들이 반드시 지켜야 할 대표적인 안전 규칙의 예시입니다.컴파일 단계 안전 규칙 예시축소 변환 방지 : int 변수에 float 값을 넣는 등 잠재적인 데이터 손실을 유발하는 상황을 컴파일 단계에서 막아줍니다. 이 때문에 .. 2026. 1. 10.
객체 초기화 방법 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.