우왕 쿧! ㅋ;; 
드디어 2단원의 마지막이네요...

더욱 수고해 주시길 바랍니다!!
2단원으로써 C와 C++을 비교하는 챕터가 끝날 뿐이니까요 하핫!

*이 강좌는 C언어를 끝냈다는 가정하에 실시합니다.

┌───────────────┐
---앞으로의 목차---
2-6. new&delete
3-1. 구조체? 클래스?
3-2. 객체에 대하여
└───────────────┘

<지난 강좌를 살펴보고 와주세요 !! : http://blog.naver.com/owndks98o/120156814599 >

2-6. new&delete
안녕하세요!!
드디어 2단원의 마지막이라 그런지 저도 설레고 떨립니다 하핫;;

이번시간에는 malloc과 free를 C++에 어울리게 기능을 추가한 new와 delete에 대해 알아봅시다.
먼저 malloc과 free를 훑어보고 지나갈까요?

/*
malloc.cpp
*/
#include
using namespace std;

int main(){
const int size=16; //이정도 할당해 봅시다.

int* dat=(int*)malloc(sizeof(int)*size);

free(dat);
return 0;
}
이 정도 예제는 바로 이해할수 있을 것이라 생각합니다.

그럼 이 예제를 그대로 c++의 new와 delete 형식으로 바꿔보죠.
훨씬 간단해진 것을 볼수 있을 것입니다.

/*
new.cpp
*/
#include
using namespace std;

int main(){
cont int size=16;

int* dat=new int[size];
delete[] dat;
return 0;
}
훨씬 간단해진 것이 보이시나요?
소스의 붉은 부분을 보시면,
new 타입[...]
처럼 되있는 부분을 보실수 있으실겁니다.
이부분에서 타입형 데이터 ...개를 할당합니다.

만약 한개만을 할당하고 싶다면,
new 타입
으로 끝내실수 있습니다.

그리고 new의 거대한 장점!!
malloc은 void포인터를 리턴하기 때문에 강제형변환을 해주어야 했지만 new는 할필요가 없습니다.
int면 int* char이면 char*로 알아서 리턴해 주기 때문이죠.

그럼 이젠 반환해 봅시다.
delete[] 메모리;
처럼 되어있는 부분이 보이시나요?

이 부분에서 메모리를 반환하게 됩니다.

역시 한개만을 반환하고 싶다면,
delete 메모리;
로 끝내실수 있습니다.

그럼 만약 한가지 가정을 해봅시다. 만약 동적할당이 제대로 되지 않았다면?
으아아악 거리면서 프로그램이 종료되버리면 되는걸까요? <퍽퍽 죄송합니다;;

이런 상황을 대비하기 위하여 new는 동적할당이 되지 않았을 경우를 대비하여 안됬을때 NULL을 리턴합니다.
아래와 같은 소스를 짜보면 되는 것이죠.

/*
NULL.cpp
*/
#include
using namespace std;

int main(){
const int size=16;

int *dat=new int[size];
if(dat==NULL){
//종료전처리
return -1;
}

delete[] dat;
return 0;
}
간단하죠?

하지만 이러한 코드는 일반적으로 보았을때에 NULL이 리턴되는 경우가 잘 없으므로, 성능의 저하를 불러온다고 생각하시는 분들이 많이 있습니다. 따라서, 이러한 코드는 DEBUG 시에서만 작성하는 것도 하나의 방법이 될수 있습니다.
new&delete의 응용은 class를 배우면서 해보도록 합시다!

Tip.사실 new와 delete는 class관련해서 중요한 기능을 가지고 있습니다. 그건 다음 단원에서 알아봅시다 하핫!




흐흑...
정말 죄송합니다;;
요즘 내신관리에 바쁜 나머지...

  *이 강좌는 C언어를 끝냈다는 가정하에 실시합니다.

┌───────────────┐
---앞으로의 목차---
2-5. 레퍼런스와 함수 II
2-6. new&delete
3-1. 구조체? 클래스?
└───────────────┘
<지난 강좌를 살펴보고 와주세요 !! : http://blog.naver.com/owndks98o/120156014435 >
2-5. 레퍼런스와 함수 II 
이번시간에는 레퍼런스를 리턴하는 함수를 배워봅시다!

먼저 소스코드를 드릴테니 한번 분석해 볼까요?

 /*
ref_return.cpp
*/
#include
using namespace std;

int& add(int &mum){
mum++;
return mum;
}

int main(){
int num=10;
int &x=add(num);

cout<
cout<

return 0;
}

꽤나 간단한 소스입니다. 보시면 이해가 되실거라고 생각합니다.
딱! 하나 레퍼런스를 리턴하는 부분을 뺸다면 말이죠.

함수와 함수의 호출을 보시면, 호출할때에 num이라는 변수를 주면, mum이라는 이름을 하나 더 만듭니다.
int& add(int &mum){
그리고 mum을 return할때에 x라는 새로운 이름이 하나를 더 받게 됩니다.

즉, 이 함수에서는 num==mum==x 가 되는 것이죠.

따라서 이 프로그램의 실행결과는 11 11 이 되게 됩니다.

하지만 하나! 조심해야 할 부분이 있습니다.
바로 지역변수를 레퍼런스로 리턴하는 경우입니다.

 #include
using namespace std;

int& turn(){
int num=10;
return num;
}

int main(){
cout<
return 0;
}

이럴경우 과연 어떻게 될까요?
아~주 큰일이 생기게 됩니다.

지역변수인 num은 함수의 호출이 종료되면 메모리 공간에서 사라지게 됩니다.
그후 그 메모리는 다른 변수나 함수가 사용하게 되지요.

그런데, 그 값을 리턴할경우, 받는 main함수 쪽에서는 제대로된 메모리를 받지 못하게 될수도 있다는 뜻이 됩니다.

설사, 제대로된 값이 나온다 해도 프로그램이 조금만 더 복잡해 지면 바로 값이 바뀔것이라 장담합니다.

따라서,
절대 지역변수를 레퍼런스로 리턴하면 안됩니다.

그럼 다음강 new&delete에서 뵙겠습니다^^





오늘은 얼마나 할수 있으려나? ㅋ

시작해 봅시다!!

  *이 강좌는 C언어를 끝냈다는 가정하에 실시합니다.

┌───────────────┐
---앞으로의 목차---
2-4. 레퍼런스의 이용
2-5. 레퍼런스와 함수 II
2-6. new&delete
└───────────────┘

<지난 강좌를 살펴보고 와주세요 !! : http://blog.naver.com/owndks98o/120156012111 >

2-4. 레퍼런스의 이용 

저번시간에는 Call-By-Reference 에 대해 알아보았습니다.
이번에는 그와 상반되는 말인,
Call-By-Value 에 대해 알아보겠습니다.

먼저, Call-By-Value란,
"함수의 호출에서 전달인자에 메모리를 복사해서 넘겨주는 것"
등으로 정의할수 있겠군요.

간단한 예제로 강좌를 시작해 봅시다.

/*
cbv.cpp //call-by-value
*/
#include
using namespace std;

typedef struct _MemDat{
char Name[20];
char ID[20];
char PS[20];
int age;
}MemDat;

void Show(MemDat md);

int main(){
MemDat md;
cout<<"Name : ";
cin>>md.Name;
cout<<"ID : ";
cin>>md.ID;
cout<<"PS : ";
cin>>md.PS;
cout<<"age : ";
cin>>md.age;

Show(md);
return 0;
}

void Show(MemDat md){
cout<<"Name : "<
cout<<"ID : "<
cout<<"PS : "<
cout<<"age : "<
}

 Call-By-Value의 기본 방식은 메모리의 복사입니다.
따라서 이런 방식은 메모리를 그냥 낭비하는, 어쩌면 정말로 몰상식한 행위를 일으키게 됩니다.

그렇다면 레퍼런스를 이용하여서 문제점을 고치려면 어떻게 해야 할까요?
매우 간단합니다.

void Show(MemDat md){ ...
이 부분을,
void Show(MemDat &md){...
로 고쳐주면 되는 것이죠!!(선언과 정의 모두)

//cbv2.cpp 예제는 올려두겠습니다.

이렇게 하면 몇 바이트나 되는 데이터를 복사하지 않아도 되므로, 성능면에서도 메모리 면에서도 win-win할수 있습니다.

또한가지 TIP을 보고 넘어가보죠.
우리가 만든 이 함수는 단지 데이터를 보여주기만 하는 함수입니다.
따라서 데이터를 수정한다거나 그럴필요는 없죠.

따라서,
void Show(MemDat &md){...
이 부분을,
void Show(const MemDat &md){
로 고쳐주면 더욱 효율적인 코딩이 가능해 집니다.

그럼 다음강에서~~




으헝... 
월요병이 도져서... 또 길게 쉬다 왔네요...
본의 아니게...

시작합시다.

  *이 강좌는 C언어를 끝냈다는 가정하에 실시합니다.

┌───────────────┐
---앞으로의 목차---
2-3. 레퍼런스와 함수
2-4. 레퍼런스의 이용
2-5. 레퍼런스와 함수 II
└───────────────┘

<지난 강좌를 살펴보고 와주세요 !! : http://blog.naver.com/owndks98o/120155834133 >

2-3. 레퍼런스와 함수

이번강의에서는 레퍼런스의 강력한 장점을 알아보죠.

그에 앞서,
Call-By-Reference
란 말의 의미를 아세요?

C를 열심히 배우셨다면 아실거라고 믿어 의심치 않습니다만,
노파심에 다시 한번 설명해 드리자면, "함수를 호출할때에 전달인자를 복사하지 않고 넘겨주는 방식"
이라고 간결하게 설명할수 있을것 같습니다.

간단한 예제로 살펴보죠.

/*
swap_ptr.cpp
*/
#include
using namespace std;

void swap(int *a,int *b);

int main(){
int x=0,y=1;

cout<
swap(&x,&y);
cout<

return 0;
}

void swap(int *a,int *b){
int temp=*a;
*a=*b;
*b=temp;
}

포인터를 이용한 간단한 swap함수의 예제입니다.
하지만, 이 소스는 포인터를 이용했기에, 치명적인 문제가 있습니다.

바로,
"포인터 연산의 실수 에 따라 발생하는 문제"
이죠.

포인터는 주소값을 가지고, 메모리를 직접참조하는 C만의 기법이기 때문에, 자칫 연산의 실수가 일어나면 프로그램 전체가 종료 될만큼 위협적인 에러를 자랑합니다.

그래서 포인터의 연산이 필요없는, 즉,
포인터 연산의 실수에 대한 걱정 및 우려가 적은 레퍼런스를 사용하는 것입니다.
예제를 레퍼런스로 바꿔보죠.

/*
swap_ref.cpp
*/
#include
using namespace std;

void swap(int &a,int &b);

int main(){
int x=0,y=1;

cout<
swap(x,y);
cout<

return 0;
}

void swap(int &a,int &b){
int temp=a;
a=b;
b=temp;
}

달라진 부분에만 조금 표기해 보았습니다.
swap함수에서 레퍼런스로 받기 때문에, 메인함수에서도 주소값을 넘겨줄 필요가 없으며,
swap함수에서도 포인터 연산자 '*'를 사용할 필요가 없어,
딱봐도 소스가 훨씬 간결하고 아름다워진 것을 보실수 있으실것입니다.

즉, 레퍼런스를 사용하며 소스의 간결성과 안정성, 두마리 토끼를 잡을수 있습니다.

이상으로 다음강에서 만나죠~




오늘 하루 쫙~ 강좌 나가봅시다!! 

잼군요 하핫;;

 *이 강좌는 C언어를 끝냈다는 가정하에 실시합니다.

┌───────────────┐
---앞으로의 목차---
2-2. Reference란.
2-3. 레퍼런스와 함수
2-4. 레퍼런스의 이용
└───────────────┘

<지난 강좌를 살펴보고 와주세요 !! : http://blog.naver.com/owndks98o/120155831162 >

2-2. Reference란.
레퍼런스가 무엇일까요?
이해를 돕기위해 간단한 예를 들어 이야기해 봅시다.

우리는 사람을 부를때에 이름으로 부르기도 하지만, 그 사람의 별명을 가지고 그 사람을 이야기 하기도 합니다.

즉, 여기서의 "이름"과 "별명"에 대해
"이름"=="별명"
이 성립하는 것이죠.

이것이 레퍼런스 입니다.
이미 존재하는 변수에 별명을 부여해 주는 것이죠.

레퍼런스를 선언하는 방법, 즉 별명을 붙이는 방법은 간단합니다.
int형 val이라는 변수가 있을때에,
int &ref=val;
의 한줄로써 별명을 만들수 있습니다.

?? 한가지 이해가 안가는 부분이 있군요.
'&'
연산자는 C의 포인터에서도 사용하였습니다.
그러고 보니 레퍼런스가 포인터와 비슷한거 같기도 하고요.
(하지만 포인터는 "주소값"을, 레퍼런스는 "변수 제2명"에 대해 다릅니다.)

하지만 아래의 예제를 보면 분명 다르다는 것을 알수 있습니다.

int main(){
int val=0;

int *ptr=&val;   //주소값 얻어오기
int &ref=val;    //레퍼런스 선언

return 0;
}

어때요? 다르죠? 하핫;;

레퍼런스를 선언할때에는 단 1가지 규칙만이 필요합니다.
  • 변수명을 대입하여 초기화 하여야 한다.
간단하죠?

따라서, 요약하면,
레퍼런스는 하나의 메모리 공간에 2개 이상의 이름을 붙여주는 것
입니다.

레퍼런스는 포인터 연산에 유리하다는 듯, 여러가지 장점이 있습니다.
적어도 포인터 연산을 잘못해서 에러가 나는 일은 없으니까요.

이상으로 다음강에서 뵙겠습니다!




살며시.. 하루정도 쉬고 왔습니다 하핫;; 

그럼 C++ 의 엄~청난 기능을 가진 새로운 자료형인 bool을 알아봅시다!

*이 강좌는 C언어를 끝냈다는 가정하에 실시합니다.

┌───────────────┐
---앞으로의 목차---
2-1. bool형에 대해
2-2. Reference란.
2-3. 레퍼런스와 함수
└───────────────┘

<지난 강좌를 살펴보고 와주세요 !! : http://blog.naver.com/owndks98o/120155697631 >

2-1. bool형에 대해
C++에서는 bool이라는 자료형이 추가되었습니다.
bool은 논리형으로써, true와 false만을 값으로 가집니다.
C에서는 매크로를 이용하여, true와 false를 정의하였지만,
C++에서는 더욱 업그레이드 된 방식으로 C++자체에서 키워드로 제공하게 됩니다.

/*
boolExample.cpp
*/
#include
using namespace std;

int main(){
bool Open=false;
for(;;){
cout<<"현재 문의 상태 : ";
if(Open)
cout<<"<열려있음>"<
else(!Open)
cout<<"<닫혀있음>"<

Open=!Open;
}
return 0;
}

프로그램을 실행하시면 열려있음/닫혀있음 이 토글되며 출력될 것입니다.

그리고 C를 배울때에, 0이면 거짓, 0이 아니면 진실 이었습니다.
그렇다면 if문에도 적용되는 것을 보니, bool형의 두 값은 0과 다른 한 숫자로 이루어져 있는 것일까요?

/*
boolExample2.cpp
*/
#include
using namespace std;

int main(){
int BOOL=true;
cout<<"TRUE : "<

BOOL=false;
cout<<"FALSE : "<

return 0;
}

이 프로그램을 실행해 보시면,
true는 1, false는 0 으로 되어있는 것을 알수 있을 것입니다.

최근표준에는 C에도 bool,true,false가 추가되었지만 아직은 배포에 시간이 걸릴것 같습니다 :D
bool형의 쓰임은 지금당장은 이해하기 쉽지 않으실 거라 생각됩니다.
C++을 하다보면 꼭 여러본 보게 될 테이니 서서히 익혀 지실거라 판단합니다 :D




namespace가 예상외의 복병이였군요! 
강좌가 길어집니다..으윽...
그래도 우리는 계속 갑니다~ 오예~
소스/프로그램은 1-5를 통합하여 올리겠습니다.

 *이 강좌는 C언어를 끝냈다는 가정하에 실시합니다.

┌───────────────┐
---앞으로의 목차---
5. namespace에 대해
2-1. bool형에 대해
2-2. Reference란.
└───────────────┘

<지난 강좌를 살펴보고 와주세요 !! : http://blog.naver.com/owndks98o/120155695209 >

1-5-2. namespace에 대해.
강좌를 계속합니다! 길어질수록 지루해 진다는 것을 잘 아는 제가 억지로 끌고 갈 이유야 없지요 하핫;;

방금전 강좌까지
A101::call();
과 같은 선언문을 보았습니다!
잘 보세요~ 어디서 많이 본 선언문 아닌가요?

네~ 그래요.
std::cout std::endl std::endl
과 같은 것들도 똑같은 형태를 하고 있습니다.

그렇다면 유추해 보죠!
std가 무엇일까요? 맞습니다! 바로, std도 namespace랍니다!

우리는 지금까지 std::cout std::cout std::cout ... 정말 너무나도 길게 써왔습니다.
cout, cin, endl 이렇게 간결하게 쓸수 있다면 얼마나 좋을까요?

그렇다면 꿈과 희망을 가능하게 해주는 C++의 능력을 살펴보죠!

/*
Using.cpp
*/

#include

namespace A101{
void call(){
std::cout<<"101동 leanix! 야 나와!"<
}
}
using A101::call;

int main(){
call();
return 0;
}

어엇? A101::call(); 처럼 길게만 작성해야 했던것을 call();로 짧게 작성함을 볼수 있습니다!

이걸 가능하게 해주는 키워드가 무엇일까요?
바로 using 입니다!!

using은 아래의 뜻을 가집니다.
"앞으로 call()이라는 함수를 호출하면 A101의 call을 호출하라!"

그렇다면 std:: 를 없에봅시다!

/*
Using2.cpp
*/

#include
using std::cout;
using std::endl;

int main(){
cout<<"leanix!"<
return 0;
}

후~ 간단해 졌어요~!!

더욱 간단하게 고쳐볼까요?

/*
Using3.cpp
*/

#include
using namespace std;

int main(){
cout<<"leanix!"<
return 0;
}

위의 using namespcae std; 부분은 std라는 namespace를 다 사용하겠다! 하는 선언입니다.

만약, 전역변수와 namespace의 변수가 같은 이름일 빼에는,
namespace의 변수가 우선되므로,
전역 변수를 사용하려면,
::변수명
처럼 이용해 주시면 된답니다!

이것으로 길었던 namespace에 대한 부분을 마칩니다.
더불어 1단원의 끝이기도 하죠.

다음강(2-1)에서는 bool형에 대해 알아보죠!




예상외군요;; 
inline함수의 활약 때문인지 생각보다 강좌가 많이 짧아진것 같네요.
아마 2단원까지는 오늘안에...후훗.ㅋㅋ;;
고고~!!

*이 강좌는 C언어를 끝냈다는 가정하에 실시합니다.

 ┌───────────────┐
---앞으로의 목차---
5. namespace에 대해
2-1. bool형에 대해
2-2. Reference란.
└───────────────┘

<지난 강좌를 살펴보고 와주세요 !! : http://blog.naver.com/owndks98o/120155692576  >

1-5-1. namespace에 대해
지금껏 C만을 공부해 오신 분들이라면 namespace란것이 굉장히 생소할 것이라 생각합니다.
왜냐하면, namespace란 것은 오로지 C++에만 존재하는 것이기 때문이지요.
그렇다면 namespace, 그 기능을 알아볼까요?

먼저, namespace가 뭔지 알아야 겠죠?

"아파트 101동과 102동에 leanix란 아이가 살고 있습니다. 둘다 이름이 같아서 앙숙이지요.
어느날 아파트 밖에서 한 아이가 이름을 부릅니다.
leanix야~ 놀자~
두 leanix는 동시에 대답을 하였고, 서로서로가 더더욱 기분이 나빠졌습니다."

위와 같은 극단적으로 유치찬란한 이야기로 비유해 봅시다.
여기서 여러분이라면 과연 leanix를 어떻게 불렀을까요?
창의적이신 여러분이라면 과연 어떻게 하실지 궁금하지만, 전 아마 이렇게 불렀을 것입니다.

ㅇㅇㅇ동에 사는 leanix야 놀자~

이러면 누굴 부르는지 바로 알수 있지 않나요? 이것이 바로 namespace의 원리입니다.
즉, namespace란
"특정 영역의 범위를 지정하고 이름을 붙여준것"
으로 정의할수 있습니다.

간단한 예를 통해 확인해 보죠.

#include

void call(){
std::cout<<"101동 leanix! 야 나와!"<
}

void call(){
std::cout<<"102동 leanix! 야 놀자!"<
}

int main(){
call();
return 0;
}

위 예제는 인자값과, 함수명이 동일하기 때문에 함수 오버로딩도 성립하지 않습니다.
따라서 에러를 일으키게 되죠.

어쩌면 함수명을 바꿔주는 것이 가장 현명한 방법일지도 모르지만, 우리는 다른 해결책으로 접근해 봅시다.
바로 namespace의 사용이죠.

/*
namespace.cpp
*/

#include

namespace A101{
void call(){
std::cout<<"101동 leanix! 야 나와!"<
}
}

namespace A102{
void call(){
std::cout<<"102동 leanix! 야 놀자!"<
}
}

int main(){
A101::call();
A102::call();
return 0;
}

위 예제는 자칫 안된다고 오해할 요지가 있습니다.
하지만 함수 오버로딩은 이름공간상에서도 성립하기 때문에 옳은 예제가 됩니다.

main함수를 보면
A101::call();
과 같은 함수의 호출문이 등장합니다.

간단하게 생각하셔도 된답니다! A101동의 call을 호출하라! 간단한 의미죠?
그렇다면 namespace에서는 함수의 선언과 정의를 어떻게 분리시킬까요??

/*
namespace2.cpp
*/

#include

namespace A101{
void call();
}
namespace A102{
void call();
}

int main(){
A101::call();
A102::call();
return 0;
}

namespace A101{
void call(){
std::cout<<"101동 leanix! 야 나와!"<
}
}
namespace A102{
void call(){
std::cout<<"102동 leanix! 야 놀자!"<
}
}

간단합니다! 그저 namespace도 위와 같이 두번에 나눠적어주면 되는거죠!

강좌의 길이상, 1-5-2에서 뵙겠습니다!!




흠... 몇분의 공백기간이 있었군요;;
잠시 웹툰보고 오느라 늦었습니다. 하핳;;

*이 강좌는 C언어를 끝냈다는 가정하에 실시합니다.

 ┌───────────────┐
---앞으로의 목차---
4. 인-라인(inline)함수
5. namespace에 대해
2-1. bool형에 대해
└───────────────┘

<지난 강좌를 살펴보고 와주세요 !! : http://blog.naver.com/owndks98o/120155689916 >

1-4. 인라인(inline)함수

인라인(inline)이란 의미를 프로그래밍적으로 보지 말고 영어처럼 해석해 봅시다.
in은 안쪽에 라는 의미를 나타내고, line은 선,줄 을 나타냅니다.
즉, inline함수란 코드안에 들어간 함수를 일컫겠군요!!

우리는 C언어를 공부하면서 매크로함수에 대해 알게되었습니다.

/*
MacroExample.cpp
*/

#include
#define ADD(X,Y) ((X)+(Y))

int main(){
std::cout<
return 0;
}



위와 같이 매크로 함수를 이용하면, 소스내에 매크로가 완전히 대치되기 때문에,
속도와 메모리상의 이점이 있을 것입니다.

위와 같이 함수의 호출이 소스내에 완전히 들어가버리는 현상 을
"함수가 inline화 되었다"
라고 합니다.

하지만 C에서는 inline함수를 만들기 위해서는, 매크로를 사용하여야 했기 때문에 함수의 정의가 까다로웠습니다.
또한 그 정의의 까다로움 때문에 프로그래밍상의 여러가지 단점이 있기도 하였지요.

하지만 C++에서는 정말 말끔하게 해결할수 있습니다.
바로, 함수의 정의 앞에 inline키워드를 붙여주는 것으로 끝나게 되지요.

/*
CppMacroExample.cpp
*/ 

#include

inline int ADD(int a,int b){
return a+b;
}

int main(){
std::cout<
return 0;
}

훨씬 간결해 짐을 느낄수 있으실 것이라 생각합니다.

하지만, 비록 C++에서 이런 편리한 기능을 제공한다고는 하나,
요즘에 나오는 컴파일러들은 더욱 엄청난 것들이기 때문에, 컴파일러가 알아서 inline키워드를 붙이기도 합니다.
또한, inline키워드를 붙여도 불필요하다고 판단되는 경우, 무시해 버리기도 한답니다.

이번강에서는 inline함수를 알아보았습니다!
다음강(1-5)에서는 namespace가 뭔지 간략하게 알아볼까요?!?!




비록 짧지만 그래도 오늘로써 3번째 강좌, 5번째 글이군요!!
왠지 오늘 1단원은 다 끝낼수 있을 것 같아요 ㅋㅋ;;
저도 도움이 된다면야 열심히 합니다!

*이 강좌는 C언어를 끝냈다는 가정하에 실시합니다.

 ┌───────────────┐
---앞으로의 목차---
3. 디폴트 매개 변수
4. 인-라인(inline)함수
5. namespace에 대해
└───────────────┘

<지난 강좌를 살펴보고 와주세요 !! : http://blog.naver.com/owndks98o/120155687323 >

1-3. 디폴트(Default) 매개변수

이전강(1-2) 에서는 함수 오버로딩에 대해서 설명하였습니다.
함수 오버로딩을 통해, C++에서의 함수의 강력한 기능을 엿볼수 있었습니다.
하지만 C++에서의 함수는 이게 다가 아니라는 사실! 알고 계신가요?
모르시다면! 같이 알아보죠!!

디폴트(Default)란 컴퓨터공학에서는 "기본적인"이란 의미를 가집니다.
그렇다면 함수에서의 디폴트 매개변수란 무엇일까요?

바로,
"인자를 전달하지 않으면 기본적으로 이 값을 전달하겠다"
라고 해주는 것을 디폴트 매개변수라고 합니다.

/*
DefaultParameter.cpp
*/

#include

void func(int a=0){
std::cout<
}

int main(){
func();
func(30);
return 0;
}

위 코드는 디폴트 매개변수의 예를 보여주고 있습니다.
첫번째 함수 호출처럼, 아무런 인자를 전달하지 않을경우 인자로 0이 전달된 것으로 간주합니다.
결과는 0과 30이 출력되겠군요.

위에서는 아래와 같은 것이 성립합니다.

func()==func(0)

즉, 디폴트매개변수를 이용하면, 위와 같은 2가지의 방식을 동일하게 사용할수 있습니다.

그렇다면 더욱 많은 인자를 가지고 있는 디폴트 매개변수의 예를 살펴보죠.

/*
DefaultParameter2.cpp
*/

#include

int func(int a=1, int b=2, int c=3){
return a+b+c;
}

int main(){
std::cout<
std::cout<
std::cout<
std::cout<
return 0;
}

마치 함수오버로딩을 보는 것 같은 느낌입니다 :D
위 프로그램은 6 15 33 60 으로 출력되겠군요!

지금껏 디폴트 매개변수를 보면서 함수오버로딩을 많이 떠올리셨을 것입니다.
그럼, 함수오버로딩과 디폴트매개변수가 섞인다면?!?!

#include

int func(int a=10){
return a;
}

int func(){
return 10;
}

int main(){
std::cout<
return 0;
}

안타깝게도 위와 같은 코드는 에러를 일으킵니다.
main함수를 보세요! 과연 무엇을 가르키는걸까요? 저도 알수 없군요 하핫;;

이번시간에는 정말로 쓰임이 많은 디폴트(Default) 매개변수를 알아봤습니다!

그럼 다음강(1-4)에서는 인-라인 함수를 알아보죠!


+ Recent posts