전체 글 111

22. 올바른 헤더파일 사용

헤더파일에 클래스나 함수의 선언부를 넣는 것은 다른 개발자에게이 기능을 가져다 써도 좋습니다 라고 공개적으로 알리는 행위임헤더는 일종의 사용허가서 이자, 해당 기능을 사용하기 위한 컴파일러가 알아야 할 최소한의 정보가 담긴 설계도임.따라서, 만약 특정 클래스나 함수를 라이브러리 내부에서만 사용하고, 외부 사용자에게 노출하고 싶지 않다면, 그 선언부를 헤더 파일에 넣어서는 안된다.이를 통해 기능의 사용범위를 명확히 하고, 의도치 않는 사용을 막는 설계 원칙임사용자가 클래스를 사용한다는 것의 의미사용자가 new MyClass나 MyClass obj 처럼 객체를 직접 생성하려면, 컴파일러는 해당 객체의 정확한 크기를 알아야 한다.포인터는 크기가 고정되어 있으므로, 컴파일러는 private 멤버 변수들이 무엇인..

프로그래밍/C++ 2025.09.22

21. new오버로딩 , delete 오버로딩

C++의 가장 깊은 곳을 건드리는 기법입니다!주돈 목적은 주로 커스텀 메모리 풀을 만들거나, 메모리 누수를 추적 하는것입니다.무엇을 제어할 수 있는가?new 연산자는 크게 1)메모리 할당 2)생성자 호출의 두 단계로 이루어집니다.delete는 1) 소멸자 호출과 2)메모리 헤제로 이루어 집니다 ← 순서가 다릅니다!연산자 오버로딩을 통해 제어 가능한 부분은 '메모리 할당/해제' 부분뿐임. 컴파일러가 자동으로 처리하는 생성자/ 소멸자 호출 자체를 막을 수는 없다이 말이 살짝 애매한 부분이 있어 추가 설명을 하보겠습니다. MClass * c = new MClass;void * operator new (size_t size){ //메모리 할당 .... new 나 뭐 malloc 대신 자기 new를 하면 재귀 걸..

프로그래밍/C++ 2025.09.22

20. 연산자 오버로딩

오버로딩 vs 오버라이딩비슷한 용어이지만 완전히 다른 개념입니다!오버로딩은 같은 이름의 함수를 여러개 만드는 기술임. 단 각 함수의 매개변수 목록(개수, 타입,const 여부)는 달라야합니다. 컴파일러가 함수를 호출하는 코드를 보고 어떤 버전을 실행할지 컴파일 시점에 결정합니다.void Print(int x);void Print(double d);void Print(const char* s); //const 도 오버로딩 여부에 포함됨오버라이딩은 상속 관계에서 부모클래스의 가상 함수(virtual)를 자식 클래스에서 똑같은 형태로 다시 만드는것입니다. 부모 클래스 포인터로 자식 객체를 가리킬 때, virtual 함수를 호출하면 실제 객체 타입(자식)의 함수가 호출되도록 하는 동적 다형성의 핵심입니다.연산자..

프로그래밍/C++ 2025.09.22

19. 메서드와 this 포인터

C++의 클래스는 “구조체에 함수를 넣은 것”으로 볼 수 있습니다. 구조체가 데이터를 담는 그릇이라면, 클래스는 데이터 + 행위(함수)를 함께 묶은 것입니다.클래스에 속한 함수는 일반 함수와 달리 메서드(Method)라고 부릅니다.1. 메서드의 분류클래스에 소속된 멤버 함수는 키워드에 따라 성격이 달라집니다.일반 멤버 함수: 객체 단위로 호출되는 기본 메서드static 멤버 함수: 인스턴스와 무관하게 클래스 단위로 호출const 멤버 함수: 내부 상태를 변경하지 않는다는 계약virtual 멤버 함수: 다형성을 위한 가상 함수이처럼 함수가 클래스에 속하는 순간, 그 성격이 단순히 “C 스타일 함수”에서 달라집니다. 2. 접근과 const 메서드클래스 내부에서는 private 멤버에도 접근 가능합니다.하지만..

프로그래밍/C++ 2025.09.12

18. 생성자 다중 정의

C++에서 생성자는 함수입니다. 하지만 일반 함수와 다른 중요한 특징이 있습니다.1. 생성자의 본질반환형이 없다생성자는 객체가 생성될 때 자동으로 호출되는 특별한 함수이므로, 반환값을 가질 수 없습니다.호출 시점을 의식하라명시적으로 호출하는 것이 아니라, 객체가 인스턴스화되는 순간 자동으로 실행됩니다.2. 함수니까 가능한 것들생성자도 함수이므로 오버로딩(다중 정의) 이 가능합니다. 매개변수의 구성(개수, 타입)에 따라 다른 생성자가 호출됩니다.매개변수가 없으면 → 디폴트 생성자복사 생성자, 이동 생성자 역시 같은 원리에서 정의됩니다.class MyData {public: MyData(int nParam) : nData(nParam) {} MyData(int x, int y) : nData(x ..

프로그래밍/C++ 2025.09.12

17. 접근제어 지시자

C 언어는 자유도가 매우 높은 언어입니다. 원래 하드웨어 제어를 목적으로 설계되었기 때문에, 프로그래머가 마음만 먹으면 메모리와 하드웨어 레벨까지 직접 손댈 수 있습니다.하지만 자유도가 높다는 건 버그가 생길 가능성도 함께 올라간다는 뜻입니다. 책임은 고스란히 개발자에게 돌아가죠. “처음부터 결함이 없는 프로그램”은 현실적으로 불가능하기 때문에, 자유도가 높을수록 유지보수는 더 어려워지고 코드 품질은 제각각 흩어지기 쉽습니다.그래서 공동 작업에서는 반드시 규칙이 필요합니다. 이 규칙을 문법 차원에서 강제한 것이 바로 C++의 접근 제어입니다. 접근 제어 지시자: 불편을 감수하고 안정성을 얻다C++에서 클래스를 정의하면, 아무 것도 쓰지 않은 멤버의 기본 접근 권한은 private입니다. 반대로 C의 구조..

카테고리 없음 2025.09.12

16. C++에서 volatile, 그리고 흔한 오해

volatile은 멀티스레드 프로그래밍에서 자주 오해되는 키워드입니다.많은 사람들이 "volatile을 쓰면 동기화(lock) 없이도 된다"라고 착각하지만, 사실은 전혀 그렇지 않습니다.1. volatile의 흔한 착각착각: 코드에 volatile을 붙이면 멀티스레드 동기화가 해결된다.현실: volatile은 race condition(경쟁 상태)을 해결하지 못한다.왜 이런 착각이 생길까요?코드 순서가 눈에 보이는 그대로 실행될 거라 가정"한 스레드가 쓴 값은 다른 스레드가 바로 읽을 수 있다"고 믿음컴파일러 최적화나 CPU 재정렬을 고려하지 않음실제 컴파일러는 릴리즈 빌드에서 최적화를 진행합니다.이 과정에서 내가 작성한 순서와 실제 실행 순서가 달라질 수 있습니다.싱글 스레드 환경이라면 결과만 맞으면 ..

프로그래밍/C++ 2025.09.10

7. 컴파일러의 최적화 이해

1. 컴파일러 최적화란?소스코드의 논리적인 결과는 동일하게 유지하면서, 실행속도를 높이거나 프로그램의 크기를 줄이는 등 더 효율적인 기계어 코드를 생성하는 자동화된 과정을 지칭함컴파일러는 프로그램을 직접 실행해보는 것이 아닌. 다양한 소스코드를 수학적 논리적으로 분석하는 정적 코드 분석 기법을 통해 최적화를 수행함2. 컴파일러의 최적화 과정최적화는 주로 컴파일의 3단계중 중간단계에서 이루어진다.프론트엔드(분석) : 소스 코드를 토큰화 하고 분석하여 컴퓨터가 이해할 수 있는 중간 표현(IR)로 변환함중간 단계( 최적화): 이 중간 표현(IR)을 바탕으로, 아래와 같은 다양한 최적화 기법을 적용하여 코드의 효율성을 개선함백엔드(생성): 최적화된 중간 표현을 실제 목표 CPU에 맞는 기계어 코드로 최종 변환함..

6. 다양한 관점의 메모리

파일이 디스크에 저장된 정적인 구조(EXE 관점)과 프로그램이 메모리에서 실행되는 동적인구조(컴퓨터/프로세스)관점1.실행 파일(EXE)관점의 구조이는 프로그램이 컴파일 된 후 디스크에 저장된 파일(.exe)의 물리적인 구조를 의미함윈도우에서는 이 구조를 PE(Portable Executable)포맷이라고 지칭함실행 파일은 운영체제가 프로그램을 메모리에 올리기 위한 일종의 설명서와 데이터 덩어리들임.text 섹션: 컴파일된 기계어 코드, cpu가 실행할 명령들이 그대로 저장됨data섹션: int g_a =1; 처럼 초기화된 전역 변수나 static 변수의 초기값 데이터가 그대로 들어감, 따라서 초기화된 전역 변수가 많을수록 exe 파일의 크기가 커짐rdata 섹션: const 상수나 “hello word”..

5.CPU와 소프트웨어

1. CPU의 이해: 기계어와 어셈블리어의 본질CPU의 본질: CPU는 우리가 기계어라고 부르는 수백 가지의 간단한 명령어들을 처리하는 디지털 회로입니다. 복잡한 소프트웨어의 모든 동작은 결국 이 간단한 기계어 명령어가 순차적으로 실행되며 이루어집니다. CPU의 내부 구조는 아키텍처(세대)에 따라 다양하게 변화하고 발전합니다.기계어: CPU가 직접 이해하고 실행할 수 있는 언어입니다. 이 명령어들은 숫자로 매핑되어 있습니다.어셈블리어: 기계어를 사람이 이해하기 쉬운 문자 형태(니모닉)로 표현한 것입니다. 어셈블리어는 기계어와 1:1로 대응되는 저수준 언어입니다. C, C++과 같은 고급 프로그래밍 언어로 작성된 소스 코드는 컴파일러를 통해 CPU가 인식하는 기계어로 변환되며, 이 과정에서 어셈블리어 형태..