시리즈:중급 프로그래밍 시리즈/C++/문법 편집하기

편집하면 당신의 IP 주소가 공개적으로 기록됩니다. 계정을 만들고 로그인하면 편집 시 사용자 이름만 보이며, 위키 이용에 여러 가지 편의가 주어집니다.

편집을 취소할 수 있습니다. 이 편집을 되돌리려면 아래의 바뀐 내용을 확인한 후 게시해주세요.

최신판 당신의 편집
1번째 줄: 1번째 줄:
{{작성중}}
== 새 표준 입출력 ==
== 새 표준 입출력 ==
iostream을 인클루드하고 사용한다. 표준 라이브러리에서는 더 이상 C에서 쓰이던 확장자 h를 쓰지 않는다. C++ 라이브러리 헤더는 그대로 확장자 없이 쓰면 되며, C 헤더의 경우는 cstdio처럼 앞에 c를 붙인채 사용하면 된다. 이름 공간은 std.
iostream을 인클루드하고 사용한다. 표준 라이브러리에서는 더 이상 C에서 쓰이던 확장자 h를 쓰지 않는다. C++ 라이브러리 헤더는 그대로 확장자 없이 쓰면 되며, C 헤더의 경우는 cstdio처럼 앞에 c를 붙인채 사용하면 된다. 이름 공간은 std.
=== 표준 출력 ===
=== 표준 출력 ===
<syntaxhighlight lang=cpp>
<source lang=cpp>
std::cout << [기본 자료형 변수/상수];
std::cout << [기본 자료형 변수/상수];
</syntaxhighlight>
</source>
기본적으로 이 형식으로 사용한다. 기본 자료형이 아닌 구조체, 클래스 등은 후술할 [[오버로딩]] 참고.
기본적으로 이 형식으로 사용한다. 기본 자료형이 아닌 구조체, 클래스 등은 후술할 [[오버로딩]] 참고.


<syntaxhighlight lang=cpp>
<source lang=cpp>
std::cout << [출력 대상] << [출력 대상] << ...
std::cout << [출력 대상] << [출력 대상] << ...
</syntaxhighlight>
</source>
이렇게 여러 대상의 출력을 한 줄에 작성할 수 있다.
이렇게 여러 대상의 출력을 한 줄에 작성할 수 있다.


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


사용법을 포인터와 비교하면 다음과 같다.
사용법을 포인터와 비교하면 다음과 같다.
<syntaxhighlight lang=cpp>
<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;// 레퍼런스, 가능
</syntaxhighlight>
</source>


가장 많이 쓰이는, 함수에서의 사용 예는 다음과 같다.
가장 많이 쓰이는, 함수에서의 사용 예는 다음과 같다.
<syntaxhighlight lang=cpp>
<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);// 우측값, 반환도 우측값
</syntaxhighlight>
</source>


== 이름공간 ==
== 이름공간 ==
67번째 줄: 68번째 줄:


용법은 다음과 같다.
용법은 다음과 같다.
<syntaxhighlight lang=cpp>
<source lang=cpp>
namespace A{  // 여기까지가 namespace 시작부분
namespace A{  // 여기까지가 namespace 시작부분
}  // 여기만 namespace 종결부분
}  // 여기만 namespace 종결부분
82번째 줄: 83번째 줄:


namespace{ }  // 이름이 없는 경우, 전역취급. 접근자는 이름이 없으므로 ::[멤버명]
namespace{ }  // 이름이 없는 경우, 전역취급. 접근자는 이름이 없으므로 ::[멤버명]
</syntaxhighlight>
</source>


== 공용체, 열거형 ==
== 공용체, 열거형 ==
공용체의 경우 클래스와 비슷하게 생성자와 소멸자를 사용할 수 있게 되었고, 이름없는 공용체도 만들 수 있다. 다만, C 수준에서 공용체를 다룰 기회가 좀 있었던 것에 비하면, C++의 경우 대부분 low-level 부분에 C 라이브러리를 쓰는 경우가 많아 C++에서 확장된 공용체를 쓸 일은 거의 없다.
공용체의 경우 클래스와 비슷하게 생성자와 소멸자를 사용할 수 있게 되었고, 이름없는 공용체도 만들 수 있다. 다만, C 수준에서 공용체를 다룰 기회가 좀 있었던 것에 비하면, C++의 경우 대부분 low-level 부분에 C 라이브러리를 쓰는 경우가 많아 C++에서 확장된 공용체를 쓸 일은 거의 없다.


C++11에서 열거형은 열거 클래스라는 기존 열거형을 확장한 형태를 사용할 수 있게 되었다. Int로 자동 형변환이 되지 않는다는 특징이 있다.
열거형은 열거 클래스라는 기존 열거형을 확장한 형태를 사용할 수 있게 되었다.
<syntaxhighlight lang=cpp>
<source lang=cpp>
enum class A : int
enum class A : int
{
{
94번째 줄: 95번째 줄:
     SECOND = 2
     SECOND = 2
};
};
</syntaxhighlight>
</source>


== 클래스 ==
== 객체 ==
C언어의 구조체(struct)를 기억하는가? C언어의 구조체는 다음과 같은 구조이다.
C언어의 구조체(struct)를 기억하는가? C언어의 구조체는 다음과 같은 구조이다.


<syntaxhighlight lang=cpp>
<source lang=cpp>
struct Time
struct A
{
{
int minute;
int x;
int second;
int y;
};
};
</syntaxhighlight>
</source>


즉 구조체 안에는 변수를 선언할 수 있다.
즉 구조체 안에는 변수를 선언할 수 있다. 그런데 C++에서는 struct에 변수 뿐만 아니라 함수의 선언도 허용하고 있다. 즉 다음과 같은 코딩이 가능하다.
그리고 우리는 구조체를 사용해 이런 함수를 사용한다.
<syntaxhighlight lang=cpp>
void printtime(struct A& b)
{
std::cout<<Time.minute<<Time.second<<std::endl;
}
</syntaxhighlight>
그런데 어차피 구조체와 밀접한 관련이 있는 함수, 합치는게 좋지 않을까? 그래서 C++에서는 struct에 변수 뿐만 아니라 함수의 선언도 허용하고 있다. 즉 다음과 같은 코딩이 가능하다.




<syntaxhighlight lang=cpp>
<source lang=cpp>
#include<iostream>
#include<iostream>


struct Time
struct A
{
{
int minute;
int x;
int second;
int y;
void printtime(){
void func(){
std::cout<<minute<<second<<std::endl;
std::cout<<x<<y<<std::endl;
}
}
};
};
132번째 줄: 125번째 줄:
int main()
int main()
{
{
Tine a={1, 30};
A a={1, 2};
a.printtime();
a.func();
return 0;
return 0;
}
}
</syntaxhighlight>
</source>


이 코드를 자세히 보면 struct 내부에 함수의 선언이 가능할 뿐만 아니라, 구조체 자료형의 선언 방법도 C와 다르다. C에서라면 struct Time a라고 선언했겠지만, C++에서는 Time a라고 선언하는 것을 허용한다. 또한 struct Time 내부의 함수인 func는 main 함수에서 마치 구조체 내부의 변수처럼 a 뒤에 점(.)만 찍으면 접근할 수 있다.
이 코드를 자세히 보면 struct 내부에 함수의 선언이 가능할 뿐만 아니라, 구조체 자료형의 선언 방법도 C와 다르다. C에서라면 struct A a라고 선언했겠지만, C++에서는 A a라고 선언하는 것을 허용한다. 또한 struct A 내부의 함수인 func는 main 함수에서 마치 구조체 내부의 변수처럼 a 뒤에 점(.)만 찍으면 접근할 수 있다.
이것이 C++에서 struct의 새로운 기능이다. 또한 여기서 a와 같은 것들을 객체(오브젝트)라고 부른다.
이것이 C++에서 struct의 새로운 기능이다. 또한 여기서 a와 같은 것들을 객체(오브젝트)라고 부른다.
그런데 실수를 해서
한편 c++에서는 '접근지정자'라는 것을 struct 안에 넣을 수 있다. 다음 코드를 보자.
<syntaxhighlight lang=cpp>
a.second=600;
</syntaxhighlight>
그래서 c++에서는 '접근지정자'라는 것을 struct 안에 넣을 수 있다. 다음 코드를 보자.




<syntaxhighlight lang=cpp>
<source lang=cpp>
#include<iostream>
#include<iostream>


struct Time
struct A
{
{
int minute;
private:
int second;
int x;
void printtime(){
int y;
std::cout<<minute<<second<<std::endl;
public:
void func(){
std::cout<<x<<y<<std::endl;
}
}
};
};
161번째 줄: 152번째 줄:
int main()
int main()
{
{
Time a={1, 2};
A a={1, 2};
         /*
         /*
         a.x=600;
         a.x=0;
         */
         */
         //↑ 컴파일 에러 발생
         //↑ 컴파일 에러 발생
a.printtime();
a.func();
return 0;
return 0;
}
}
</syntaxhighlight>
</source>


이 코드에서는 a.second에 0을 대입하면 컴파일 오류가 뜨는데, private는 아래에 선언된 변수와 함수들이 오직 같은 struct 내부에서만 접근 가능하도록 한다. 따라서 printtime함수는 x와 y에 접근할 수 있지만 이 struct 밖에 있는 main 함수에서는 x에 접근할 수 없는 것이다. 즉, 원하지 않는 데이터 번경을 막아 줄 수 있으므로 데이터 멤버는 private로 하는 것이 좋다. public은 아래에 선언된 변수와 함수들이 struct 밖에서도 접근 가능하도록 한다. 또한 private와 public 외에도 protected라는 것이 있는데, 이것은 상속을 배우고 나서야 이해되는 개념이니 일단은 더이상의 자세한 설명은 생략하겠다.
이 코드에서는 a.x에 0을 대입하면 컴파일 오류가 뜨는데, private는 아래에 선언된 변수와 함수들이 오직 같은 struct 내부에서만 접근 가능하도록 한다. 따라서 func함수는 x와 y에 접근할 수 있지만 이 struct 밖에 있는 main 함수에서는 x에 접근할 수 없는 것이다. public은 아래에 선언된 변수와 함수들이 struct 밖에서도 접근 가능하도록 한다. 또한 private와 public 외에도 protected라는 것이 있는데, 이것은 상속을 배우고 나서야 이해되는 개념이니 일단은 더이상의 자세한 설명은 생략하겠다.


그리고 c++에서는 struct 대신에 class라고 쓸 수 있다.
그리고 c++에서는 struct 대신에 class라고 쓸 수 있다.
즉 위의 코드를
즉 위의 코드를


<syntaxhighlight lang=cpp>
<source lang=cpp>
#include<iostream>
#include<iostream>
 
class A
struct Time
{
{
int minute;
private:
int second;
int x;
void printtime(){
int y;
std::cout<<minute<<second<<std::endl;
public:
void func(){
std::cout<<x<<y<<std::endl;
}
}
};
};
190번째 줄: 182번째 줄:
int main()
int main()
{
{
Tine a={1, 30};
A a={1, 2};
a.printtime();
        a.func();
return 0;
return 0;
}
}
</syntaxhighlight>
</source>


이렇게도 쓸 수 있는 것이다. 단지 struct를 class로 교체한 것 뿐이지만, 두 코드는 완벽하게 기능이 똑같다. 물론 struct와 class에도 기능의 차이는 있는데, struct는 기본으로 설정된 접근지정자가 public이지만 class는 private이다.
이렇게도 쓸 수 있는 것이다. 단지 struct를 class로 교체한 것 뿐이지만, 두 코드는 완벽하게 기능이 똑같다. 물론 struct와 class에도 기능의 차이는 있는데, struct는 기본으로 설정된 접근지정자가 public이지만 class는 private이다.
200번째 줄: 192번째 줄:
즉  
즉  


<syntaxhighlight lang=cpp>
<source lang=cpp>
struct Time
struct A
{
{
int x;
int y;
};
};
</syntaxhighlight>
</source>


위의 코드는
위의 코드는


<syntaxhighlight lang=cpp>
<source lang=cpp>
struct Time
struct A
{
{
public:
public:
int minute;
int x;
int second;
int y;
};
};
</syntaxhighlight>
</source>




<syntaxhighlight lang=cpp>
<source lang=cpp>
class Time
class A
{
{
public:
public:
int minute;
int x;
int second;
int y;
};
};
</syntaxhighlight>
</source>


이 두 코드와 완전하게 같은 기능을 가지며,
이 두 코드와 완전하게 같은 기능을 가지며,


<syntaxhighlight lang=cpp>
<source lang=cpp>
class Time
class A
{
{
int second;
int x;
int minute;
int y;
};
};
</syntaxhighlight>
</source>


위의 코드는
위의 코드는


<syntaxhighlight lang=cpp>
<source lang=cpp>
class Time
class A
{
{
private:
private:
int second;
int x;
int minute;
int y;
};
};
</syntaxhighlight>
</source>






<syntaxhighlight lang=cpp>
<source lang=cpp>
struct Time
struct A
{
{
private:
private:
int second;
int x;
int minute;
int y;
};
};
</syntaxhighlight>
</source>


이 두 코드와 완벽하게 같은 기능을 제공한다. 차이는 오직 이것 뿐이다.
이 두 코드와 완벽하게 같은 기능을 제공한다. 차이는 오직 이것 뿐이다.
265번째 줄: 258번째 줄:
=== 용어 ===
=== 용어 ===
=== 접근지정자 ===
=== 접근지정자 ===
접근 지정자에는 private, public, 그리고 protected가 있습니다. protected 접근지정자는 상속 부분에서 설명드리겠습니다.
;public
말 그대로 공개되어 있기 때문에, 클래스 밖에서도 마음껏 접근할 수 있습니다.
<syntaxhighlight lang="c++">
class Time
{
public:
int minute;
int second;
int hour;
}
</syntaxhighlight>
즉 이렇게 클래스를 만든다면
<syntaxhighlight lang="c++">
Time a;
a.second=600;
a.minute=80;
a.hour=-68;
</syntaxhighlight>
이렇게 외부에서 마음껏 조작할 수 있기 때문에 데이터 멤버는 public 지정자로 공개하면 '''안 됩니다.'''
public 지정자는 외부에 공개해야하는 멤버 함수에 주로 사용합니다.
;private
클래스 내부가 아니라면 접근이 불가능합니다.
<syntaxhighlight lang="c++">
class Time
{
public:
    int settime(int h, int m, int s)
    {
        if (minute < 0 || minute >= 60)
        {
            return -1;
        }
        if (second < 0 || minute >= 60)
        {
            return -1;
        }
        if (hour < 0)
        {
            return -1;
        }
        minute = m;
        second = s;
        hour = h;
        return 0;
    }
private:
    int minute;
    int second;
    int hour;
}
</syntaxhighlight>
=== const 멤버 ===
=== const 멤버 ===
=== static 멤버 ===
=== static 멤버 ===
351번째 줄: 288번째 줄:
=== 람다와 함수 포인터 ===
=== 람다와 함수 포인터 ===
=== 람다의 사용법 ===
=== 람다의 사용법 ===
[[분류:프로그래밍 시리즈|C++]]
[[분류:쉽게 알 수 있다 시리즈]]
[[분류:C++]]
== 참고 자료 ==
== 참고 자료 ==
https://msdn.microsoft.com/en-us/library/3bstk3k5.aspx
https://msdn.microsoft.com/en-us/library/3bstk3k5.aspx
리브레 위키에서의 모든 기여는 크리에이티브 커먼즈 저작자표시-동일조건변경허락 3.0 라이선스로 배포됩니다(자세한 내용에 대해서는 리브레 위키:저작권 문서를 읽어주세요). 만약 여기에 동의하지 않는다면 문서를 저장하지 말아 주세요.
글이 직접 작성되었거나 호환되는 라이선스인지 확인해주세요. 리그베다 위키, 나무위키, 오리위키, 구스위키, 디시위키 및 CCL 미적용 사이트 등에서 글을 가져오실 때는 본인이 문서의 유일한 기여자여야 하고, 만약 본인이 문서의 유일한 기여자라는 증거가 없다면 그 문서는 불시에 삭제될 수 있습니다.
취소 편집 도움말 (새 창에서 열림)

| () [] [[]] {{}} {{{}}} · <!-- --> · [[분류:]] · [[파일:]] · [[미디어:]] · #넘겨주기 [[]] · {{ㅊ|}} · <onlyinclude></onlyinclude> · <includeonly></includeonly> · <noinclude></noinclude> · <br /> · <ref></ref> · {{각주}} · {|class="wikitable" · |- · rowspan=""| · colspan=""| · |}