[Rookiss C++] C++을 시작하기 전에 알아두면 좋은 것

황교선·2023년 3월 11일
0

cpp

목록 보기
1/19

나는 기존에 학교에서 C++ 수업을 듣기도 했고, 혼자 대충 공부하기도 했지만 C언어에서 추가된 개념들을 똑바로 학습하지 않았기 때문에 많이 부족하다고 느꼈다. 언리얼 엔진에서 C++을 사용하기도 하고, 최근에 언어에 대해 제대로 학습해두고 엔진을 만지지 않으면 안될 것 같아, 제대로 공부하기 위해서 돈 내고 강의를 듣고 있다.

강의가 전체적인 흐름은 다른 강의와 비슷했지만, 강의의 세부적인 내용에 대해서 설명의 순서나 보충자료가 부족하다고 느껴졌지만, 강사님이 현업자이기 때문에 회사에서의 경험을 곁들어 설명해주는 것이 좋다고 느꼈다. 그래서 수업의 대상자는 다른 언어나, C++에 대해서 어느정도 알고 있는 나같은 사람들이 들으면 좋다고 생각된다. 어쨌든 기록으로 남기며 복습의 효과를 강화할 목적으로, 강의를 듣는 도중 보충 설명하면 좋을 것 같은 내용들이 많다고 생각해서 블로그에 추가 내용을 적으며 글을 써볼 것이다.

수많은 프로그래밍 언어 중 굳이 C++를 선택해야할까?

물론 내 블로그는 Rookiss 게임 개발 태그로 되어서 게임 개발 쪽으로 유입되어 읽는 사람들이 많겠지만,
무턱대고 프로그래밍을 시작하는 사람들을 위해서 질문을 해본다.

내가 과연 이 언어를 배워야만하는 이유가 있을까?

  • 단지 근본 언어라서?
  • 성능이 좋아서?
  • 주위에서 이 언어를 배워서?

타인의 의견, 주위에서 들은 내용이 나의 환경에 꼭 맞는다는 보장이 없다.

내가 현재 목표하는 기업, 내가 목표하는 분야, 자유롭게 사용하고 싶은 툴에 따라서 배우기에 적합한 언어가 달라진다. 예를들어 데이터 사이언티스트가 되고 싶다면 이 분야로 활성화되어 많은 라이브러리나 인터넷 자료 등이 있는 파이썬을 선택하는 것이 좋을 것이다. *앱을 개발하고 싶다면 안드로이드 개발에 쓰이는 코틀린이나 iOS에 쓰이는 스위프트를 배우는 것이 좋을 것이다.

물론 C++를 배우면 포인터를 배우기 때문에 컴퓨터 동작에 대해서 많은 이해를 하게 되어서 좋다. 그리고 많이 쓰이는 대부분의 컴퓨터 언어의 추상적인 개념은 동일하게 사용하기에 다른 언어를 배울 때에도 수월하다. 굳이 포인터를 이해하지 않아도 되는 분야거나, 언어 공통의 추상적인 개념을 이해하기 위해서 걸리는 시간 비용이나, 결국에 내가 필요로 하는 툴의 언어를 재학습을 해야하는 시간을 고려하면 첫 언어를 잘 선택하는 것이 좋아보인다.

*무조건 안드로이드에는 코틀린만 쓰이는 것도 아니고, iOS에는 스위프트만 쓰이는 것이 아니지만 이 각각이 모바일 진영의 기반 언어이다. 그래서 자료나 성능면에서도 좋다. 최근에 안드로이드와 iOS를 포함한 대부분의 플랫폼(Windows, macOS, Linux, Web 포함)을 한 코드 베이스로 한 번에 만들 수 있는 플러터(크로스플랫폼 프레임워크)가 뜨고 있긴 하지만 각 플랫폼의 고유 기능을 사용하기 위해서는 어차피 개별로 코딩해야한다. 아이폰의 기능이라면 swift 코드를 짜야한다. 또한 대기업에서도 그런 고유 기능 이유 때문도 있고, 인력을 뽑는데 필요한 자원도 넉넉하기 때문에 안드로이드 개발자, 아이폰 개발자, 웹 개발자 등을 따로 뽑으면 된다.

C 뒤에 ++의 의미

C 계열 언어에서 "++"라는 것은 “하나를 더한다”라는 의미

C언어를 한 단계 더 업그레이드 시킨다는 느낌으로 보면 될 것 같다.

자세

공부하다가 막힐 때의 자세

“프로그래밍은 혼자하는 것이다”라는 말에 되게 공감한다. 하지만 모르는 것이 나올 때 혼자하고 있더라도, 근처에 누군가가 있더라도 질문하는 방법에 대해 미리 알아두어야 나 자신에게 올바른 습관이 생기고, 개발자 문화에 올바른 문화가 조성이 된다. 내가 직접 질문을 하지 않더라도 과거에 누군가 인터넷에 질문해둔 것을 참고하여 해결을 할 수 있다. 이는 다음 아래 세 개에 대략적으로 적혀있다.

좀 더 올바른 공부 자세

  1. 강의나 책에서 제공되는 코드가 있다고 하더라도 쓰지 않는다.
  2. 강의나 책에 있는 코드를 아무 생각없이 옮겨적지 않도록 한다.

그럼 어떻게 해야하나?

코드를 그냥 복사하는 것은 그 개념이 본인의 것으로 만들어지지 않는다.

  1. 타이핑이 하나 틀려서 몇 분, 몇 십분 헤매보기도 하고, 변수에 입력을 잘못해서 고생하는 습관을 길러야 성장한다고 생각한다. 나는 분명 제대로 옮겨친 것 같은데 안 되면 본인의 눈으로 찾아내는 힘을 길러야 나중에 금방금방 찾아낸다.(물론 가끔은 헤맨다 ㅋㅋ..)

  2. 머릿속에 컴퓨터가 있다는 마인드로 머릿속에서 시뮬레이션을 돌려보며 실제 결과와 일치하는지를 맞춰볼 것을 추천한다. 예를들면 반복문에서 한 변수가 어떻게 값이 바뀔지를 생각해보고 실제 결과와 맞는지를 확인해본다. 만약 나의 예상과 다르다거나, 반복문 안에서의 실제 값의 변화가 궁금하다면 *Breakpoint를 찍어서 한 단계씩 실행하며 디버깅을 해보는 습관을 기르는 것이 좋다.

    *개인적으로 VS Code라는 개발환경을 선호하지만 처음 배우는 입장이라면 Visual Studio Community를 사용하는게 초기 개발 세팅이나, 저런 디버깅 환경에 대해서 추가적인 일을 하지 않아도 되기 때문에 좋다.

  3. 각 개념에 대해 궁금한 것이 있으면 직접 코딩을 해본다.

    예) 2중 for문에서 break를 하면 바깥 for문까지 나가게 되나? 안쪽 for문만 나가게 되나?

그 외의 성장하는 자세

오리지널스라는 책에서 이런 문장이 나온다. 인상 깊어서 따로 적어뒀었다.

웹브라우저로 파이어폭스나 크롬을 사용한 직원들이 인터넷 익스플로러나 사파리를 사용한 사람들보다 재직 기간이 15% 더 길었다.

단지 선호하는 브라우저의 차이가 아니다. 마음에 들지 않는 상황에 맞닥뜨리면 상황을 바로잡고 자신이 처한 상황을 주도적으로 개선하는 사람인지 아닌지를 판단하는데 사용된 것이다. 윈도우에 내장된 인터넷 브라우저인 익스플로러를 그대로 사용하는 사람과 그 익스플로러의 기능이 부족하다고 판단하여 더 나은 방법을 찾아 크롬을 이용하는, 자신이 처한 환경에서 더 나은 무언가가 있을지를 고민하는 것의 차이다.

이 사례처럼 불편함이 있는 상황에서 이를 해결하려는 자세가 되어있는지가 중요하다고 생각하다. 자주 쓰는 기능의 단축키를 외우지 않아서 마우스 커서를 몇 번 옮겨서 해야 하는 불편함 때문에, 단축키가 무엇인지 찾게 되는 것부터 시작하여 자신이 배워야하는 것을 어떻게 효율적으로 배울지 등 능동적인 자세를 만들도록 노력하자.

프로그램

프로그래밍은 프로그램을 만드는 작업을 말한다

프로그램이 만들어지는 과정

  1. 소스 파일의 작성
    • 에디터를 사용하여 C++ 문법에 맞게 코딩한다.
  2. 선행처리기에 의한 선행처리
    • 전처리기 지시문 : 숫자 기호(#)로 시작하는 키워드(ex. #include, #define, #if 등)
  3. 컴파일러에 의한 컴파일
    • 컴퓨터는 0과 1로 이루어진 이진수로 작성된 기계어만을 이해할 수 있다
    • 소스 파일은 C++ 언어로 되어 있기 때문에 컴퓨터가 이해할 수 없다
    • 소스 파일을 컴퓨터가 이해할 수 있는 기계어로 변환해야하는 데 이 작업을 컴파일이라 한다
  4. 링커에 의한 링크
    • 하나 이상의 오브젝트 파일과 라이브러리 파일, 시동 코드 등을 합쳐 하나의 파일로 만드는 작업
  5. 실행 파일의 생성
    • 위의 과정을 거쳐 .exe 파일을 만든다.

“Hello World” 출력하는 프로그램 구조

프로그램의 코드는 맨 위에서부터 한 줄씩 실행된다

우선 프로그램의 구조를 보기 전에 프로그램 코드는 맨 위에서부터 한줄 한줄 실행된다 라는 것을 알아야한다.

나는 절차지향언어인 C언어에서는 한 줄씩 실행된다는 말이 이해가 잘 됐었다. 근데 객체지향언어라 하는 언어들이 “객체”라는 것들의 상태 변화에 따라서 프로그램이 실행된다는 말을 들었을 때는 좀처럼 이해가 가지 않았다. 겉보기에는 C언어랑 비슷했고 객체의 변화를 주는 것이 뭔가 한 줄씩 실행되는 느낌이 아닌 것 같아보였다. 결국에는 객체지향언어도 맨 위에서부터 차례대로 실행이 되면서, 객체의 상태에 변화를 줘가며 한 줄씩 실행되는 것은 동일하다.

“Hello World” 프로그램

#include <iostream>
using namespace std;

int main()
{
		cout << "Hello World\n";
		return 0;
}

이제 이 간단한 프로그램에 대해서 위의 규칙(한 줄씩 실행된다)를 따라서 해석을 해봅시다.

  1. iostream은 입/출력을 수행하기 위한 헤더로 이 프로그램에서 입출력을 사용하기 위해 선언한다.
  2. std라는 namespace에 있는 것들을 이 프로그램에서 스코프 연산자(::)를 이용하지 않고 사용한다.
    1. using namespace std를 선언하지 않고 cout을 사용하고 싶으면 std::cout 와 같이 사용해야한다.
    2. std 외의 다른 네임스페이스도 동일하게 선언하여 사용할 수 있다.
    3. ;(세미콜론)은 문장의 끝을 의미하고 꼭 써주어야한다.
      1. 함수의 끝은 브라켓으로 명확하기 때문에 세미콜론을 써주지 않는다.
  3. int 값을 반환하는 main 함수를 정의한다.
    1. main 함수는 모든 프로그램의 진입 함수로써 호출을 하지 않아도 알아서 실행된다.
    2. 정의와 선언, 호출 이 세가지 단어는 다 다릅니다.
      1. 정의 : 함수가 어떤 작업을 하고, 어떤 것을 반환할지를 정의하는 것
      2. 선언 : 어떤 함수가 다른 함수를 사용하기 전에 다른 함수라는 것이 있다는 것을 미리 컴파일러에게 정보를 제공하는 것
      3. 호출 : 정의한 함수를 원하는 위치에 적어서 실행하는 것
  4. “Hello World\n” 를 cout을 이용하여 화면에 출력한다.
    1. cout은 출력을 해주는 개체입니다. << 연산자를 통해 원하는 것을 출력한다.
    2. 문자열(단어나 문장, 문단 등)을 출력하기 위해선 “ “로 감싸주어야한다.
    3. \n은 개행 문자로 줄바꿈 역할을 해준다.
    4. 여기에도 역시 문장의 끝인 ; 이 달려있다.
  5. 0을 함수의 반환 값으로 사용한다는 의미이다.
    1. 여기에도 역시 문장의 끝인 ; 이 달려있다.

마치며

처음에 보는 사람이 이해하지 못할 내용이 좀 있긴하지만 이해하지 못한 부분이 있다 하더라도 나중에 자세하게 설명하는 내용들이니 넘어가도 좋다.


참고한 글

profile
성장과 성공, 그 사이 어딘가

0개의 댓글