> For the complete documentation index, see [llms.txt](https://byulseop-til.gitbook.io/sinheeseop_til/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://byulseop-til.gitbook.io/sinheeseop_til/c++/101/cpp_overview_and_history.md).

# OverviewAndHistory

### 1. C++ 개요 및 역사

#### 개요

* \*\*C++\*\*는 C 언어를 기반으로 발전된 프로그래밍 언어로, **객체 지향 프로그래밍(OOP)**, **제네릭 프로그래밍(템플릿)**, 그리고 **저수준 메모리 제어** 기능을 제공합니다.
* **다양한 패러다임**: 절차지향, 객체지향, 함수형 프로그래밍 등 여러 패러다임을 지원하여 유연한 소프트웨어 개발이 가능합니다.

#### 역사

* **초기 배경**: 1979년, Bjarne Stroustrup가 AT\&T Bell Labs에서 C의 한계를 극복하고자 시작
  * C 의 한계란? : 객체지향 부족, 추상화 및 캡슐화 부족, 제네릭 부재, 예외처리 매커니즘 부재 등
* **"C with Classes"**: 1980년대 초, C++의 전신으로 등장 – 클래스와 객체 개념 도입
* **표준화**:
  * **C++98/C++03**: 최초의 국제 표준이 마련됨
  * **C++11**: 람다, auto, nullptr 등 현대적 기능 도입
  * **C++14/C++17/C++20**: 점진적 개선 및 새로운 기능(코루틴, 모듈 등) 추가
* **현재**: 성능과 유연성이 중요한 분야에서 꾸준히 사용되며, 다양한 산업 분야에 적용됨

### 2. C++의 장단점

#### 장점

* **성능 최적화**:
  * **저수준 메모리 제어**를 통해 하드웨어에 가까운 프로그래밍이 가능하여, 성능-critical한 애플리케이션에 적합
  * 컴파일 시점의 최적화가 잘 이루어짐
    * 정적 타입 정보 활용, 인라인 함수와 템플릿, 상수 표현식 및 constexpr, 컴파일러 최적화 기법
* **다양한 프로그래밍 패러다임**:
  * 절차적, 객체 지향, 제네릭, 함수형 프로그래밍을 모두 지원
  * 유연한 코드 작성 및 재사용성 증대
* **풍부한 표준 라이브러리 (STL)**:
  * 컨테이너, 알고리즘, 반복자 등 다양한 도구 제공
* **광범위한 사용처**:
  * 게임 개발, 시스템 프로그래밍, 금융 시스템, 임베디드 시스템 등 다양한 분야에서 사용됨

#### 단점

* **복잡한 문법**:
  * 언어가 매우 방대하고 복잡하여, 초보자에게 진입 장벽이 높을 수 있음
* **메모리 관리의 어려움**:
  * 직접 메모리 할당과 해제를 관리해야 할 때가 많아 실수(메모리 누수, 댕글링 포인터) 위험이 있음
  * 최근에는 스마트 포인터 등 도구가 있지만, 여전히 주의가 필요함
* **컴파일 시간**:
  * 템플릿과 복잡한 코드 때문에 컴파일 시간이 길어질 수 있음

### 3. C와 Java와의 차이점

#### C와의 차이

* **객체 지향 프로그래밍**:
  * C는 **절차적** 언어이며 함수 중심 프로그래밍을 하지만, C++는 클래스와 객체를 사용하여 **객체 지향** 프로그래밍을 지원
* **템플릿**:
  * C++는 템플릿을 통해 제네릭 프로그래밍을 지원하여, 코드 재사용과 타입 안전성을 높임
* **표준 라이브러리(STL)**:
  * C++는 STL을 제공하여 다양한 자료구조와 알고리즘을 손쉽게 사용할 수 있음
* **네임스페이스**:
  * C++는 네임스페이스를 통해 이름 충돌 문제를 해결

#### Java와의 차이

* **메모리 관리**:
  * Java는 **가비지 컬렉션**을 통해 자동 메모리 관리를 하지만, C++는 **직접 메모리 관리**(new/delete)를 요구하여 더 많은 제어권과 책임이 따름
* **실행 환경**:
  * Java는 **JVM 위**에서 실행되어 플랫폼 독립적인 반면, C++는 **네이티브 코드**로 컴파일되어 운영체제 및 하드웨어에 더 밀접함
* **다중 상속**:
  * C++는 클래스의 다중 상속을 지원하지만, Java는 인터페이스를 통해 다중 상속 효과를 내는 방식(다중 구현)을 사용
* **성능**:
  * C++는 네이티브 코드 실행 덕분에 Java보다 **더 높은 성능**과 **낮은 레이턴시**를 제공하는 경우가 많음
* **언어의 특성**:
  * C++는 **저수준 하드웨어 제어**와 고성능 애플리케이션에 적합한 반면, Java는 **비즈니스 애플리케이션**과 웹/모바일 애플리케이션에 널리 사용됨

### 4. C++를 배우는 이유 및 주요 사용 분야

#### 왜 C++를 배우는가?

* **고성능 애플리케이션 개발**:
  * 실시간 시스템, 게임 엔진, 금융 거래 시스템, 임베디드 시스템 등 성능이 중요한 분야에서 C++는 최적의 선택
* **시스템 레벨 프로그래밍**:
  * 운영체제, 드라이버, 네트워크 스택 등 하드웨어와 밀접한 소프트웨어 개발에 필수적
* **유연성과 확장성**:
  * 다양한 프로그래밍 패러다임 지원과 템플릿, STL 등의 강력한 도구들을 통해 복잡한 소프트웨어를 효율적으로 개발할 수 있음
* **산업계의 광범위한 활용**:
  * C++는 오랜 기간 동안 검증된 언어로, 많은 기존 코드베이스와 대규모 프로젝트에서 계속 사용되고 있음

#### 주로 어디에 쓰이는가?

* **게임 개발**:
  * 높은 성능과 실시간 처리가 요구되는 게임 엔진(예: Unreal Engine)
* **시스템 소프트웨어**:
  * 운영체제, 드라이버, 네트워크 프로토콜 구현 등
* **금융 및 고빈도 거래 시스템**:
  * 미세한 지연 시간과 높은 처리량이 요구되는 시스템
* **임베디드 시스템 및 IoT**:
  * 자원이 제한된 환경에서 효율적인 메모리 및 성능 제어가 필요한 경우
* **과학 및 공학 시뮬레이션**:
  * 복잡한 수치 계산과 시뮬레이션을 요구하는 애플리케이션

### 5. 학습하면서 기억해야 할 중요한 포인트

* **성능과 제어**:

  C++는 고성능 애플리케이션 개발에 최적화되어 있으며, 개발자가 메모리와 하드웨어 자원을 세밀하게 제어할 수 있다는 점을 항상 기억하세요.
* **복잡성 관리**:

  방대한 기능과 복잡한 문법으로 인해 초기 진입 장벽이 높을 수 있지만, 기초를 탄탄히 하고 단계별로 학습하면 충분히 극복할 수 있습니다.
* **다양한 프로그래밍 패러다임**:

  C++는 객체 지향, 절차적, 제네릭, 함수형 등 다양한 패러다임을 지원합니다. 상황에 맞게 적절한 패러다임을 선택하여 문제를 해결하는 능력을 기르세요.
* **안전한 메모리 관리**:

  직접 메모리 관리가 필요한 만큼, 메모리 누수, 댕글링 포인터 등과 같은 오류를 예방하는 습관을 반드시 들이세요. 스마트 포인터 등의 현대적 도구 활용을 고려하세요.
* **광범위한 활용성**:

  C++는 게임, 시스템, 금융, 임베디드 등 다양한 분야에 사용됩니다. 따라서 여러분의 학습이 곧 여러 산업에서의 전문성으로 이어질 수 있음을 인식하세요.
