편집을 취소할 수 있습니다. 이 편집을 되돌리려면 아래의 바뀐 내용을 확인한 후 게시해주세요.
최신판 | 당신의 편집 | ||
1번째 줄: | 1번째 줄: | ||
{{작성중}} | |||
== 새 표준 입출력 == | == 새 표준 입출력 == | ||
iostream을 인클루드하고 사용한다. 표준 라이브러리에서는 더 이상 C에서 쓰이던 확장자 h를 쓰지 않는다. C++ 라이브러리 헤더는 그대로 확장자 없이 쓰면 되며, C 헤더의 경우는 cstdio처럼 앞에 c를 붙인채 사용하면 된다. 이름 공간은 std. | iostream을 인클루드하고 사용한다. 표준 라이브러리에서는 더 이상 C에서 쓰이던 확장자 h를 쓰지 않는다. C++ 라이브러리 헤더는 그대로 확장자 없이 쓰면 되며, C 헤더의 경우는 cstdio처럼 앞에 c를 붙인채 사용하면 된다. 이름 공간은 std. | ||
=== 표준 출력 === | === 표준 출력 === | ||
< | <source lang=cpp> | ||
std::cout << [기본 자료형 변수/상수]; | std::cout << [기본 자료형 변수/상수]; | ||
</ | </source> | ||
기본적으로 이 형식으로 사용한다. 기본 자료형이 아닌 구조체, 클래스 등은 후술할 [[오버로딩]] 참고. | 기본적으로 이 형식으로 사용한다. 기본 자료형이 아닌 구조체, 클래스 등은 후술할 [[오버로딩]] 참고. | ||
< | <source lang=cpp> | ||
std::cout << [출력 대상] << [출력 대상] << ... | std::cout << [출력 대상] << [출력 대상] << ... | ||
</ | </source> | ||
이렇게 여러 대상의 출력을 한 줄에 작성할 수 있다. | 이렇게 여러 대상의 출력을 한 줄에 작성할 수 있다. | ||
< | <source lang=cpp> | ||
std::cout << ... << std::endl; | std::cout << ... << std::endl; | ||
</ | </source> | ||
이렇게 작성하면 중간의 출력대상을 모두 출력한 후 한 줄을 강제 개행한다. | 이렇게 작성하면 중간의 출력대상을 모두 출력한 후 한 줄을 강제 개행한다. | ||
=== 표준 입력 === | === 표준 입력 === | ||
36번째 줄: | 37번째 줄: | ||
사용법을 포인터와 비교하면 다음과 같다. | 사용법을 포인터와 비교하면 다음과 같다. | ||
< | <source lang=cpp> | ||
int q; | int q; | ||
int *p;// 포인터, 가능 | int *p;// 포인터, 가능 | ||
42번째 줄: | 43번째 줄: | ||
int *p = &q;// 포인터, 가능 | int *p = &q;// 포인터, 가능 | ||
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);// 좌측값, 반환은 임시값 | ||
57번째 줄: | 58번째 줄: | ||
int&& f(const int& n);// 좌측값, 반환은 우측값 | int&& f(const int& n);// 좌측값, 반환은 우측값 | ||
int&& f(const int&& n);// 우측값, 반환도 우측값 | int&& f(const int&& n);// 우측값, 반환도 우측값 | ||
</ | </source> | ||
== 이름공간 == | == 이름공간 == | ||
67번째 줄: | 68번째 줄: | ||
용법은 다음과 같다. | 용법은 다음과 같다. | ||
< | <source lang=cpp> | ||
namespace A{ // 여기까지가 namespace 시작부분 | namespace A{ // 여기까지가 namespace 시작부분 | ||
} // 여기만 namespace 종결부분 | } // 여기만 namespace 종결부분 | ||
82번째 줄: | 83번째 줄: | ||
namespace{ } // 이름이 없는 경우, 전역취급. 접근자는 이름이 없으므로 ::[멤버명] | namespace{ } // 이름이 없는 경우, 전역취급. 접근자는 이름이 없으므로 ::[멤버명] | ||
</ | </source> | ||
== 공용체, 열거형 == | == 공용체, 열거형 == | ||
공용체의 경우 클래스와 비슷하게 생성자와 소멸자를 사용할 수 있게 되었고, 이름없는 공용체도 만들 수 있다. 다만, C 수준에서 공용체를 다룰 기회가 좀 있었던 것에 비하면, C++의 경우 대부분 low-level 부분에 C 라이브러리를 쓰는 경우가 많아 C++에서 확장된 공용체를 쓸 일은 거의 없다. | 공용체의 경우 클래스와 비슷하게 생성자와 소멸자를 사용할 수 있게 되었고, 이름없는 공용체도 만들 수 있다. 다만, C 수준에서 공용체를 다룰 기회가 좀 있었던 것에 비하면, C++의 경우 대부분 low-level 부분에 C 라이브러리를 쓰는 경우가 많아 C++에서 확장된 공용체를 쓸 일은 거의 없다. | ||
열거형은 열거 클래스라는 기존 열거형을 확장한 형태를 사용할 수 있게 되었다. | |||
< | <source lang=cpp> | ||
enum class A : int | enum class A : int | ||
{ | { | ||
94번째 줄: | 95번째 줄: | ||
SECOND = 2 | SECOND = 2 | ||
}; | }; | ||
</ | </source> | ||
== | == 객체 == | ||
C언어의 구조체(struct)를 기억하는가? C언어의 구조체는 다음과 같은 구조이다. | C언어의 구조체(struct)를 기억하는가? C언어의 구조체는 다음과 같은 구조이다. | ||
< | <source lang=cpp> | ||
struct | struct A | ||
{ | { | ||
int | int x; | ||
int | int y; | ||
}; | }; | ||
</ | </source> | ||
즉 구조체 안에는 변수를 선언할 수 있다. | 즉 구조체 안에는 변수를 선언할 수 있다. 그런데 C++에서는 struct에 변수 뿐만 아니라 함수의 선언도 허용하고 있다. 즉 다음과 같은 코딩이 가능하다. | ||
그런데 | |||
< | <source lang=cpp> | ||
#include<iostream> | #include<iostream> | ||
struct | struct A | ||
{ | { | ||
int | int x; | ||
int | int y; | ||
void | void func(){ | ||
std::cout<< | std::cout<<x<<y<<std::endl; | ||
} | } | ||
}; | }; | ||
132번째 줄: | 125번째 줄: | ||
int main() | int main() | ||
{ | { | ||
A a={1, 2}; | |||
a. | a.func(); | ||
return 0; | return 0; | ||
} | } | ||
</ | </source> | ||
이 코드를 자세히 보면 struct 내부에 함수의 선언이 가능할 뿐만 아니라, 구조체 자료형의 선언 방법도 C와 다르다. C에서라면 struct | 이 코드를 자세히 보면 struct 내부에 함수의 선언이 가능할 뿐만 아니라, 구조체 자료형의 선언 방법도 C와 다르다. C에서라면 struct A a라고 선언했겠지만, C++에서는 A a라고 선언하는 것을 허용한다. 또한 struct A 내부의 함수인 func는 main 함수에서 마치 구조체 내부의 변수처럼 a 뒤에 점(.)만 찍으면 접근할 수 있다. | ||
이것이 C++에서 struct의 새로운 기능이다. 또한 여기서 a와 같은 것들을 객체(오브젝트)라고 부른다. | 이것이 C++에서 struct의 새로운 기능이다. 또한 여기서 a와 같은 것들을 객체(오브젝트)라고 부른다. | ||
한편 c++에서는 '접근지정자'라는 것을 struct 안에 넣을 수 있다. 다음 코드를 보자. | |||
< | <source lang=cpp> | ||
#include<iostream> | #include<iostream> | ||
struct | struct A | ||
{ | { | ||
int | private: | ||
int | int x; | ||
void | int y; | ||
std::cout<< | public: | ||
void func(){ | |||
std::cout<<x<<y<<std::endl; | |||
} | } | ||
}; | }; | ||
161번째 줄: | 152번째 줄: | ||
int main() | int main() | ||
{ | { | ||
A a={1, 2}; | |||
/* | /* | ||
a.x= | a.x=0; | ||
*/ | */ | ||
//↑ 컴파일 에러 발생 | //↑ 컴파일 에러 발생 | ||
a. | a.func(); | ||
return 0; | return 0; | ||
} | } | ||
</ | </source> | ||
이 코드에서는 a. | 이 코드에서는 a.x에 0을 대입하면 컴파일 오류가 뜨는데, private는 아래에 선언된 변수와 함수들이 오직 같은 struct 내부에서만 접근 가능하도록 한다. 따라서 func함수는 x와 y에 접근할 수 있지만 이 struct 밖에 있는 main 함수에서는 x에 접근할 수 없는 것이다. public은 아래에 선언된 변수와 함수들이 struct 밖에서도 접근 가능하도록 한다. 또한 private와 public 외에도 protected라는 것이 있는데, 이것은 상속을 배우고 나서야 이해되는 개념이니 일단은 더이상의 자세한 설명은 생략하겠다. | ||
그리고 c++에서는 struct 대신에 class라고 쓸 수 있다. | 그리고 c++에서는 struct 대신에 class라고 쓸 수 있다. | ||
즉 위의 코드를 | 즉 위의 코드를 | ||
< | <source lang=cpp> | ||
#include<iostream> | #include<iostream> | ||
class A | |||
{ | { | ||
int | private: | ||
int | int x; | ||
void | int y; | ||
std::cout<< | public: | ||
void func(){ | |||
std::cout<<x<<y<<std::endl; | |||
} | } | ||
}; | }; | ||
190번째 줄: | 182번째 줄: | ||
int main() | int main() | ||
{ | { | ||
A a={1, 2}; | |||
a.func(); | |||
return 0; | return 0; | ||
} | } | ||
</ | </source> | ||
이렇게도 쓸 수 있는 것이다. 단지 struct를 class로 교체한 것 뿐이지만, 두 코드는 완벽하게 기능이 똑같다. 물론 struct와 class에도 기능의 차이는 있는데, struct는 기본으로 설정된 접근지정자가 public이지만 class는 private이다. | 이렇게도 쓸 수 있는 것이다. 단지 struct를 class로 교체한 것 뿐이지만, 두 코드는 완벽하게 기능이 똑같다. 물론 struct와 class에도 기능의 차이는 있는데, struct는 기본으로 설정된 접근지정자가 public이지만 class는 private이다. | ||
200번째 줄: | 192번째 줄: | ||
즉 | 즉 | ||
< | <source lang=cpp> | ||
struct | struct A | ||
{ | { | ||
int x; | |||
int y; | |||
}; | }; | ||
</ | </source> | ||
위의 코드는 | 위의 코드는 | ||
< | <source lang=cpp> | ||
struct | struct A | ||
{ | { | ||
public: | public: | ||
int | int x; | ||
int | int y; | ||
}; | }; | ||
</ | </source> | ||
< | <source lang=cpp> | ||
class | class A | ||
{ | { | ||
public: | public: | ||
int | int x; | ||
int | int y; | ||
}; | }; | ||
</ | </source> | ||
이 두 코드와 완전하게 같은 기능을 가지며, | 이 두 코드와 완전하게 같은 기능을 가지며, | ||
< | <source lang=cpp> | ||
class | class A | ||
{ | { | ||
int | int x; | ||
int | int y; | ||
}; | }; | ||
</ | </source> | ||
위의 코드는 | 위의 코드는 | ||
< | <source lang=cpp> | ||
class | class A | ||
{ | { | ||
private: | private: | ||
int | int x; | ||
int | int y; | ||
}; | }; | ||
</ | </source> | ||
< | <source lang=cpp> | ||
struct | struct A | ||
{ | { | ||
private: | private: | ||
int | int x; | ||
int | int y; | ||
}; | }; | ||
</ | </source> | ||
이 두 코드와 완벽하게 같은 기능을 제공한다. 차이는 오직 이것 뿐이다. | 이 두 코드와 완벽하게 같은 기능을 제공한다. 차이는 오직 이것 뿐이다. | ||
265번째 줄: | 258번째 줄: | ||
=== 용어 === | === 용어 === | ||
=== 접근지정자 === | === 접근지정자 === | ||
=== const 멤버 === | === const 멤버 === | ||
=== static 멤버 === | === static 멤버 === | ||
351번째 줄: | 288번째 줄: | ||
=== 람다와 함수 포인터 === | === 람다와 함수 포인터 === | ||
=== 람다의 사용법 === | === 람다의 사용법 === | ||
[[분류: | [[분류:쉽게 알 수 있다 시리즈]] | ||
== 참고 자료 == | == 참고 자료 == | ||
https://msdn.microsoft.com/en-us/library/3bstk3k5.aspx | https://msdn.microsoft.com/en-us/library/3bstk3k5.aspx |