본문 바로가기
Study/C++

C++ 을 시작하기 앞서 간단한 소개

by 이미뇨 2023. 10. 14.

1. C++이란

C++의 정의와 기본 개념 소개

C++은 C 언어의 확장으로, 객체 지향 프로그래밍과 절차적 프로그래밍을 모두 지원하는 프로그래밍 언어이다.

  • 객체 지향 프로그래밍: 현실 세계의 개념을 프로그램에 반영할 수 있게 해주며, 코드의 재사용성과 유지보수성을 높여준다.
  • 절차적 프로그래밍: 명령어의 집합으로 프로그램을 구성하는 방식으로, 일련의 절차를 따라 순차적으로 실행된다.

C++의 역사와 발전 과정

C++은 1980년대 초에 Bjarne Stroustrup에 의해 개발되었다. 초기에는 C with Classes라는 이름으로 시작했으며, 이후에 C++로 이름이 변경되었다. C++은 지속적인 발전을 거쳐 표준화된 형태로 발표되었고, 현재는 ISO 표준으로 사용되고 있다. 

 

2. C++의 주요 특징들

객체 지향 프로그래밍 (OOP) 

C++은 객체 지향 프로그래밍 (Object-Oriented Programming, OOP)의 핵심 개념을 지원한다. 이는 현실 세계의 엔터티를 모델링하고 프로그램의 구조를 조직화하기 위해 사용된다. 객체 지향 프로그래밍은 클래스(class)와 객체(object)라는 개념을 기반으로 하며, 상속, 캡슐화, 다형성과 같은 특징들을 통해 코드의 재사용성과 유지보수성을 높인다.

 

템플릿과 제네릭 프로그래밍

C++은 템플릿(template)을 통해 제네릭 프로그래밍(generic programming)을 지원한다. 이를 통해 함수나 클래스를 일반화하여 데이터 타입에 독립적으로 작성할 수 있다. 이는 유연한 코드 작성을 가능하게 하며, 컴파일 시간에 타입 안전성(type safety)을 보장한다.

더보기

자 이게 뭔 삽소리냐고? 좀 더 쉽게 설명해주께

템플릿 = 무엇이든 들어가는 상자

암거나 다 넣을수 있음 타입 상관없이.

 

게임을 만든다고 칠때 게임에는 다양한 직군이 있을꺼임 전사, 궁수, 법사 등등,, 그리고 걔네는 각각 다른 무기 갖고 다님. 근데 걔네 무기를 일일이 다 만들순 없자나? 그니까 >>무기<< 라는 템플릿을 만들어서 각 직군(클래스)에 그냥 갖다 붙이는거임. 그리고 무기라는 템플릿이 안에서 칼, 활 이런 데이터를 다룰 때 컴파일러가 타입을 체크하고, 런타임 오류를 방지해줌 그래서 타입 안전성을 보장해줌. 그리고 칼, 활 이렇게 무기 템플릿 안에 속성을 마음대로 바꾸고 그걸 전사, 궁수 이렇게 갖다 붙일수 있는것처럼 유연하게 확장시킬수 있고 더 쉽게 코딩할수 있음

 

다중 상속과 다형성

C++은 다중 상속(multiple inheritance)을 지원한다. 이는 하나의 클래스가 둘 이상의 부모 클래스로부터 상속받을 수 있음을 의미한다. 또한, C++은 다형성(polymorphism)을 지원하여 동일한 인터페이스를 가진 여러 객체가 서로 다르게 동작할 수 있도록 한다. 이는 가상 함수(virtual functions)와 추상 클래스(abstract classes)를 통해 구현된다.

더보기

게임에서 캐릭터를 만들 때, 우리는 여러 가지 특징을 고려해야 된다. 예를 들어, 공격력이나 방어력과 같은 속성이 있고 여기서 다중 상속이란 개념이 들어간다. '전사' 클래스와 '마법사' 클래스, 이 두 클래스는 각각 '전투'와 '마법'이라는 다른 부모 클래스에서 상속을 받을 수 있다. 그럼 '전사'는 전투 기술을, '마법사'는 마법 기술을 각각 상속받을 수 있게 된다. 근데 여기서 마법사가 전투를 할 수 없다는 보장은 없잖아? 마법사는 전투, 마법 둘다 상속을 받을수 있다는거임. (혼종의 마법사)

이제 다형성을 생각해보자. '전사'나 '마법사' 클래스가 같은 '공격' 함수를 가졌다고 생각해보자. 근데 실제로 '전사'는 검을 휘두르고, '마법사'는 주문을 외우잖아? 이렇게 같은 함수명이지만 실제로 호출될 때 객체의 종류에 따라 동작이 달라지는 것이 다형성이다. 이를 구현하기 위해 C++에서는 가상 함수와 추상 클래스를 사용한다.

 

가상 함수는 서브 클래스에서 재정의될 수 있는 함수를 말하고, 추상 클래스는 인스턴스를 생성할 수 없고 상속에만 사용되는 클래스를 의미한다.

이것도 헷갈리지? 밑에를 읽어라

 

가상 함수(virtual functions)란, 게임에서는 캐릭터마다 서로 다른 공격 스킬을 가질 수 있다. 예를 들어, '전사' 클래스의 경우 검을 휘두르는 '공격' 기능이 있고, '마법사' 클래스의 경우 주문을 사용하는 '공격' 기능이 있을 수 있다. 이럴 때, '공격' 함수를 가상 함수로 만들어두면, 각 캐릭터 클래스에서 이 함수를 재정의(override)할 수 있다. 이렇게 하면 실제로 호출될 때 '전사'의 '공격' 함수가 호출되면 검 공격, '마법사'의 경우 주문 공격이 실행된다. 즉, 같은 이름의 함수지만 객체의 종류에 따라 다르게 동작할 수 있는 것이 가상 함수이다.

추상 클래스(abstract classes)란, 추상적인 기능을 가진 클래스로, 직접적으로 객체를 생성할 수 없다. 게임에서 '캐릭터' 클래스가 있다 치자. 이 '캐릭터' 클래스는 실제로 게임 캐릭터를 만들 때 사용되는데, '이동', '공격'과 같은 기능을 정의할 수 있다. 그런데 '이동' 함수는 각 캐릭터마다 구현이 다를 수 있고, 이 함수를 추상 함수로 만들어 추상 클래스로 선언할 수 있다. 이런 추상 클래스를 상속받은 실제 캐릭터 클래스들은 추상 함수를 반드시 구현해야 된다. 그러면 각 캐릭터 클래스는 자신만의 '이동' 방식을 가질 수 있게 된다.

 

예외 처리와 RAII(Resource Acquisition Is Initialization) 원칙

C++은 예외 처리(exception handling)를 지원하여 프로그램 실행 중에 발생할 수 있는 예외 상황을 처리할 수 있게 한다. 또한, RAII(Resource Acquisition Is Initialization) 원칙을 따르는 객체 지향 프로그래밍 스타일은 자원의 효율적인 관리를 가능하게 한다. 예를 들어, 파일 핸들, 메모리 등의 자원을 객체의 생성과 소멸과 연관시켜 자동으로 관리함으로써 안전하고 효율적인 프로그래밍을 가능하게 한다.

 

3.C++의 기본 문법

변수와 데이터 타입

C++에서 변수는 특정한 데이터를 저장하기 위한 메모리 공간의 이름이다. 변수는 선언하고 사용하기 전에 해당하는 데이터 타입을 정의해야 한다. 정수, 실수, 문자, 불리언 등 여러 종류의 데이터 타입이 있으며, 이에 따라 변수의 크기와 형식이 결정된다.

 

연산자와 제어 구조 (조건문, 반복문)

C++은 다양한 수학 및 논리 연산자를 제공하며, 이를 활용하여 계산과 논리적 판단을 수행할 수 있다. 조건문(if 문, switch 문)은 조건에 따라 프로그램의 흐름을 제어하고, 반복문(for 문, while 문, do-while 문)은 특정한 작업을 반복하여 수행할 수 있게 해준다.

 

함수와 매개변수 전달 방식

함수는 일련의 작업을 수행하는 코드 블록이다. C++에서 함수는 함수 이름, 매개변수, 반환 값의 타입, 함수 몸체로 구성됩니다. 함수는 코드의 재사용성을 높이고 프로그램을 모듈화하는 데 사용된다. 매개변수를 통해 함수에 값을 전달하고, 반환 값으로 함수의 결과를 받을 수 있다. 매개변수는 값에 의한 전달과 참조에 의한 전달 두 가지 방식을 지원한다.

 

클래스와 객체의 정의

클래스는 연관된 데이터와 함수의 집합을 의미하며, 객체는 클래스의 인스턴스를 나타낸다. 클래스는 데이터 멤버와 멤버 함수로 구성되며, 객체는 클래스의 인스턴스를 나타내는 변수이다. 클래스와 객체를 사용하여 현실 세계의 엔터티를 모델링하고, 객체 지향 프로그래밍의 주요한 특징 중 하나인 캡슐화를 구현할 수 있다.

 

이 외에도 다양한 기본문법들이 있다.

 

4.C++ 표준 라이브러리

STL (Standard Template Library) 

C++ 표준 라이브러리에는 다양한 자료 구조와 알고리즘 함수들이 포함되어 있다. 이를 통칭하여 STL (Standard Template Library)이라고 부른다. STL은 템플릿을 기반으로 하여, 일반적인 자료 구조와 알고리즘을 제공하며, 이를 사용함으로써 코드 작성과 유지보수가 훨씬 용이해진다.

 

벡터, 리스트, 맵과 같은 자료 구조

STL은 여러 가지 자료 구조를 제공한다. 벡터(vector)는 가변 크기의 배열을 나타내며, 동적으로 크기가 조절될 수 있다. 리스트(list)는 이중 연결 리스트를 기반으로 하며, 원소의 삽입과 삭제가 효율적이다. 맵(map)은 키-값 쌍의 연관 배열을 나타내며, 빠른 검색과 삽입이 가능하다.

 

알고리즘 함수들의 활용

STL은 정렬, 검색, 변환 등 다양한 알고리즘을 구현한 함수들을 제공한다. 이러한 함수들은 범용적으로 사용할 수 있으며, 컨테이너의 데이터를 처리하는 데에 활용된다. 예를 들어, sort() 함수를 사용하여 배열이나 리스트의 원소들을 정렬할 수 있고, find() 함수를 사용하여 특정한 값을 검색할 수 있다. 이러한 알고리즘 함수들은 효율적이면서도 안전한 방식으로 데이터를 처리할 수 있도록 도와준다.

 

C++ 표준 라이브러리는 프로그래머가 자료 구조와 알고리즘을 직접 구현할 필요 없이, 이미 최적화되고 검증된 함수들을 사용하여 더 효율적이고 안전한 코드를 작성할 수 있게 해준다. 이는 프로그래머의 생산성을 향상시키고 복잡한 문제를 해결하는 데에 큰 도움을 준다.

 

5. C++의 응용 분야

게임 개발에서의 활용

C++은 게임 개발에서 광범위하게 사용된다. 게임 엔진(예: Unreal Engine, Unity)은 C++을 기반으로 작성되어 있고, 게임의 핵심 로직, 그래픽 처리, 물리 시뮬레이션 등에 C++을 사용하여 높은 성능과 그래픽 품질을 제공한다. C++의 접근성과 성능은 대규모 및 고성능 게임의 개발에 이상적이다.

 

시스템 소프트웨어와 드라이버 개발

C++은 운영 체제와 하드웨어를 다루는 시스템 소프트웨어와 드라이버 개발에도 널리 사용된다. 시스템 소프트웨어는 운영 체제의 핵심 구성 요소로, 안정성과 성능을 보장해야 한다. C++은 이러한 시스템 소프트웨어의 요구 사항을 충족시키는 데 사용된다. 또한, 하드웨어와 소프트웨어 간의 통신을 담당하는 드라이버 개발에도 C++이 활용된다.

 

임베디드 시스템과의 연관성

임베디드 시스템은 다양한 기기에서 사용되는 특수 목적의 컴퓨터 시스템을 나타낸다. 이러한 시스템은 주로 제한된 자원과 환경에서 동작해야 하므로 효율적인 프로그래밍 언어가 필요하다. C++은 이러한 환경에서도 높은 성능과 다양한 기능을 제공하여, 임베디드 시스템의 소프트웨어 개발에 적합한 언어로 널리 사용된다. 특히 C++의 객체 지향 특성은 복잡한 시스템을 모델링하고 유지보수하기에 용이하게 만들어준다.

 

C++은 이러한 다양한 응용 분야에서 널리 사용되며, 성능유연성을 필요로 하는 프로젝트에서 주로 선택되는 언어 중 하나이다.

 

6. C++ 개발 환경 구축

C++ 컴파일러 선택

C++ 코드를 실행 파일로 변환해주는 컴파일러는 여러 가지가 있다. 대표적인 C++ 컴파일러로는 GCC (GNU Compiler Collection), Clang, Microsoft Visual C++ 등이 있다. 이 중에서 사용하고자 하는 플랫폼과 운영 체제에 맞는 컴파일러를 선택하여 설치할 수 있다.

 

통합 개발 환경 (IDE) 소개

통합 개발 환경(IDE)은 프로그래밍을 위한 편리한 환경을 제공하는 소프트웨어이다. 

 

대표적인 IDE

  • Visual Studio: Microsoft에서 제공하는 풍부한 기능을 가진 IDE로, Windows 환경에서 C++ 개발에 최적화되어 있다.
  • Code::Blocks: 오픈 소스이며 여러 플랫폼에서 사용할 수 있는 가벼운 IDE로, GCC와 호환성이 높다.
  • Eclipse CDT: Eclipse 플랫폼 위에서 동작하는 IDE로, 다양한 플러그인을 통해 확장성이 뛰어나다.
  • CLion: JetBrains에서 개발한 전문적인 C++ IDE로, 코드 분석 및 디버깅 기능이 강력하다.

 

첫 번째 C++ 프로그램 작성하기 (Hello World 예제)

아래는 간단한 Hello World 프로그램의 예제 코드이다. 이 코드를 통해 C++ 개발 환경이 제대로 설정되었는지 확인할 수 있다.

#include

int main() {
std::cout << "Hello, World!" << std::endl;
return 0;
}

 

7. C++ 학습 자료 및 커뮤니티

온라인 자습서와 책 추천

온라인 자습서:

  • cplusplus.com: C++ 기본 문법 및 개념에 대한 튜토리얼과 예제가 있는 웹사이트
  • LearnCpp.com: 초보자부터 중급자까지 다양한 주제를 다루는 무료 C++ 학습 자료를 제공하는 사이트
  • Coursera: 유명 대학의 C++ 강의를 온라인으로 수강할 수 있는 플랫폼

추천 도서:

  • "Accelerated C++" by Andrew Koenig and Barbara E. Moo: C++의 기초부터 심화까지 다루며 실전 예제를 통해 학습할 수 있음
  • "Effective C++" by Scott Meyers: C++ 프로그래머들을 위한 최적화 및 효율적인 코딩 스타일에 대한 통찰을 제공
  • "The C++ Programming Language" by Bjarne Stroustrup: C++ 언어의 창시자인 Bjarne Stroustrup이 직접 쓴 책으로, 언어의 깊이를 이해하고 싶은 독자들을 위한 책

C++ 커뮤니티 및 포럼 소개

  • Stack Overflow: 프로그래밍 관련 질문에 대한 답변을 얻을 수 있는 대표적인 커뮤니티 사이트 C++ 관련 질문도 많이 올라옴
  • Reddit - r/cpp: Reddit의 C++ 커뮤니티. 새로운 기술, 라이브러리, 프로젝트에 대한 토론과 정보 교환이 이루어짐
  • cplusplus.com Forum: cplusplus.com 웹사이트의 공식 포럼으로, C++ 프로그래밍에 관련된 질문과 토론이 이루어짐

 

C++ 개발자로 성장하기 위한 활동

  • 프로젝트 경험 쌓기: 실제 프로젝트에 참여하거나 개인 프로젝트를 진행하면서 실무 경험을 쌓자
  • 다양한 자료 읽기: 여러 책이나 온라인 자료를 통해 다양한 관점에서 C++을 학습하고, 실무에서 활용할 수 있는 다양한 기술들을 익히자
  • 코드 리뷰와 협업: 다른 개발자들의 코드를 읽고, 내 코드를 다른 사람에게 리뷰 받으며 피드백을 통해 더 나은 코드를 작성하는 능력을 기르자
  • 커뮤니티 참여: 온라인 포럼이나 오픈 소스 프로젝트에 참여하여 다른 개발자들과 소통하고, 지식을 공유하자
  • 지속적인 학습: C++은 끊임없이 발전하는 언어다. 새로운 기능과 트렌드를 파악하고 적용하자

 

마치며

C++은 프로그래밍 커뮤니티에서 수십 년간 꾸준한 인기를 유지하며 강력한 프로그래밍 언어이다. 또한, 코딩 테스트를 준비하기에 아주 좋은 언어이다. 높은 성능과 다양한 기능을 제공하며 다양한 응용 분야에서도 활용할 수도 있다.
프로그래밍을 시작하거나 C++ 스킬을 향상시키고자 하는 우리에게는 지속적인 학습과 프로젝트 경험이 매우 중요하다. C++ 커뮤니티와 다양한 학습 자료들을 활용하여 지식을 쌓고, 실무에서 경험을 통해 실력을 향상시키자. 지금 당장 C++에 대해 완벽하게 알지 못한다고 해서 실망할 필요는 없다. 오히려 지금의 자신에 만족하지 않고 더 나은 프로그래머로 성장해 나가기 위해 노력하자. 나 또한 같이 공부하며 성장하고 있다. 지금은 잘 모르더라도 미래의 자신을 상상하며 오늘도 한 줄이라도 더 코드를 작성해보자

C++을 통해 무한한 프로그래밍 가능성을 탐험하며, 미래의 코드 세계를 함께 창조해 나가자. 모두 행운을 빈다! 😊✨