<C에서 C++로>
안녕하세요. 2번째 강의시간입니다.
저도 C, C++언어를 배워가는입장에서 작게나마 지식을 공유하고자 이렇게 포스팅을 하게됬습니다. 잘못된 부분이있으면 지적해주시어 서로서로 윈윈하자구요^^
먼저 함수라는 녀석을 슬슬건드리기전에 이 녀석이 도대체 누구인지
왜 사용을하게되었는지 알아봐야겠죠?
C언어에서 이미 공부를 마치셨겠지만 다시한번 복습겸 알아보도록 합시다.
함수를 사용하는 이유를 여러 책들에서 살펴보면 이렇게들 표현이 되어있습니다.
1. 모듈화에 의한 프로그램의 질 향상 가능
2. 유지 보수 확장의 용이성
3. 문제해결의 용이성
등등... 와 정말 말이너무 어렵네요. 절대 틀린말은 아니죠. 하지만 초보자는 이해하기가 너무어렵네요. 우리는 아주 쉽게쉽게 이해하고 넘어가도록 합시다.
이 함수라는 녀석은 반복적인 작업을 피하고 효율적인 코딩이 가능하게 만들어 주는 역할을 수행합니다. 우리가 앞서배운 입출력함수 cout, cin을 사용할때
cout << "hello world"; 이렇게 사용했었죠?
허나 cout라는 함수가 없었다면 어떻게 출력을 어떻게 했을까요? 출력을 할때마다 이 기능들을 매번 코딩을 해주어야 한답니다. 너무 귀찮아지고 코드라인수가 엄청나게 많아지겠지요. 그렇기에 함수가 이용이 되는것입니다.
따라서 함수라는 녀석을 알기쉽게 정리한다면
어떤 특정한 작업을 독립적으로 수행하는 프로그램! 이라고 보면 되겠습니다.
함수는 그럼 어떻게 만들고 사용할까요?
위 그림은 함수의 기본적인 형태입니다.
1. 반환자료형(리턴타입)
2. 함수이름
3. 인수목록(매개변수)
4. 함수몸체 및 리턴값
으로 구성이 되어있으며 위의 형식에 맞게 만들어서 사용하시면 된답니다.
다음예제를 가지고 함수의 호출과정은 어떻게 되는지 한번 살펴보도록 하겠습니다.
메인함수위에 addNum() 이라는 두 숫자를 입력받아 그 합을 리턴하는 함수를 정의하였고 이를 메인함수에서 사용하는 코드입니다.
함수가 호출되는 시점은 간단합니다. 그 함수가 사용될때 실행이되고 함수 사용이 끝나면 값을 리턴하고 메인함수가 다시 시작이 되는겁니다.
그림으로 쉽게알아보자면
위의 절차를 따라 함수는 작업을 수행하게됩니다. 어때요 참쉽죠?
함수의 사용에 대하여 보다 자세히 알기위해서는 C++언어의 메모리 구조에 대하여 자세히 알아야할 필요성이 있습니다.
프로그램을 실행시키게 되면(프로그램 시작시) 우리의 컴퓨터에 설치된 운영체제(OS)들은 RAM이란 곳에 메모리 공간을 할당해준답니다. 할당되는 메모리 공간은 크게 세가지
1. 데이터영역
2. 스택영역
3. 힙영역
으로 나눌수가 있습니다. 바로 이곳에 우리가 선언한 함수들, 변수들 등등 모든게 적절한 위치에 할당된답니다.
(C언어 메모리구조에 관하여
http://dsnight.tistory.com/50 블로그에 포스팅 되어있는 자료를 가져왔습니다. 문제가될시 삭제후 재업로드 하겠습니다.)
자 이 그림을 보면 이렇게 분류를 또 할수가 있겠군요.
데이터 영역에는 전역변수와 Static 변수들을
힙영역에는 프로그래머가 할당한 것들을
스택영역에는 지역변수와 매개변수들을
할당한다고 알 수 있게됩니다.
(좀더 자세한 설명은
http://dsnight.tistory.com/50 블로그에 잘정리가 되어있습니다. 반드시 이해하시고 넘어오세요)
드디어 함수 복습시간이 끝났습니다.
이제 함수 오버로딩에 대하여 알아보도록 하겠습니다.
먼저 예제를 한번 보도록 할게요.
반환형이 int형이고 각각 3개, 2개의 int형 매개변수를 가지는 함수가 정의되어 있습니다. 매개변수의 합을 Num 변수에 저장하여 리턴을 해주는 기능을 하고있군요.
예제를 쭉 한번 훑어보니 무언가 이상한 부분이 보이지않나요?
앞서 설명한 함수가 addNum() 이라는 같은 이름을 가지고있었습니다.
하지만 컴파일했을때는?? 문제가 없습니다.
기존에 C에서는 동일한 이름을 가진 함수가 정의되는것을 허용하지 않았습니다. 하지만 C++에서는 허용을 합니다. 단, 조건이 지켜졌을 경우에 허락이 된답니다.
그 조건은
"함수 호출시 전달되는 매개변수의 타입과 갯수에 따라 호출하고자하는 함수를 구분할 수 있다!"
입니다.
위의 예제를 보면 addNum() 함수는 다음과 같이 두가지로 정의 되어있습니다.
addNum(매개변수 2개), addNum(매개변수 3개).
컴퓨터에게 addNum(5,2) 호출을 부탁하면, 컴퓨터는 이름이 addNum()이고 2개의 매개변수를 가지고있는 함수를 찾아서 함수를 사용할 것입니다.
반대로 addNum(5,2,5) 호출을 부탁하면 컴퓨터는 이름이 addNum()이고 3개의 매개변수를 가지고있는 함수를 찾아서 사용하겠지요. 이것이 함수 오버로딩의 전부랍니다.
앞으로 오버로딩을 할때 항상 매개변수의 타입과 갯수에 대하여 신경을 쓰도록 합시다.
C++ 함수에는 매개변수에 디폴트값(Default Value)을 정의해 줄 수 있습니다.
쉽게 말해서 매개변수가 기본값을 가지도록 해주는 것이죠. 사용법은 아주 간단합니다.
addNum(int x=0, int y=0, int z=0)이 보이시나요?
매개변수에 그냥 값을 초기화 시켜주는 방법입니다. 아까 말했듯이 참 간단하죠?
이렇게 디폴트값을 선언해 주었으면 main()함수에서 addNum()함수를 사용할때 매개변수값을 전달하지 않아도 문제가 없습니다. 결과값을 한번 보도록할게요.
sum4 = addNum(); 부분을 보시면 매개변수를 하나도 전달해주지 않았습니다. 따라서 디폴값인 x=0, y=0, z=0으로 초기화가 되어 sum4의 결과값이 '0' 으로 올바르게 출력이 되었습니다.
sum1을 보면,
sum1 = addNum(3);으로 매개변수를 '3' 하나만 전달하여서 함수를 호출하였습니다. 이때는 매개변수는 왼쪽 부터 값을 채워나갑니다. 쉽게말해 x=3, y=0, z=0 이렇게 초기화가 된다는 뜻이지요.
따라서 sum2 = addNum(3,4);은 매개변수를 3,4 두개를 전달하였으므로 x=3, y=4, z=0 으로 sum3 = addNum(3,4,5);은 매개변수를 3,4,5 세개를 전달하였으므로 x=3, y=4, z=5로 초기화가 됩니다.
위 예제를 통해 이런 결론을 낼수가 있겠군요.
"전달되는 매개변수는 왼쪽부터 초기화되며 부족한 부분은 디폴트값으로 초기화된다"
그런데 꼭 디폴트값을 전부다 설정해주지는 않아도됩니다. 부분적으로 디폴트값을 설정해줘도 문제는 없습니다. 하지만 여기에도 조건이 따르는데
다음에서 보이는것과 같이
int addNum(int x, int y=0, int z=0) { ....}
int addNum(int x, int y, int z=0) { ....}
이런식으로 설정해주어도 문제는없습니다.
하지만
int addNum(int x=0, int y, int z=0) {....}
int addNum(int x=0, int y=0, int z) {....}
int addNum(int x, int y=0, int z) {....}
이렇게 우측 매개변수의 디폴트값설정을 안해주게 되면 문제가 발생하게됩니다. 다시말해서, 디폴트값이 설정된 매개변수를 기준으로 오른편 매개변수들중 단하나라도 매개변수가 설정이 되어있지 않다면 잘못된 함수 정의가 되는것입니다. 꼭 유념하셔야합니다!
이렇게 두번째 강의가 끝났습니다.
저도 배워가는 입장에서 기술한 허접한 강의였지만
작게나마 서로에게 도움이 되었길 바랍니다. 고생하셨습니다. 다음강에서 뵙겠습니다.