객체지향프로그래밍(1) - Welcome to C++

객체지향프로그래밍을 위한 간단한 C++ 요약

Featured image

오늘부터 프로그래밍의 새로운 패러다임인 객체지향 프로그래밍(Object Oriented Programming)에 대해 배워보겠다.

그 전에 간단한 C++에 기본적인 문법을 다루어보겠다.

⚠️ 이 강의는 C언어의 기본 문법에 대해 안다는 전제하에 진행된다. 만약 C언어의 기본 문법을 잘 모른다면 C언어 강의 시리즈C언어 동적 할당을 미리 공부하고 오는 것을 추천한다.

그럼 C 언어와 C++ 언어의 주요 문법을 비교하며 공부해보겠다.


1. 전체적인 틀

// C언어
#include<stdio.h>
#define MAX 100

int arr[MAX];

void foo(){
    arr[0] = 1;
}

int main(){
    // 원하는 코드
}
// C++
#include<iostream>
#define MAX 100

int arr[MAX];

void foo(){
    arr[0] = 1;
}

int main(){
    // 원하는 코드
}

전체적인 틀은 거의 비슷하다.

C언어에서 가능한 전처리, 전역변수 설정, 함수 선언 등은 모두 C++에서 가능하다.

C에서는 표준 라이브러리든 사용자가 만든 라이브러리든 .h 확장자를 통해 include 했으나, C++에서는 표준 라이브러리는 .h를 붙이지 않아도 include 가능하다.

위의 코드처럼 iostream.h에서 h를 생략한 것처럼 말이다.

또한, C언어에서 사용 가능한 표준 라이브러리는 모두 C++에서도 include 가능하다. (math.h -> cmath, string.h -> cstring으로 c를 붙여서 include 가능)


2. 자료형과 입출력

우리가 다룬 기본 자료형으로는 정수형, 실수형, 문자형이 있었으며 조금 확장해서 문자열까지 다루었었다.

stdio.h에 포함된 scanfprintf를 보통 입출력에 사용했었고, 이름에 맞게 각각은 %d, %lf, %c, %s 등으로 formatting 해줘야 했다.

주의할 점으로는 각각의 format을 맞추지 않으면 원하지 않는 값이 입력되거나 출력될 수 있었다.

C++의 경우에는 iostream에 포함된 std::cinstd::cout을 입출력으로 사용한다. (물론 C언어에서 사용되는 scanf, printf도 여전히 사용할 수 있다.)

그리고 개행문자 ‘\n’ 대신 std::endl을 써서 줄 바꿈을 할 수도 있다.

여기서 혁신적인 기술이 나오는데, formatting 없이 «»로 입력과 출력을 할 수 있다. (여기서 «, »는 비트 연산자와 무관하다.)

또한, 문자열을 전문으로 다루기 위한 std::string이라는 자료형이 추가된다.

정확히는 자료형이 아니라 객체라는 개념이지만, 큰 틀에서 자료형이라고 생각하고 넘어가도 무방하다.

std::string은 C언어의 문자열과는 다르게 문자열끼리, 문자형 변수와 덧셈 연산도 가능한데, 아래와 같은 코드가 가능하다.


3. 조건문, 반복문

C에서 조건문으로 if, else if, else 혹은 switch를 썼었는데, 위와 같이 모두 C++에서도 가능하다.

반복문도 for, while을 통한 방식 모두 C++에서 사용할 수 있다.

4. 동적 할당

C언어에서는 malloc, realloc 등을 이용해서 할당, 재할당을 하고 free를 이용해서 할당해제를 했었다.

C++에서는 newdelete라는 함수를 이용해서 할당, 할당해제를 한다.

C++에서는 재할당 대신 new로 새로 만드는 것을 권장하므로, 번거롭더라도 새로운 메모리를 new로 할당하고 기존의 값을 복사한 후 delete로 해제해주면 된다.

new 자료형
// 자료형에 대한 크기만큼 동적 할당해서 그 포인터를 반환(당연히 구조체, 공용체도 가능)
// 배열의 경우 자료형[]으로 해주면 됨

delete 포인터변수
// 그 포인터에 할당된 메모리를 해제
// 배열의 경우 delete[] 포인터 변수를 해주면 됨

📖 오늘의 핵심(다 알기 전까지는 넘어가지 말자❗)

✅ 1. C++의 기본 문법에 익숙해지자.

✅ 2. iostream, std::cin, std::cout에 익숙해지자.

✅ 3. 이제는 malloc, realloc, free 대신 new, delete에 익숙해지자.

⚠️ C++에서는 웬만하면 문자열을 std::string을 쓰도록 하자, 버퍼 오버플로우도 막을 수 있고 훨씬 안전하다.

💣 과제,

  1. +, -, /, *와 숫자 2개를 입력받아 값을 계산하는 계산기를 C++ 구현해보자(난이도 下)

  2. C++ BST를 구현해보자(난이도 中) (BST가 무엇인지 모르겠다면?)

🔜 더 공부해보기,

읽어볼 거리(1) - malloc/realloc/free 대신 new와 delete를 고려하게 된 이유(C 포인터의 취약점)