Coding/Unreal, C++

[C++ Primer Plus] 1. Getting Started with C++

출처: C++ Primer Plus 6th Edition Chapter 1

대답해야 하는 질문들

  • C와 C++의 역사를 간략히 설명하세요.
  • Procedural Programming과 Object Oriented Programming을 비교하세요.
  • C++가 어떻게 C에 Object-Oriented Programming 컨셉을 구현했는지 설명하세요.
  • C++가 어떻게 C에 Generic programming 컨셉을 구현했는지 설명하세요.
  • Program은 어떻게 만들어지나요?

Learning C++: What Lies Before You

  • C++는 Procedural Programming(=C), Object-Oriented Programming, Generic Programming의 교차점에 있다.
  • 그렇기에 만약 C를 알고 있었다면, C++을 제대로 쓰려면 접근방법을 바꿔야할 것이다.

The Origins of C++: A Little History

  • 1960년대에 컴퓨터 기술이 급격하게 발전했던 만큼, 그 안에서 돌아가는 프로그램도 급격하게 복잡해졌다. 이러한 프로그램의 유지보수가 이슈가 된 것이다.
  • 1970년대에 C와 Pascal이 이러한 이슈를 잠재우기 위해 등장했다. 그 중 C는 간결하고 빠르다보니 1980년대엔 지배적인 언어가 되었다.
  • 와중에 1980년대에 나온 SmallTalk와 C++가 새로운 패러다임인 Object Oriented Programming을 대두하기 시작한다.

The C Language

  • C 이전에 프로그래머들은 어셈블리어를 사용해 프로그램을 작성했다. 어셈블리어는 low-level language다. 즉, 하드웨어와 직접적으로 소통한다. (레지스터에 데이터를 저장하거나 메모리 로케이션을 정확히 지정하거나)
  • 하드웨어와 직접적으로 소통한다는 건 하드웨어가 바뀌면 그냥 다시 코드를 써야한다는 걸 의미했다.
  • 이는 1970년 초기에 Unix OS를 만들던 Dennis Ritchie에겐 큰 문제였다. 왜냐하면 Unix는 어떤 물리적 환경에서도 동일하게 동작해야 했기 때문이다.
  • high-level language는 이 문제를 해결하는 언어다. 즉, 하드웨어에 독립적이다. 그럴 수 있는 이유는 Compiler라는 프로그램이 high-level language를 각 환경에 맞게 기계어로 바꿔주기 때문이다.

C Programming Philosophy

  • Computer language가 다루는 것은 결국 데이터와 알고리즘이다. 즉, 프로그램 = 데이터 + 알고리즘이다. C는 procedural language다. 즉, 알고리즘에 중점을 둔다. C는 목적을 수행하기 위한 action을 미리 정의해두고 이를 실행시키는 것이다.
  • C 이전에 있었던 FORTRAN과 BASIC도 procedural language이지만 큰 결함이 있었다. 조금만 프로그램이 복잡해져도 가독성이나 유지보수가 매우 어려워지는 것이다. 예를 들어, 코드의 flow를 제어하는 branching statement가 있어서 갑자기 코드를 넘나드는 일이 많았다.
  • C는 이러한 branching statement를 없애고 더 많은 언어 제약을 두는 structured programming을 지향한다. structured programming은 branching을 제한하고 특정 구조의 branching 만을 그들의 단어(for, while 등)를 통해 허용한다.
  • Top-Down Approach도 C가 기용한 중요한 원칙이다. C는 큰 문제를 작은 문제로 분할하면서 해결하는 방식을 지향한다. function을 통해 작은 문제를 해결하는 프로그램 유닛을 만들어서 해결할 수 있다.

The C++ Shift: Obejct-Oriented Programming

  • 위에서 말한 C의 장점에도 불구하고 새로운 패러다임인 OOP가 부상했다. Procedural Programming이 algorithm 또는 action에 중점을 두었다면 OOP는 Data에 강조점을 둔다.
  • C++는 Class라는 특수한 데이터 구조를 만들어서 문제해결을 위한 language 형성을 시도한다.
  • OOP는 문제의 접근 방식을 달리한다. 실제로 프로그램이 어떤 데이터를 다뤄야 하는가를 먼저 생각해본다. 예를 들어, 그림판을 만든다면 브러쉬의 크기, 색깔, 모양 같은 것들을 알아야 할 것이다.
  • 이렇게 어떤 구조의 데이터가 필요한지 먼저 디자인한 후, 이 데이터를 가지고 어떤 절차를 거쳐야할 지 생각한다. 그러니까 Procedural Programming과 완전히 반대인 것이다. Bottom-Up이다.
  • OOP는 여기에 캡슐화, 추상화라는 컨셉을 적용해 안전하고 활용성이 높은 코드를 짤 수 있도록 돕는다.
  • Procedural Programming이 어떻게 작업을 수행해야 하는가?에만 집중했다면, OOP는 어떤 것을 다뤄야 하는가? 라는 새로운 질문을 던져 문제를 해결하는 새로운 방법을 제시하는 것이다.

C++ and Generic Programming

  • OOP가 프로그래밍에서 Data를 강조했다면, Generic Programming은 특정 Data Type으로부터의 자유를 지향한다.
  • C++의 templates는 Generic한 코드를 짤 수 있도록 도와준다.

The Genesis of C++

  • 생략

Portability and Standards

  • Window10에서 잘 돌아가는 멋진 C++ 프로그램을 만들었다고 생각해보자. 그런데 이제 Mac OS에서도 프로그램이 돌아가도록 해야한다면? 우리는 무엇을 해야할까?
  • 먼저 해당 플랫폼에 맞는 Compiler를 통해서 다시 컴파일은 해야할 것이다. 그건 괜찮다. 코드는 바뀌어야 할까? 만약 바뀔 필요가 없다면 그런 프로그램을 보고 우리는 Portable하다고 말한다.
  • C++도 언어다. Portability에 있어서 언어로서의 가장 큰 문제는 사투리다. 서울 토박이와 제주 토박이가 같은 한국말을 써도 서로 소통하기 어려운 것과 같다. C++를 실제로 적용하는 사람들이 여러 버전의 C++, 그러니까 C++ 사투리를 만들 수도 있는 노릇이다. 아마 대기업끼리는 이런 부분에 대해서 합의할 수도 있지만 그런 합의가 공표되지 못한다면 어떻게 될지는 모르는 일이다. 이런 일을 방지하기 위해 만들어진 단체가 American National Standards Institute(ANSI)다. ANSI는 1990년에 위원회를 꾸렸고, ISO(국제표준단체)도 여기에 가담했다. ANSI/ISO가 C++ 표준을 만들기 시작한 것이다.
  • 몇년의 노력 끝에 1998년 C++ 표준이 발표된다. C++ 기능에 대한 설명을 재단장했을 뿐만이 아니라 새로운 기능을 추가했다. exception, runtime type identification(RTTI), templates, STL이 그 기능이다. 03년에도 새로운 표준이 발표되었지만 기능 추가나 변경이 있었던 것은 아니므로 (minor update) 보통 C++98을 말하면 C++98/03을 의미한다.
  • 2011년 8월에 새로운 표준이 발표된다. 이게 바로 C++11이다. C++ 11은 새로운 기능을 추가했을 뿐만이 아니라 C++의 사용성을 증대시켰다.(어떻게?)

The Mechanics of Creating a Program

  • C++ 프로그램을 만드는 것은 다음 과정을 거친다.
    1. text editor로 C++ 문법에 맞게 글을 쓴다. (=소스코드)
    2. 컴파일러로 소스코드를 컴파일한다. 이 과정에서 소스코드는 기계어로 번역되어 목적파일이 된다.
    3. 링커가 오브젝트를 다른 코드와 연결시킨다. 내가 쓴 함수와 라이브러리의 함수를 링크시키고 프로그램의 런타임 버전을 만들어주는 startup code도 함께 여기서 작동한다.
    4. 이러면 파일이 딱 한개 만들어지는데, 이걸 보고 우리는 executable code라고 한다.

 

 

'Coding > Unreal, C++' 카테고리의 다른 글

[C++ Primer Plus] 3. Dealing with Data  (0) 2022.05.27
[C++ Primer Plus] 2. Setting Out to C++  (0) 2022.05.26
Replication  (0) 2022.05.23
언리얼에서 낮 밤 만들기 (+시간 시스템)  (2) 2022.04.04
UE4: Delegate  (0) 2022.03.24