시리즈:쉽게 배우는 프로그래밍 입문/C++: 두 판 사이의 차이

잔글 (봇: 자동으로 텍스트 교체 (-\[\[(File|file): +[[파일:))
 
(사용자 20명의 중간 판 101개는 보이지 않습니다)
1번째 줄: 1번째 줄:
{{쉽게 알 수 있다 시리즈|이 문서는 정말 쉽습니다.|문서의 내용이 너무 쉬워서 오늘부터 프로그래밍 수 있을 것 같습니다.}}
{{:시리즈:쉽게 배우는 프로그래밍 입문}}
[[분류:컴퓨터_프로그래밍]]
 
이번에는 [[C++]]에 대해서 배우실 차례입니다.
 
[[C++]]에 대한 설명은 리브레의 C++항목을 보시길 바랍니다.
 
본 문서에서는 파이썬과의 차이점을 들면서 C++을 알려드리겠습니다.
 
== 개발환경 설치 ==
본 강좌에서는 [[CodeBlocks]]라는 리눅스, 윈도우, 맥을 다 지원하는 C/C++용 IDE(컴파일러 + 편집기)을 사용할께요
=== 윈도우 ===
[http://sourceforge.net/projects/codeblocks/files/Binaries/13.12/Windows/codeblocks-13.12mingw-setup-TDM-GCC-481.exe 다운로드 링크] 을 눌러서 CodeBlocks를 설치하시면 됩니다.
=== 리눅스 ===
==== 우분투 ====
sudo apt-get install codeblocks를 입력하여 설치합니다.
=== OSX ===
[http://www.codeblocks.org/downloads/26 여기]에서 다운 받으면 됩니다.(개발자가 부족해서 16.01은 아직 안 된다고 하네요)
 
=== 코드블럭 실행 ===
[[파일:codeblocks-1.PNG]]
 
실행을 하면 이렇게 창이 뜹니다. 컴파일러를 선택하라는 창이지만 OK버튼을 눌러 다음으로 넘어 간다.
 
[[파일:codeblocks-2.PNG]]
 
다음은 소스파일과 프로젝트 파일 확장자를 코드블럭으로 연결할 것이냐는 질문이다.(C/CPP 코드블럭 프로젝트 파일등)
 
다른 컴파일러가 없을 경우 그냥 OK를 누르고, 없을 경우 1번째 체크박스을 선택한 후 OK버튼을 누른다.
 
[[파일:codeblocks-3.PNG]]
 
프로젝트를 생성할 경우 File -> New -> Project를 누르면 된다.
 
[[파일:codeblocks-4.PNG]]
 
Console Application을 누르고 OK를 누른다
 
[[파일:codeblocks-5.PNG]]
 
Next를 눌러 다음으로 넘어 간다.
 
[[파일:codeblocks-6.PNG]]
 
C++을 누르고 Next를 누른다.
 
[[파일:codeblocks-7.PNG]]
 
# 프로젝트 이름
# 프로젝트 폴더가 저장될 위치'''중요'''
# 실제 프로젝트가 저장될 위치
 
처음 만지는 분이 프로젝트 폴더가 저장될 위치를 지정하지 않고 Next를 눌러 꼬이는 경우가 많다. 꼭 파랑색 원이 그려진 버튼을 눌러서 폴더를 정한 다음에 Next를 누른다.
 
 
[[파일:codeblocks-8.PNG]]
 
완료가 되면 다음과 같이 프로젝트와 소스 파일 하나가 생긴다.
 
== Hello, World! ==
<syntaxhighlight lang=cpp>
#include <iostream>
 
int main(void)
{
    std::cout << "Hello, World!" << std::endl;
    return 0;
}
</syntaxhighlight>
=== 파이썬과의 차이점 ===
 
우선 너무 달라서 공통점이 없어 보이기는 하지만 몇가지 공통점이 보인다
# 뭔가 친숙한 문자열인 "(쌍따옴표)가 보인다
# 뭔가 int라는 게 보인다.
하지만 차이점이 더 많이 보이는데 파이썬과 차이점을 보자면 다음과 같다.
# 파이썬에서 탭으로 구분했던 함수의 시작과 끝을 {}(중괄호)로 구분한다.
# 각 명령문이 끝나면 ;을 붙여야 한다.
# 함수 선언이 '''def'''로 시작하지 않는다.
이다.
 
우선 파이썬과 달리 C++는 프로그램의 '''시작점'''이라는 것이 필요하다. 파이썬의 경우 시작점이 코드의 첫줄이라면, C++의 프로그램의 시작점은 바로 '''이름이 main인 함수'''이다. 프로그램이 시작되면 main함수이 호출되고 프로그램이 동작한다.
 
또한 코드의 첫줄에 #include <iostream>이라는 문장이 보인다. 당장은 정확히 필요없이 '''터미널/콘솔에 출력하려면 필요하다'''라는 것만 알면 된다.
 
프로그램이 시작되면 main함수가 시작되므로 main함수 안을 보자. 한 문장만이 보인다.
<syntaxhighlight lang="cpp">
std::cout<<"Hello, World!"<<std::endl;
</syntaxhighlight>
std는 standard의 약자이며, cout은 console output이라는 약자이고. endl는 end line의 약자이다. 즉, std::cout은 표준으로 정해진 콘솔에 출력이라는 것이며, std::endl은 줄을 끝낸다, 즉 다음 줄로 넘어간다는 뜻이 된다.
 
== 변수==
C++의 변수와 파이썬의 변수는 그 의미와 사용용도는 같지만, 중요한 차이점이 몇가지 있다
# C++의 변수는 파이썬의 변수와 달리 '''선언'''이라는 것이 필요하다.
# C++의 변수는 파이썬의 변수와 달리 한번 정해진 데이터형(변수형)에서 바뀌지 않는다.
파이썬의 변수는 다음과 같이 선언하면 되었다.
<syntaxhighlight lang="python">
변수 = 1
</syntaxhighlight>
하지만 C++에서 변수는 다음과 같이 선언한다.
<syntaxhighlight lang="cpp">
int var = 1
</syntaxhighlight>
해석을 하자면 다음과 같다.
'''int라는 데이터 형인 var이라는 변수를 만들고, 1이라는 값을 넣는다.''' 또는 '''var은 1이고, 숫자다.'''<ref>저 숫자다 부분은 생략해서 생각하고 필요할 때 다시 떠올려 봐도 된다.</ref><ref>쉽게 해석했을 때</ref>
한편 이렇게 변수의 선언시 정해진 데이터형에서 다른 데이터형으로 중간에 바뀔 없다.
 
=== 데이터형 ===
C++는 컴퓨터와 매우 가까운 언어이다. 따라서 컴퓨터의 환경에 따라서 여러 가지가 바뀔 수 있는데, 데이터형이 특히 그러하다. 우선은 32비트를 기준으로 설명한 뒤, 64비트 CPU와 차이점이 있는 데이터형만 추가로 서술한다.
==== 정수형 ====
가장 많이 쓰이는 데이터형이다. 정수형이란, 소수점 아랫자리가 없는 데이터형을 말한다. 파이썬에서 정수형은 오직 크기가 하나밖에 없었지만, C++에서는 그 용도에 맞추어 사용하라는 뜻에서 다양한 크기를 가진 정수형이 존재한다.
{|class='wikitable' style='width:100%;'
|-
|style='text-align:center'|데이터형 이름
|style='text-align:center'|bool
|style='text-align:center'|char
|style='text-align:center'|short
|style='text-align:center'|int
|style='text-align:center'|long
|-
|style='text-align:center'|변수 크기
|style='text-align:center'|1비트(1바이트)
|style='text-align:center'|1바이트(8비트)
|style='text-align:center'|2바이트(16비트)
|style='text-align:center'|4바이트(32비트)
|style='text-align:center'|4바이트(32비트)
|-
|style='text-align:center'|표현가능 범위
|style='text-align:center'|false, true
|style='text-align:center'|-128 ~ 127
|style='text-align:center'|-32768~32767
|style='text-align:center'|-2147483648~2147483647
|style='text-align:center'|-2147483648~2147483647
|-
|style='text-align:center'|간단한 뜻
|style='text-align:center'|진위값
|style='text-align:center'|문자
|style='text-align:center'|작은 숫자
|style='text-align:center'|숫자
|style='text-align:center'|큰 숫자
|}
이중 long형의 경우 64비트 기계어로 번역될 경우에는 운영체제마다 그 크기가 다른데, 윈도우의 경우에는 4바이트, 리눅스의 경우에는 8바이트이다.
 
==== 실수형 ====
실수형이란 소수점이 붙은 수를 말한다. 컴퓨터에서 실수를 메모리에 저장할 때는 '''부동 소수점'''표기 방식을 사용한다.
 
'''부동소수점''' 이란 수학으로 보자면 지수방식으로 실수를 표기하는 것과 같다. 1.123123 x 10^2이런 식으로요, 다만 10^n승이 아니라 2^n으로 표기한다는게 차이점이다.
{|class='wikitable' style='width:100%;'
|-
|style='text-align:center'|변수명
|style='text-align:center'|float
|style='text-align:center'|double
|style='text-align:center'|long double
|-
|style='text-align:center'|데이터형 크기
|style='text-align:center'|4바이트
|style='text-align:center'|8바이트
|style='text-align:center'|8바이트 이상
|-
|}
==== 문자형 ====
String 형입니다. <code>string a="김바보"</code>이런 식으로 사용할 수 있습니다. 사실 String은 사용자 정의 타입이기 때문에 더 기능이 있는데, 나중에 알아보도록 합시다.
 
=== 형변환 ===
형변환(casting)은 다른 데이터형으로 변환하는 것을 말한다.
==== 묵시적 형변환 ====
묵시적 형변환이란 변수를 사용하여 셈을 할 때, 프로그래머가 코드로 ''값을 이 데이터형으로 바꿔라''라고 작성하지 않았지만 컴파일러가 ''이 값을 이 값이란 셈을 하려면 이런 데이터형으로 변환해야 하겠구나''라는 판단을 내리고 데이터형을 바꾸는 것을 말한다.
묵시적 형변환은 다음과 같은 우선 순위를 갖는다.
# double
# float
# long
# int
왜 다른 데이터형 bool, char, short은 없는가 하면 이들은 다른 데이터형과 셈을 때 int형으로 형변환이 된다.
==== 명시적 형변환 ====
<!--
묻지도 따지지도 않고 문법을 배우고 싶은 사람은 [[쉽게 배우는 프로그래밍 입문/C++/문법|문법]]을 읽으면 된다. 만약, 프로그래밍을 C++로 입문하고자 하는 사람이 있다면 [[쉽게 배우는 프로그래밍 입문/C++/따라하기|따라하기]]로.
== 이 언어를 배우려는 사람에게 전하는 주의사항 ==
== 이 언어를 배우려는 사람에게 전하는 주의사항 ==
만약 C 문법을 잘 모르는 경우 '''반드시''' [[쉽게 배우는 프로그래밍 입문/C]] 참고.
=== C 문법을 그대로 사용하는 경우 ===
=== C 문법을 그대로 사용하는 경우 ===
물론 프로그래밍을 할 수는 있다. 그렇지만, C의 문법보다 [[타입 캐스팅|형변환]]<ref>간단히 설명하자면, 문자를 정수로 바꾸는 등의 한 데이터 타입을 다른 타입으로 변환하는 것을 말한다.</ref> 조건이 빡빡하다던가, C++의 많은 기능을 사용할 수 없다던가 하는 점이 있기 때문에, 정말 C로 개발해야만 하는 상황(거의 없겠지만)이 아니라면  C++의 문법을 사용하는 것이 좋다.
물론 프로그래밍을 할 수는 있다. 그렇지만, C의 문법보다 [[타입 캐스팅|형변환]]<ref>간단히 설명하자면, 문자를 정수로 바꾸는 등의 한 데이터 타입을 다른 타입으로 변환하는 것을 말한다.</ref> 조건이 빡빡하다던가, C++의 많은 기능을 사용할 수 없다던가 하는 점이 있기 때문에, 정말 C로 개발해야만 하는 상황(거의 없겠지만)이 아니라면  C++의 문법을 사용하는 것이 좋다.
7번째 줄: 180번째 줄:
=== 객체지향은 또 뭐야? ===
=== 객체지향은 또 뭐야? ===
쉽게 말해, 모든 대상을 "데이터"와 "기능"으로 추상화해서 나타낸 것이다. 기존의 C에서 사용하던 구조체(struct)는 말 그대로 단순히 데이터를 담는 "자료형"의 역할을 했지만, 클래스는 어떤 대상을 데이터와 기능의 집합으로 나타내므로 그 대상의 성질, 특성과 같은 것들을 표현할 수 있다.
쉽게 말해, 모든 대상을 "데이터"와 "기능"으로 추상화해서 나타낸 것이다. 기존의 C에서 사용하던 구조체(struct)는 말 그대로 단순히 데이터를 담는 "자료형"의 역할을 했지만, 클래스는 어떤 대상을 데이터와 기능의 집합으로 나타내므로 그 대상의 성질, 특성과 같은 것들을 표현할 수 있다.
예를 들어서 휴대폰을 프로그래밍한다고 하자(하드웨어 같은 건 신경 끄고). 보통 기능을 늘어놓는다면(구조적 프로그래밍) 전화기능이라던가, 문자기능 등을 써넣을 것이다. 객체지향으로 프로그래밍을 한다면 휴대폰의 화면, 버튼, 카메라, 배터리, CPU 등을 (객체로) 만든 뒤, 이것들을 유기적으로 연결해서 휴대폰이란 프로그래밍을 만든다. 
이렇게 현실과 비슷하게 구성하기 때문에, 프로그래밍계의 혁명이라 카더라.


=== <s>쓸데없이 불친절하고</s> 어려운 템플릿 ===
=== <s>쓸데없이 불친절하고</s> 어려운 템플릿 ===
템플릿은 메타프로그래밍 요소로, 서로 다른 여러가지의 클래스에 대해 '''각각을 따로 프로그래밍하지 않고 같은 이름을 가지는 대상(클래스, 함수)으로''' 프로그래밍할 수 있게 한다. 다시 말해서, '''일반화 프로그래밍'''이 가능하다! 하지만, C++의 템플릿은 다른 여타 언어들의 메타프로그래밍 요소와는 달리 [[템플릿 메타프로그래밍]]이라는 <s>변태짓</s>을 가능하게 한다.<s>나쁜 녀석들 같으니라고</s> <s>[[구글링]]을 해도 답이 안나온다</s> 이 기법은 C++ 프로그래머 중에서도 정말 고수들만이 제대로 활용할 수 있으므로, 공부하려고 마음먹었을 때 각오하는 것이 좋다.<s>하지만 우리 회사는 못하게 하는데</s> <s>그럴때는 실력에 대한 신뢰감을 줘야..</s>
템플릿은 메타프로그래밍 요소로, 서로 다른 여러 가지의 클래스에 대해 '''각각을 따로 프로그래밍하지 않고 같은 이름을 가지는 대상(클래스, 함수)으로''' 프로그래밍할 수 있게 한다. 다시 말해서, '''일반화 프로그래밍'''이 가능하다! 하지만, C++의 템플릿은 다른 여타 언어들의 메타프로그래밍 요소와는 달리 [[템플릿 메타프로그래밍]]이라는 <s>변태짓</s>을 가능하게 한다.<s>나쁜 녀석들 같으니라고</s> <s>[[구글링]]을 해도 답이 안나온다</s> 이 기법은 C++ 프로그래머 중에서도 정말 고수들만이 제대로 활용할 수 있으므로, 공부하려고 마음먹었을 때 각오하는 것이 좋다.<s>하지만 우리 회사는 못하게 하는데</s> <s>그럴때는 실력에 대한 신뢰감을 줘야..</s>


=== 함수형 프로그래밍은 또 어디에서 굴러들어온건데? ===
=== 함수형 프로그래밍은 또 어디에서 굴러들어온건데? ===
20번째 줄: 195번째 줄:


많은 내용들 중 중심적인 내용을 먼저 학습한 후, 곁가지로 제공되는 기능을 익혀나가는 방법은 C++을 공부하는 좋은 방법 중 하나이다. C를 빠르게 공부한 후, C++의 중심적 내용인 클래스를 공부하면 나머지는 다 부가기능처럼 보일것이다.
많은 내용들 중 중심적인 내용을 먼저 학습한 후, 곁가지로 제공되는 기능을 익혀나가는 방법은 C++을 공부하는 좋은 방법 중 하나이다. C를 빠르게 공부한 후, C++의 중심적 내용인 클래스를 공부하면 나머지는 다 부가기능처럼 보일것이다.
== 배워두면 좋은 점 ==
# 일단 언어 자체가 매우 강력하다.
#: 위에서 기능이 많아서 배우기 어렵다고 했는데, 그 말은 다시 돌려 말하면 그만큼 많은 기능을 사용할 수 있고, 사용 여하에 따라서는 매우 강력한 도구가 될 수 있단 뜻이다. 특히 최근 대세인 Java보다 매우 빠르며<ref>물론 완벽하게 빠른건 아니나, 일반적인 경우에는 Java보다 매우 빠르다.</ref>, 프로그램 실행 속도는 C와 거의 다를 바가 없을 수준<ref>대신 C에 비해 문법적으로 복잡하기 때문에 컴파일에 걸리는 시간은 일반적으로 훨씬 길다. 때문에 실무에서는 컴파일 타임을 줄이는 몇가지 방안을 사용한다.</ref>이다.
# 고급 언어의 특성을 많이 가지고 있으면서(추상화 등), 중간 언어(C)의 기능을 다 사용할 수 있다.
#: 고급 언어는 프로그램 설계를 쉽게 해준다. 특히 C++은 고급 언어들 중에서도 일부에서만 지원하는 몇몇 강력한 기능(연산자 오버라이딩) 등을 지원한다. 하지만 많은 고급 언어들은 오류 방지나 무결성 등을 위해 메모리 직접 접근을 제한하는 등 직접 프로그래머가 건드릴 수 있는 부분을 제한함으로서 안정성을 얻으려 했다. 반면, C++은 그런거 없다. 사용할 수 있는 부분은 C에서 크게 다르지 않은, 이걸로 [[OS]]를 구축할 수 있을 정도의 언어이다. 그런 부분을 버린 만큼 조심히 다뤄야하지만, 조심하게 다루면서 사용하게 되면 고급 언어들에서는 사용할 수 없는, 중간 언어들에서 사용하던 유용한 트릭들을 사용할 수 있다.
# 하는 사람이 생각보다 많이 없다!
#: 불과 한 10년전만 하더라도 C++ 프로그래머가 거의 대부분을 차지했지만, 최근 Java에 대한 지속적 투자와 임베디드화 경향이 맞물리면서 Java가 득세하는 바람에, Java 프로그래머는 넘쳐나는데 C++ 프로그래머는 수가 많이 줄었다.


== 준비 ==
== 준비 ==
[http://go.microsoft.com/?linkid=9863608 Visual Studio 커뮤니티 2013]
윈도에서라면 [http://go.microsoft.com/?linkid=9863608 Visual Studio 커뮤니티 2013]를 사용해보자.


개인 사용자들에게는 무료로 공개되어있는 버전이다. 참고로 이거 하나면 C++ 뿐만이 아니라 C#, VB.NET 개발도 가능하다.
개인 사용자들에게는 무료로 공개되어 있는 버전이다. 참고로 이거 하나면 C++ 뿐만이 아니라 C#, VB.NET 개발도 가능하다. 학생의 경우 Dreamspark 프로그램을 통해 Professional 등의 버전을 사용할 수도 있다.


최신 표준의 기능들을 사용하고 싶다면 컴파일러를 LLVM로 바꾸면 된다.
최신 표준의 기능들을 사용하고 싶다면 컴파일러를 LLVM로 바꾸면 된다.
리눅스 유저라면 eclipse를 이용하면 된다. 그리고 이클립스에서 C++을 코딩할 수 있도록 g++과 eclipse-cdt를 터미널 혹은 시냅틱에서 설치하자. IDE 따위 필요없는 변태라면, g++하나만 있어도 된다.


후술된 내용들을 보기 전에 위의 C 프로그래밍 내용을 숙지하자. C++은 기본적으로 C에서 기원했다.
후술된 내용들을 보기 전에 위의 C 프로그래밍 내용을 숙지하자. C++은 기본적으로 C에서 기원했다.
32번째 줄: 217번째 줄:
== <s>예외란 없다</s>Hello, World! ==
== <s>예외란 없다</s>Hello, World! ==
빈 프로젝트를 생성한 후 소스(.cpp)파일에 다음 내용을 작성한다.
빈 프로젝트를 생성한 후 소스(.cpp)파일에 다음 내용을 작성한다.
<source lang=cpp>
<syntaxhighlight lang=cpp>
#include <iostream>
#include <iostream>


int main()
int main(void)
{
{
     std::cout << "Hello, World!" << std::endl;
     std::cout << "Hello, World!" << std::endl;
    return 0;
}
</syntaxhighlight>
혹은 이렇게도 쓸 수 있다.
<syntaxhighlight lang=cpp>
#include <iostream>
using namespace std;
int main(void)
{
    cout << "Hello, World!" <<endl;
    return 0;
}
}
</source>
</syntaxhighlight>


== 새 표준 입출력 ==
또는
iostream을 인클루드하고 사용한다.<ref>뒤에 .h 붙이지 말자. 구식 표준이다.</ref>
=== 표준 출력 ===
<source lang=cpp>
std::cout << [기본 자료형 변수/상수];
</source>
기본적으로 이 형식으로 사용한다. 기본 자료형이 아닌 구조체, 클래스 등은 후술할 [[오버로딩]] 참고.


<source lang=cpp>
<syntaxhighlight lang=cpp>
std::cout << [출력 대상] << [출력 대상] << ...
#include <cstdio>
</source>
int main(void)
이렇게 여러 대상의 출력을 한 줄에 작성할 수 있다.
{
    printf("Hello, World!");
    return 0;
}
</syntaxhighlight>


<source lang=cpp>
std::cout << ... << std::endl;
</source>
이렇게 작성하면 중간의 출력대상을 모두 출력한 후 한 줄을 강제 개행한다.
=== 표준 입력 ===


== 상수 ==
설명: C언어의 stdio와 같이 표준 입출력을 담당하는 C++의 헤더는 iostream이다.
기존의 const에 더해, volatile과 mutable 키워드를 사용할 수 있게 되었다. mutable 키워드의 경우 후술할 클래스 부분을 참고.
C++는 C언어와는 차이점이 존재하는데 표준 입출력에서 '함수'가 아닌 '(여러 함수를 포함하는)객체'를 사용한다는 점이다.  
C언어를 사용해오던 개발자가 C++를 처음 접할 때 생소함을 느끼는 이유가 그것이다.


volatile 키워드를 사용한 변수는 그 값이 언제든지 바뀔 수 있다는 것을 컴파일러에게 명시적으로 전달해주기 때문에, 최적화를 방해한다. goto 키워드처럼 '''쓰면 방해되는''' 키워드이기 때문에 이런 키워드는 없다고 생각하고 프로그래밍하자.
참고로 C++는 C언어와 상위호환이 가능한 언어로 설계되어 기존의 C표준 헤더를 사용하는 것이 가능하다.
비교적 최근의 C++표준은 헤더 명 앞에 c를 붙이고 확장자를 지워서 stdio.h를 cstdio와 같이 쓴다.
예제 코드는 세 번째 소스코드를 참조하면 된다.


== 좌측값, 우측값 ==
C++ 표준 입출력에서는 입출력을 위한 여러 객체나 함수를 제공하는데 대표적으로 cout, cin, endl등이 있다.
C++11이 제정되며 강조되는 개념이다. '''절대로 없던게 아니다!''' C부터 있던 유서깊은(?) 개념이다.
위의 소스코드에서 쓰인 cout객체는 콘솔 화면 상에 문자열을 출력하는 기능을 가지고 있다(cout를 console out로 이해하면 편하다). cout 객체의 사용방법은 cout객체와 출력하려는 대상을 << 연산자로 연결하는 것이다.
출력 대상에는 문자열, 정수, 실수, 문자 등이 있고 << 연산자는 비트연산자가 아님을 주의한다.
또한 endl은 개행(endl을 end line으로 이해하면 편하다)의 기능을 하는 객체이다.
이 객체는 cout 객체 뒤에 전달할 수 있으며 이스케이프 시퀀스 \n로 대체가 가능하다(물론 따옴표 안에 묶어야 한다).
따라서


좌측값(L-Value)는 변수나 변수의 주소 등 확실하게 ''메모리에 위치한 주소''를 가진 변수이다. C에서 사용되던 일반적인 변수를 떠올리면 된다. 반면, 우측값(R-Value)는 그 외의 모든 ''임시변수''와 ''메모리에 위치하지 않은 것들''인 상수를 포함한다. 임시변수에 대한 자세한 개념은 [[추가바람]]. 더욱 엄밀하게 말하자면, 좌측값은 '''식 한 줄이 실행된 후에도 남아있는 값'''이고, 우측값은 '''식 한 줄이 실행되고 나면 소멸하는 값'''이다.
<syntaxhighlight lang=cpp>
std::cout<<"Hello World"<<std::endl;
</syntaxhighlight>


사실, 좌측값, 우측값이란 이름은 대입 연산자를 기준으로 올 수 있는 방향에 따라 지어졌다. 좌측값은 대입 연산자 왼쪽, 오른쪽 다 올 수 있지만, '''우측값은 오른쪽에만''' 올 수 있다. 따라서, 대입 연산자 '''왼쪽에는 좌측값만''' 올 수 있다. 또한, 좌측값은 메모리상에 위치한 주소가 정해져 있으므로 변수로 선언할 수 있지만, 우측값은 그러지 못한다. 그러나, 함수의 인자로 오거나 반환값으로 오는 것은 가능하다. 앞으로 후술할 템플릿에도 사용할 수 있다.
은 다음 문장과 완벽하게 똑같다.


이 개념을 직접 언어적 측면에서 도입함으로써, C++은 임시변수의 생성을 위한 메모리와 시간을 절약할 수 있게 되었다.
<syntaxhighlight lang=cpp>
std::cout<<"Hello World\n";
</syntaxhighlight>


== 레퍼런스 ==
이쯤에서 cout 앞에 쓰인 std라는 것의 정체가 궁금할 것이다. 이것은 이름공간(name space)라는 것인데, 여러분들이 정의한 객체나 함수가 헤더에 존재하는 것과 이름이 중복된다면 곤란해지므로 이것을 방지하기 위해 만들어진 개념이다.
대놓고 이름만 봐도 참조에 의한 호출(Call-by-Reference)<ref>주소를 저장하는 변수의 종류인 포인터, 레퍼런스를 이용해서 그 주소에 위치한 값을 호출하는 방식, 값에 의한 호출(Call-by-Value)와는 반대개념</ref>에서 사용하기 위해 만들어낸 개념이라는 것을 알 수 있다. 포인터가 있는데 굳이 레퍼런스를 만든 이유는 모르겠으나<ref>[[추가바람]]</ref>, 오로지 참조에 의한 호출만을 사용하기 위해 디자인되었다는 점은 확실하다.
이름공간안에 묶인 객체나 함수를 사용하기 위해서는 항상 앞에 이름공간의 경로를 명시해야 하며 경로를 연결하는 연산자는 :: 연산자이다.


사용법을 포인터와 비교하면 다음과 같다.
std::를 일일이 붙이는 것도 꽤 번거로운 일이지만 이는 어느 정도 감수할 수 있다.
<source lang=cpp>
그러나 cout객체의 경로가 aaa::bbb::ccc::ddd::eee라고 한다면 번거로운 것은 물론이고 가독성까지 떨어지기 때문에 적당한 생략이 필요하다. 그래서 존재하는 것이 바로 using 이다. 이름 공간의 경로를 using 하나만 사용한다면 통째로 생략하는 게 가능해진다.
int q;
int *p;// 포인터, 가능
int &p;// 레퍼런스, 불가능, 선언시 초기화해야 함
int *p = &q;// 포인터, 가능
int &p = q;// 레퍼런스, 가능
</source>


가장 많이 쓰이는, 함수에서의 사용 예는 다음과 같다.
앞의 예제를 보면
<source lang=cpp>
int f(const int n);// 임시값, 반환도 임시값
int f(const int& n);// 좌측값, 반환은 임시값
int f(const int&& n);// 우측값, 반환은 임시값


int& f(const int n);// 임시값, 반환은 좌측값
using namespace std;
int& f(const int& n);// 좌측값, 반환도 좌측값
int& f(const int&& n);// 우측값, 반환은 좌측값


int&& f(const int n);// 임시값, 반환은 우측값
라고 적혀 있을 것이다. 이것은 '이름공간 std에 들어 있는 모든 객체나 함수는 이름공간을 생략하고 쓰겠다'라는 선언이다.
int&& f(const int& n);// 좌측값, 반환은 우측값
하지만 using을 남용하면 이름 충돌 위험성이 있기 때문에 별로 좋은 코딩 습관은 아니다.
int&& f(const int&& n);// 우측값, 반환도 우측값
위처럼 std::를 꼬박꼬박 붙여주거나 사용할 객체만 골라서 using std::cout; 와 같이 선언하면 된다.
</source>


== 이름공간 ==
== 데이터형 ==
그동안 사용하던 static 키워드에서 탈피할 수 있게 해주는 표준 문법이다. static은 해당 파일에서만 전역인 것처럼 사용할 수 있게 하였지만, 이름공간은 무려, 인클루드만 해주면 '''어디에서나''' 사용할 수 있다! 심지어 변수, 함수, 클래스 등을 '''용도별로''' 모을 수도 있다.
== 제어문 ==
== 함수 ==
== 참조형(레퍼런스) ==
=== 포인터와 참조형의 차이 ===


가장 대표적인 이름공간으로, C++ 표준 라이브러리의 이름공간인 std가 있다.
== 동적할당 ==
== 객체지향 기초 ==
=== struct ===
=== struct의 확장 class ===
==== 구조체에 함수를 추가 ====
=== 생성자와 소멸자 ===


== 공용체, 열거형 ==
=== 접근지정자 ===


== 클래스 ==
== 예외처리 ==
== 예외처리 ==
== 템플릿 ==
== 람다 ==
== 고급 과정 ==
== 고급 과정 ==
 
* [[C++/STL|STL]]
{{둘러보기 상자
* [[C++/CLI]]
| 이름 = 쉽게 배우는 프로그래밍 입문/C++
-->
| 제목 = [[쉽게 배우는 프로그래밍 입문]]
{{각주}}
| 내용속성 = hlist
[[분류:프로그래밍 시리즈|C++]]
| 내용1 =
[[분류:C++]]
*[[쉽게 배우는 프로그래밍 입문/파이썬|Python]]
*[[쉽게 배우는 프로그래밍 입문/Java|Java]]
*[[쉽게 배우는 프로그래밍 입문/웹 클라이언트 디자인|HTML/CSS/JavaScript]]
*[[쉽게 배우는 프로그래밍 입문/SQL|SQL]]
*[[쉽게 배우는 프로그래밍 입문/C|C]]
*[[쉽게 배우는 프로그래밍 입문/C++|C++]]
*[[쉽게 배우는 프로그래밍 입문/C 샵|C#]]
}}

2022년 8월 28일 (일) 23:30 기준 최신판

문서의 내용이 너무 쉬워서 오늘부터 프로그래밍 할 수 있을 것 같습니다.

이 문서에는 독자적으로 연구한 내용이 들어갑니다. 다른 사람의 의견을 존중하면서 무례하지 않도록 작성해 주시고, 의견 충돌 시 토론 문서에서 토론해 주세요.
리브레 프로그래밍 시리즈
초급
프로그래밍
중급
프로그래밍
고급
프로그래밍
Python
협업


이번에는 C++에 대해서 배우실 차례입니다.

C++에 대한 설명은 리브레의 C++항목을 보시길 바랍니다.

본 문서에서는 파이썬과의 차이점을 들면서 C++을 알려드리겠습니다.

개발환경 설치[편집 | 원본 편집]

본 강좌에서는 CodeBlocks라는 리눅스, 윈도우, 맥을 다 지원하는 C/C++용 IDE(컴파일러 + 편집기)을 사용할께요

윈도우[편집 | 원본 편집]

다운로드 링크 을 눌러서 CodeBlocks를 설치하시면 됩니다.

리눅스[편집 | 원본 편집]

우분투[편집 | 원본 편집]

sudo apt-get install codeblocks를 입력하여 설치합니다.

OSX[편집 | 원본 편집]

여기에서 다운 받으면 됩니다.(개발자가 부족해서 16.01은 아직 안 된다고 하네요)

코드블럭 실행[편집 | 원본 편집]

Codeblocks-1.PNG

실행을 하면 이렇게 창이 뜹니다. 컴파일러를 선택하라는 창이지만 OK버튼을 눌러 다음으로 넘어 간다.

Codeblocks-2.PNG

다음은 소스파일과 프로젝트 파일 확장자를 코드블럭으로 연결할 것이냐는 질문이다.(C/CPP 코드블럭 프로젝트 파일등)

다른 컴파일러가 없을 경우 그냥 OK를 누르고, 없을 경우 1번째 체크박스을 선택한 후 OK버튼을 누른다.

Codeblocks-3.PNG

프로젝트를 생성할 경우 File -> New -> Project를 누르면 된다.

Codeblocks-4.PNG

Console Application을 누르고 OK를 누른다

Codeblocks-5.PNG

Next를 눌러 다음으로 넘어 간다.

Codeblocks-6.PNG

C++을 누르고 Next를 누른다.

Codeblocks-7.PNG

  1. 프로젝트 이름
  2. 프로젝트 폴더가 저장될 위치중요
  3. 실제 프로젝트가 저장될 위치

처음 만지는 분이 프로젝트 폴더가 저장될 위치를 지정하지 않고 Next를 눌러 꼬이는 경우가 많다. 꼭 파랑색 원이 그려진 버튼을 눌러서 폴더를 정한 다음에 Next를 누른다.


Codeblocks-8.PNG

완료가 되면 다음과 같이 프로젝트와 소스 파일 하나가 생긴다.

Hello, World![편집 | 원본 편집]

#include <iostream>

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

파이썬과의 차이점[편집 | 원본 편집]

우선 너무 달라서 공통점이 없어 보이기는 하지만 몇가지 공통점이 보인다

  1. 뭔가 친숙한 문자열인 "(쌍따옴표)가 보인다
  2. 뭔가 int라는 게 보인다.

하지만 차이점이 더 많이 보이는데 파이썬과 차이점을 보자면 다음과 같다.

  1. 파이썬에서 탭으로 구분했던 함수의 시작과 끝을 {}(중괄호)로 구분한다.
  2. 각 명령문이 끝나면 ;을 붙여야 한다.
  3. 함수 선언이 def로 시작하지 않는다.

이다.

우선 파이썬과 달리 C++는 프로그램의 시작점이라는 것이 필요하다. 파이썬의 경우 시작점이 코드의 첫줄이라면, C++의 프로그램의 시작점은 바로 이름이 main인 함수이다. 프로그램이 시작되면 main함수이 호출되고 프로그램이 동작한다.

또한 코드의 첫줄에 #include <iostream>이라는 문장이 보인다. 당장은 정확히 알 필요없이 터미널/콘솔에 출력하려면 필요하다라는 것만 알면 된다.

프로그램이 시작되면 main함수가 시작되므로 main함수 안을 보자. 한 문장만이 보인다.

std::cout<<"Hello, World!"<<std::endl;

std는 standard의 약자이며, cout은 console output이라는 약자이고. endl는 end line의 약자이다. 즉, std::cout은 표준으로 정해진 콘솔에 출력이라는 것이며, std::endl은 줄을 끝낸다, 즉 다음 줄로 넘어간다는 뜻이 된다.

변수[편집 | 원본 편집]

C++의 변수와 파이썬의 변수는 그 의미와 사용용도는 같지만, 중요한 차이점이 몇가지 있다

  1. C++의 변수는 파이썬의 변수와 달리 선언이라는 것이 필요하다.
  2. C++의 변수는 파이썬의 변수와 달리 한번 정해진 데이터형(변수형)에서 바뀌지 않는다.

파이썬의 변수는 다음과 같이 선언하면 되었다.

변수 = 1

하지만 C++에서 변수는 다음과 같이 선언한다.

int var = 1

해석을 하자면 다음과 같다. int라는 데이터 형인 var이라는 변수를 만들고, 1이라는 값을 넣는다. 또는 var은 1이고, 숫자다.[1][2] 한편 이렇게 변수의 선언시 정해진 데이터형에서 다른 데이터형으로 중간에 바뀔 수 없다.

데이터형[편집 | 원본 편집]

C++는 컴퓨터와 매우 가까운 언어이다. 따라서 컴퓨터의 환경에 따라서 여러 가지가 바뀔 수 있는데, 데이터형이 특히 그러하다. 우선은 32비트를 기준으로 설명한 뒤, 64비트 CPU와 차이점이 있는 데이터형만 추가로 서술한다.

정수형[편집 | 원본 편집]

가장 많이 쓰이는 데이터형이다. 정수형이란, 소수점 아랫자리가 없는 데이터형을 말한다. 파이썬에서 정수형은 오직 크기가 하나밖에 없었지만, C++에서는 그 용도에 맞추어 사용하라는 뜻에서 다양한 크기를 가진 정수형이 존재한다.

데이터형 이름 bool char short int long
변수 크기 1비트(1바이트) 1바이트(8비트) 2바이트(16비트) 4바이트(32비트) 4바이트(32비트)
표현가능 범위 false, true -128 ~ 127 -32768~32767 -2147483648~2147483647 -2147483648~2147483647
간단한 뜻 진위값 문자 작은 숫자 숫자 큰 숫자

이중 long형의 경우 64비트 기계어로 번역될 경우에는 운영체제마다 그 크기가 다른데, 윈도우의 경우에는 4바이트, 리눅스의 경우에는 8바이트이다.

실수형[편집 | 원본 편집]

실수형이란 소수점이 붙은 수를 말한다. 컴퓨터에서 실수를 메모리에 저장할 때는 부동 소수점표기 방식을 사용한다.

부동소수점 이란 수학으로 보자면 지수방식으로 실수를 표기하는 것과 같다. 1.123123 x 10^2이런 식으로요, 다만 10^n승이 아니라 2^n으로 표기한다는게 차이점이다.

변수명 float double long double
데이터형 크기 4바이트 8바이트 8바이트 이상

문자형[편집 | 원본 편집]

String 형입니다. string a="김바보"이런 식으로 사용할 수 있습니다. 사실 String은 사용자 정의 타입이기 때문에 더 기능이 있는데, 나중에 알아보도록 합시다.

형변환[편집 | 원본 편집]

형변환(casting)은 다른 데이터형으로 변환하는 것을 말한다.

묵시적 형변환[편집 | 원본 편집]

묵시적 형변환이란 변수를 사용하여 셈을 할 때, 프로그래머가 코드로 이 값을 이 데이터형으로 바꿔라라고 작성하지 않았지만 컴파일러가 이 값을 이 값이란 셈을 하려면 이런 데이터형으로 변환해야 하겠구나라는 판단을 내리고 데이터형을 바꾸는 것을 말한다. 묵시적 형변환은 다음과 같은 우선 순위를 갖는다.

  1. double
  2. float
  3. long
  4. int

왜 다른 데이터형 bool, char, short은 없는가 하면 이들은 다른 데이터형과 셈을 할 때 int형으로 형변환이 된다.

명시적 형변환[편집 | 원본 편집]

각주

  1. 저 숫자다 부분은 생략해서 생각하고 필요할 때 다시 떠올려 봐도 된다.
  2. 쉽게 해석했을 때