C++ Hello World 의미
목차
새로운 언어를 시작해서 가장 할 것은 C++ Hello World 를 출력하는 것 입니다.
이는 C언어의 창시자 데니스 리치가 본인이 쓴 C언어 교재에서 강조한 내용이며 지금도 새로운 프로그래밍 언어를 배울 때 Hello World로 시작하는 일종의 전통입니다.
많은 경우 그냥 아무생각 없이 따라하는 코드긴 한데요.
모니터 스크린에 Hello World 라는 문자열을 출력함으로써 현재 시스템에서 빌드가 잘 되었고 런타임이 작동한다. 입출력 기기에 이상이 없다. 정도를 확인할 수 있습니다.
표준화된 지금의 PC 환경에서는 별로 어려운 일이 아니지만 임베디드 소프트웨어나 사물인터넷 환경에서 LED 디스플레이 등에 Hello World 를 출력하는 것은 최초 설정까지 꽤 오랜 시간이 걸릴 수 있기 때문에 심오한 작업이라고도 할 수 있습니다.
새로운 언어개발환경을 설치한 후 처음 Hello World 를 돌려보면 ‘뭔가 잘은 모르겠지만 대단한 일을 해낸 것 같다’ 라는 알 수 없는 성취감을 느낄 수 있습니다.
하나의 컴퓨터 언어가 현재 시스템에서 작동하기 까지 그 밑에서 수많은 코드가 빌드(build – 건설)되야 하기 때문에 우리가 보는 것은 단지 Hello World 라는 단순한 문자열에 지나지 않지만 내부적으로는 이미 하나의 왕국이 건설된 것이나 마찬가지이기 때문입니다.
Hello World 를 출력하는 것은 프로그래머가 전자적 가상의 세계에서 신에게 창조 능력을 부여받은 것과 마찬가지 입니다. 따라서 오늘날까지 프로그래머들은 Hello World 의 전통을 지키고 있습니다.
그래서 Hello World 라는 메시지의 해석도 재미있습니다. 새로운 세계, 프로그래밍의 세계에 인사를 하는 겁니다. 기계에게 인사하는 것이고 컴퓨터로 연결될 사람들에게도 하는 인사입니다.
이 웹사이트는 C언어의 창시자인 데니스 리치에게 영감을 받아서 만들었습니다. 프로그래밍에 대한 어떤 설명을 할 때는 이유가 있으면 좋겠습니다.
그래서 단순히 Hello World 를 기계적으로 출력하는 것 보다 그것이 의미하는 철학에 초점을 맞춰봅니다. Hello World 를 출력하는 Tutorial (튜토리얼 자습서)은 구글 검색엔진에만도 넘쳐납니다. 구글에서는 다 똑같은 내용밖에 볼 수 없기 때문에 지루합니다.
아래 포스팅을 보면 12개 언어로 Hello World 를 작성해봐도 우리가 볼 수 있는 것은 Hello World 입니다. 아마 세상에는 프로그래밍 언어의 수 만큼 수백가지의 Hello World 가 있을 겁니다.
12개 언어의 Hello World 프로그램 – 스무디코딩
핵심은 Hello World 가 중요하지 않다는 것 입니다. 정말로 주목해야 하는 것은 우리에게 C++이라는 하나의 강력한 도구가 주어졌다는 점입니다. C++은 프로그래밍 언어 중에서 독특한 포지션을 차지하고 있습니다.
이전 학습 C++ 시작하기에서 설명한 것 처럼 C++ 은 절차지향적 프로그래밍의 철학과 객체지향적 프로그래밍의 철학 두개를 다 사용할 수 있는데 객체지향적 프로그래밍을 추구한다.
이게 무슨 말 일까요?
그렇죠, 어려운 말입니다. 특히 C++을 시작하는 입장에서 보면 더 이해하기 어려운 말입니다. 그전에 C언어를 배웠다 하더라도 이해하기가 쉽지 않습니다.
C++의 객체지향적 사고, 객체지향적 패러다임(Paradigm)이라는 것은 사고방식의 근본적 변화를 의미합니다. 한국의 프로그래밍 명강사들도 이것을 쉽게 설명하는 분들은 거의 못봤는데요. 그것은 당연합니다.
사고방식의 차이를 30분정도의 짧은 설명으로 할 수 있을까요? 아니 30분 안에 이해할 수 있을까요? 설명적으로 논리적으로 이해할 수 있을지 모릅니다. 그러나 내 뇌가 객체지향형 방식으로 행동까지 바꾸는 것은 불가능합니다.
객체지향형 프로그래밍 철학이란 생각의 차이는 행동양식의 변화를 가져와야 하기 때문입니다. 때문에 어렵습니다. 그것은 스스로 객체지향 설계를 해야하고 코드를 작성해서 구현을 해야 얻을 수 있습니다.
그래서 C++ 자습서 1번에서 C++을 배우는 것은 험난한 길이라고 강조했습니다. 사실 파이썬이나 JS같이 다른 동적타이핑 언어들도 뒤로 가면 매우 어려워진다는 것을 알지만 입문자들에게 그런 이야기부터 하는 것은 가혹한 일입니다.
그래서 파이썬 튜토리얼의 경우는 처음부터 남녀노소 누구나 배울 수 있다고 이야기를 합니다. 그러나 C++의 경우 처음부터 좀 험난하다고 강조를 하는데요.
국내 C++ 명강사님들도 C++를 배우고 싶다면 단단한 마음가짐을 해야한다고 처음에 이야기를 한 후 진도를 빡세게 나갑니다. 사람들은 요즘 같은 시대에 강사가 뭐 저리 불친절 하냐? 라고 생각할지 모르지만 그건 착각입니다.
C++을 재미있게 가지고 놀 수 있는 사람들은 이미 처음부터 정해져 있습니다. 대중적으로 유명한 사람들의 예를 들면 빌게이츠, 리누스 토발즈, 귀도 반 로썸 등이 있습니다. 인성 문제로 제명되긴 했지만 마인크래프트의 창시자 마르쿠스 페르손 같은 사람도 포함하죠.
이 사람들의 재능은 이미 초등학생 때 보통의 대학생을 능가했습니다. C++은 그런 천재들에게는 재미있는 장난감입니다. 그런데 일반인들에겐 혹독하게 채찍질 당하지 않고 쉽게 배울 수 없는 고통과도 같죠. 이걸 가르치는 분들이 대체적으로 엄격한 것은 빡세게 배웠기 때문이기도 합니다.
물론 빡세게 배웠다고 후배들을 몰아부치는 방식이 좋다는 것은 아닌데요. 시대적으로도 별로 유용하지 않은 생각이죠.
다만 재능이 없는 사람들이 만만하게 볼 정도의 언어는 아니다. C++ 은 단지 언어일 뿐인데 과도한 감정이입을 할 필요가 없다는 것 입니다. C++이 어렵다면 다른 사람을 탓해서는 아무것도 얻을 수 없습니다.
C++ 은 그냥 0과 1로 작동하는 컴퓨터를 작동하기 위한 하나의 시스템에 불과합니다. 그것을 고안한 사람들이 인류안에는 손꼽히는 천재였기 때문에 대부분 평범한 사람들이 이해하기 힘들 뿐입니다. (글쓴이도 당연히 포함됨)
최근의 흐름을 보면 어떤 프로그램이라도 쉬워야 하고, AI가 대신 해줘야 하는 등 편리한 부분이 있습니다. 그런 것을 인간적이라고 할까요? 좀 마음 편하게 힘 안들이고 할 수 있게 해주는 앱과 서비스들을 인간적이라고 부르는 것 같습니다.
다만 기계를 대할 때는 차가울 필요가 있습니다. 프로그래머들은 차가운 기계와 따뜻한 인간의 사이에 있는 사람들입니다. 때로는 얼음장같이 차가워져야 하고 때로는 따뜻한 인간적인 시선도 필요합니다.
C++은 어느쪽에 가깝냐… 하면 얼음쪽입니다. 우리가 이과 문과를 나누기도 하지만 그것은 교육과정상 분류일 따름이고 우리 스스로를 바라보면 인간이기 때문에 기계와 가까운 사람은 저 위에서 이야기한 것 처럼 몇명 되지 않습니다.
Hello World 코드 실행
#include <iostream> using namespace std; int main() { cout << "Hello World!" << endl; return 0; }
C++의 코드도 고수준(High Level) 언어라서 짧습니다. 자바(Java)보다 타이핑 수가 적습니다.
여기서 알 수 있는 것은 include 에서 전처리기를 사용한다는 것 -> 외부 라이브러리를 가져다 쓸 수 있다는 뜻 입니다. 실전에서는 라이브러리 응용능력이 중요합니다.
namespace 이름 공간을 사용한다는 것도 라이브러리와 마찬가지로 수많은 외부 프로그램(모듈, 클래스)을 가져다 쓴다는 의미입니다. 이름이 겹치지 않도록 namespace 를 구분하는 것 입니다.
main 함수는 대부분의 프로그래밍 언어가 가지고 있습니다. OS에서 프로그램을 실행시키기 위한 과정에는 메모리 로드가 필수적입니다. 현대 PC에서는 프로그램을 하드디스크에서 실행시키지는 않습니다.
프로그램은 일단 메모리로 올라와야 되는데 그것이 CPU를 사용하는 방식이기 때문입니다. main 함수는 런타임에서 C++의 전처리 과정이 다 끝난 후 실행됩니다. 우리가 생각하는 프로그램의 시작점입니다. 여기서 부터 소스코드가 시작되고 끝나는 것 처럼 보입니다. 그러나 OS가 봤을 때는 프로세스를 실행하고 종료하는 과정의 일부입니다.
return 0 을 받으면 OS는 정상적으로 프로세스가 끝났다고 판단합니다. 0이란 반환값 혹은 리턴값은 함수에서 반환받는 값과 같습니다. 단지 OS가 받을 뿐입니다. OS는 C++ 애플리케이션에서는 컨트롤이 불가능합니다.
C++에서는 이런 내부 동작을 깊이 들어가면 한없이 복잡해집니다. 다른 언어에서는 그렇게 심각하게 생각할 필요는 없지만 C++은 좀 더 사고의 깊이를 요구합니다.
중반이후로 넘어가면 컴퓨터 시스템 구조에 객체지향 개념까지 머리속에 장착해야 하기 때문에 쥐가 납니다. 미리 앞쪽에서 이해도를 높이고 코딩 연습을 통해서 실력을 다져 놓는게 좋습니다.
요약
C++ Hello World 의 의미에 대해서 설명하고 Hello World 코드의 작동에 대하여 알아봤습니다.
설명이 다소 거친 부분이 많습니다. 강조하지만 C++은 고통없이 배울 수 있는 언어가 아닙니다. 특히 처음부터 어렵다고 느끼는 부분은 어쩔 수가 없습니다.
어려운 것을 쉽게 설명하기도 어렵지만 학습자의 시간이 많이 소모되기도 합니다. 이 포스팅에서는 어려운 것을 쉽게 설명하지는 못하더라도 그게 왜 어려운 것인지 정도는 설명을 해봤습니다.
글쓴이가 C++을 처음 접한 것은 오래전인데 어려운 것은 당연했고 그 보다 더 힘들게 했던 것은 그게 왜 어려운 것인지 조차 알수가 없었다는 것에 있었습니다. 왜 어려운지 어디가 문제인지 파악조차 안되서 꽤 오랜시간 C++을 방치한채 떠나야 했습니다.
물론 당시에 C++을 잘하는 뛰어난 학생들은 있었습니다.
(확실히 비율상 많지는 않았습니다)
이 자습서는 그런 평범한 사람들을 위해 작성했기 때문에 일반 교재들과는 다릅니다. 일반 교재와 다른 것이 블로그의 장점이기도 합니다.
저는 stack over flow를 많이 읽습니다. 영어권에는 훌륭한 교재들이 많아서 배우기가 쉬운데도 불구하고 소위 말하는 stupid questions (멍청한 질문)을 마구 해댑니다. 아니 멍청하지 않습니다. 대부분 보통사람이 가지고 있는 질문들입니다.
어떻게 보면 그 질문들에 대한 답이 C++의 핵심인 경우가 많습니다. 답변들을 보면 심오한 경우가 많습니다. 많은 경우 질문은 달랑 한 줄인데 설명의 지면이 부족해서 웹페이지로 넘겨버리는 경우가 많은데 그 페이지 한장의 깊이가 달라요. 질문 하나로 얻어갈 수 있는 내공은 차원이 다릅니다. 모르면 평생 모를 것들이 들어있습니다.
개발자 커뮤니티도 대단합니다. 이런 지식들을 무료로 나눠줍니다. 스택오버플로우에 가장 질문한 언어가 파이썬이라는데 파이썬에만 약 100만개가 넘는 질문과 답변이 올라와있다고 합니다. 상상이 가나요?
그래서 stack over flow 는 필수입니다.
제가 C++을 처음 접했을 때는 stack over flow 같은 건 없었으니까요. 영어도 할 줄 몰랐고. 지금의 시대는 지력이 좀 딸린 사람들도 충분히 훌륭한 프로그래머가 될 수 있습니다.
음… 갑자기 10년만 젊었다면 좋겠네요;;;
연관문서
12개 언어의 Hello World 프로그램 – 스무디코딩
외부참조문서
C++ Hello World! Program (programiz.com)
Writing first C++ Hello World example – GeeksforGeeks
C++ Hello World 프로그램의 해설 | C++ 주석
C 언어 코딩 도장: 3.3 C++ Hello World! 출력하기 (dojang.io)