본문 바로가기
반응형

언어68

CMake vs Makefile CMake와 Makefile의 차이점과 선택 기준CMake와 Makefile은 모두 소프트웨어 개발에서 반복적인 빌드 작업을 자동화하는 데 사용됨CMake는 빌드 스크립트를 자동으로 생성해주는 “메타 빌드 시스템”, Makefile은 빌드 과정을 직접 정의하는 “전통적인 빌드 스크립트”프로젝트 규모, 협업 환경, 지원하는 플랫폼/IDE 등에 따라 두 도구의 선택이 달라질 수 있음아래에서는 CMake와 Makefile의 개념, 특징, 주요 사용 사례, 그리고 장단점을 비교📝 CMake vs Makefile의 기본 개념CMakeCMake는 크로스 플랫폼 빌드 자동화 도구 생성기사용자가 작성한 CMakeLists.txt를 바탕으로, 각 운영체제와 IDE에 맞는 빌드 파일(예: Makefile, Visual .. 2025. 7. 12.
CMake 정리 CMake란 무엇이며, 왜 사용하는가?CMake는 다양한 플랫폼에서 사용할 수 있는 빌드 자동화 도구 생성기(Build System Generator)직접 소스를 빌드하지 않고, 각 환경에 맞는 빌드 스크립트(Makefile, Visual Studio Project 등)를 자동으로 만들어줌C/C++ 프로젝트를 비롯한 여러 언어에서 널리 쓰이며, 크로스 플랫폼(Windows, Linux, macOS) 개발 환경에 매우 유리아래에서는 CMake가 무엇인지, 그리고 왜 개발에서 자주 사용되는지 살펴봄📝 CMake의 기본 개념1. CMake는 소스코드 빌드를 자동화하기 위한 도구2. 프로그래머가 직접 Makefile이나 프로젝트 파일을 일일이 작성하는 대신, CMake 설정 파일(CMakeLists.txt)만.. 2025. 7. 11.
Makefile 정리 Makefile이란 무엇이며, 왜 사용하는가?Makefile은 소프트웨어 프로젝트의 빌드 자동화를 위해 사용하는 파일주로 make라는 빌드 도구와 함께 사용되며, 컴파일, 링크, 테스트, 배포 등 반복 작업을 자동으로 처리C, C++ 등 컴파일 언어에서 가장 오래되고 널리 쓰이는 빌드 시스템아래에서는 Makefile의 개념과 주요 사용 이유에 대해 살펴봄📝 Makefile의 기본 개념1. Makefile은 반복적인 개발 작업(빌드, 테스트, 설치 등)을 자동화하는 데 사용2. 프로젝트 내의 파일 의존성과 빌드 명령어를 명시적으로 지정해 줌3. 대형 프로젝트에서 소스 파일이 많아질 때 관리가 훨씬 용이해짐Make: 유닉스 계열 시스템에서 널리 사용되는 빌드 자동화 도구Makefile: make가 읽어서 .. 2025. 7. 10.
메모리 영역 정리 Stack, Heap, .bss, .data, .rodata, .text 정리1. C/C++에서 프로그램이 실행될 때 사용하는 각 메모리 영역에 대한 자세하고 실무 중심의 설명2. MCU(STM32) 같은 임베디드 환경에서도 적용되는 구조이며, 예시도 함께 포함✅ 전체 메모리 구조 요약| 주소 ↑ || Stack || Heap || .bss || .data || .rodata || .text || 주소 ↓ |1. .text (텍스트 영역 / 코드 영역)📌 용도함수, 클래스 메서드 등 실행 코드가 위치ROM/Flash에 저장되며 읽기 전용📌 특징수정 불가 (const)함수 포인터도 여기 주소를 가리킴📌 예.. 2025. 6. 19.
RAII(Resource Acquisition Is Initialization) RAII란?C++에서 리소스(자원)를 객체의 수명에 따라 자동으로 관리하는 디자인 패턴✅ 핵심 개념"자원을 획득하는 순간이 초기화", 그리고 "소멸자가 자원을 자동으로 정리"객체가 생성될 때 자원을 획득 (파일, 메모리, 락, 핸들 등)객체가 소멸될 때 소멸자에서 자원을 자동 해제✅ 대표 예시1. std::lock_guard (뮤텍스 자동 해제)std::mutex mtx;void criticalSection() { std::lock_guard lock(mtx); // 🔒 mutex 획득 // ... 임계영역 ...} // 🔓 자동으로 mutex 해제 2. std::unique_ptr (메모리 자동 해제)std::unique_ptr ptr(new int(42)); // 메모리 할당// ptr은.. 2025. 6. 16.
[c++] 생성자 선언 임베디드 시스템에서 생성자 선언1. PanelController()라는 예를 들어 아래 3가지 선언방식이 존재2. PanelController();, explicit PanelController();, 아예 생성자를 선언하지 않을 때3. 이 세 가지 케이스는 C++에서 기본 생성자의 자동 생성 여부와 객체 초기화의 유연성에 큰 영향을 줌✅ 1. 선언 방식별 정리선언 방식설명암시적 생성 가능 여부생성자 자동 생성 여부의미없음생성자를 아예 선언 안 함가능 (단, 조건 있음)클래스에 조건 충족 시 자동 생성가장 일반적인 방식. 단, 다른 생성자나 멤버가 있으면 안 생길 수도 있음PanelController();명시적 기본 생성자 선언가능❌ 직접 선언했으므로 자동 생성 안 됨명확하게 기본 생성자를 제공할 때 사.. 2025. 6. 14.
[c++] explicit 키워드 explicit 키워드 정리1. explicit 키워드는 C++에서 암시적(implicit) 형변환을 막기 위한 키워드2. 주로 생성자(constructor)나 변환 생성자(converting constructor)에 사용되어, 의도하지 않은 자동 형 변환을 방지함✅ 기본 문법class MyClass {public: explicit MyClass(int value); // explicit 생성자};✅ 왜 쓰는가? (자동 형변환 방지)예시 1: 암시적 변환이 허용되는 경우 (explicit 없음)class MyClass {public: MyClass(int value) {} // 암시적 변환 허용};void doSomething(MyClass obj) {}doSomething(10); // int.. 2025. 6. 13.
Interface vs concept Interface와 concept 비교C++의 interface(추상 클래스 기반)와 concept(C++20부터 도입된 템플릿 제약 방식)은 둘 다 다형성과 제약 조건 구현에 사용되지만, 목적, 사용 시점, 처리 방식이 완전히 다름✅ 기본 개념 비교항목interface (추상 클래스)concept (C++20)정의 방식순수 가상 함수(pure virtual function)를 가진 클래스template 타입에 대한 조건을 정의하는 선언식 구문사용 목적런타임 다형성 (Virtual Dispatch)컴파일타임 제약 (Type Constraints)다형성OOP 기반 다형성 (virtual 함수 호출)정적 다형성 (template 기반, 컴파일 시 결정)상속 필요 여부상속을 통해 구현 클래스가 interfac.. 2025. 6. 4.
[c++] concept conceptconcept은 템플릿 타입이 만족해야 하는 조건의 집합기존에는 SFINAE나 enable_if로 구현하던 제약 조건을 더 간결하고 선언적으로 작성 가능✅ 필요성템플릿에서 에러 메시지는 복잡하고 난해 예전 방식templatevoid print(T t) { std::cout C++20에서 concept 사용templateconcept HasSize = requires(T t) { { t.size() } -> std::convertible_to;};templatevoid print(T t) { std::cout → T가 size()를 제공하지 않으면, 친절한 컴파일 오류 메시지 발생✅ 기본 문법1. requires 표현식 기반 정의templateconcept Incrementab.. 2025. 6. 3.
메모리 누수 ✅ 메모리 누수할당한 메모리(힙 메모리)를 해제하지 않아서 다시 사용할 수 없는 상태로 남아 있는 것💥 결과프로그램 종료 전까지 RAM 점유반복되면 메모리 부족, 시스템 느려짐, 크래시 발생✅ 어떤 경우에 발생하나?1. delete를 호출하지 않은 경우void createLeak() { int* ptr = new int(10); // delete ptr; ❌ 안 했음}ptr은 지역 변수로 함수 종료 시 사라지지만, new로 할당된 메모리는 남음2. 포인터가 덮어써질 때int* ptr = new int(5);ptr = new int(10); // 이전에 할당한 5는 참조할 방법이 없어짐 ❌ 메모리 누수3. 예외가 발생했는데 해제를 못했을 때void risky() { int* ptr = n.. 2025. 6. 2.
반응형