C++ 의 기본 문법은 C언어와 유사하다.

 

클래스와 제너릭 프로그래밍을 배우기 전에 기본 문법인 변수, 제어문, 함수 등에서는 거의 C언어와 같다.

 

C와 C++은 전혀 다른 언어라고 하지만 객체지향설계를 사용하지 않은 절차적 프로그래밍을 한다면 C++컴파일러에서 C언어의 소스코드를 그대로 사용할 수 있다.

 

이렇게 하위 호환성을 제공하기 때문에 C언어를 배운 사람과 배우지 않은 사람들 모두가 쉽게 접근할 수 있는 언어이다.

 

이번 포스팅에서는 C++ 의 함수 사용법의 기본이다.

 

함수를 호출한다고 한다. (function call) 하나의 프로그램이 다른 하나의 프로그램을 부르는 것이다. 컴퓨터 안에는 무수히 많은 함수들이 작동한다. 함수는 프로그램의 작은 단위로써 어떠한 기능을 수행한다. 하나의 함수에 여러가지 함수를 포함시키는 것도 가능하다.

 

함수는 프로그램의 실행 단위다. C++의 main 함수가 곧 프로그램 자체다. main 함수의 맨 위에서 시작해서 끝에 가면 return 문을 만나고 종료한다. main 함수에서도 다른 함수를 호출할 수가 있다. 내장 함수인 cout 도 호출할 수 있고 사용자가 만든 사용자 정의함수도 호출할 수 있다.

 

main 에서 함수를 호출하면 제어권을 서브 루틴으로 넘긴다. 호출받은 함수가 수행을 완료하면 다시 제어권을 main 함수에게 넘긴다. 함수는 호출할 때 스택에서 실행된다. 함수가 스택으로 들어가면 자신을 호출한 함수의 주소를 가지고 있기 때문에 함수안에서 함수를 호출하는 것도 가능하다. 심지어 자기 자신을 호출하는 것도 가능한데 이를 재귀함수라고 한다. 재귀함수는 알고리즘에 있어서 중요하기 때문에 별도의 알고리즘 챕터에서 다루기도 한다.

 

 

*가장 쉬운 함수

 

가장 쉬운 함수를 만들어 본다.

 

이 함수가 하는 일은 콘솔에  ->Demo Function 을 출력하는 일 밖에 없다.

 

main 에서 호출해본다. cout 은 main 에서 실행되는 것이고 demo 는 함수에서 실행되는 것이다.

 

출력문이 번갈아가며 나오는 것 처럼 프로그램의 제어도 main 에서 demo 로 갔다가 다시 main 으로 돌아온다.

 

void 는 함수가 특정한 값을 반환하지 않는다는 것이다. 이 함수에는 매개변수라 하는 전달하는 수도 없다.

 

겉으로 보이면 똑같아 보이지만 내부적으로 어떻게 작동하는지 알아둘 필요가 있다.

 

 

* 매개변수와 반환값이 있는 함수

 

이번의 함수는 전의 함수보다 약간 복잡하다. 반환값이 있고 매개변수가 있다.

 

반환 값이라는 것은 함수를 호출한 쪽에 호출당한 함수가 값을 보내줘야한다는 말이다.

 

int add (int x, int y) 에서 맨 앞의 int는 반환값이다. 정수형식으로 반환한다는 뜻이다.

 

int x, int y 는 매개변수, 인수라고 한다. 바깥에서 전달하는 값을 인수, 안에서 받는 값을 매개변수라고 한다.

 

전달한다고 해서 직접 값을 주는 것은 아니다. 함수를 호출할 때 별도의 스택 메모리 영역에 복사를 시키는 것이다.

 

이 프로그램의 결과는 쉽계 예상이 된다. 두개의 값을 받아서 알맞은 형식으로 꾸미고 더한 값을 돌려준다.

메인함수에서 사용해보면 위와 같다. add() 함수가 호출되는 순간 프로그램의 제어는 add 함수로 옮겨간다. 호출한 메인의 입장은 add함수에 있는 코드의 실행이 다 끝날 때 까지 기다려야 한다는 것을 의미한다.

 

호출된 함수(피호출자)에 return 이 보인다. void 함수는 없어도 되지만 int 함수는 반드시 return 문에서 값을 반환해야한다. 함수가 반환하는 값을 리턴값, 반환값, 돌려주는 값 등으로 표현하는데 중요한 것은 값을 돌려준다는 점이다.

 

add 함수는 두개의 값을 입력받았고(매개변수) 그 값에 대한 처리가 return 값이다.

 

함수를 부르는 이름도 많다. 루틴, 서브루틴, 함수, functinon, 기능, 메소드, 프로씨저 등 어느 용어가 정확한 것이냐? 그것은 맥락(Context)에 따라 다르고 또 어떻게 보면 다 같은 말이기도 하니 대체적으로 다 알고 있는게 좋다. 하나의 사물을 부르는 용어가 꼭 하나일 필요는 없다. 프로그래밍 언어에 주로 영어를 사용하는데다가 초반에 용어 정리를 못해서 한참 헤메이는 경우도 있으니 주의한다.

 

지금 살펴본 함수는 가장 쉬운 예를 들었다. 하지만 나중에 가면 가장 쉬운 이것들을 이해하는게 제일 중요하다는 것을 알게된다.

 

void 를 쓸 것인가? int 를 쓸 것인가? 결과는 같아도 방법(알고리즘)이 다를 수 있다.

 

어느 것이 옳은 방법인가? 스스로에게 이 질문을 하고 답해야한다.


C++ 을 배우다 보면 고급적인 함수 사용법을 배우게 된다. 그것은 클래스와 제너릭 프로그래밍과 함께 배워야 하는 일이기에 초반에는 이정도를 알아두면 된다.

 

드롭박스의 창업자 드류 휴스턴은 프로그래밍에 대하여 악기 연주와 다를바가 없다고 말했다. 피아노를 생각해보면 처음부터 특별한 기교를 다 배울필요가 없다. 고급 테크닉을 배워도 초보시절에는 사용할 수가 없다. 그런데 시간이 지나고 숙련도가 높아졌을 때는 이야기가 달라진다. 화려하면서 깊은 음색을 내는 것에 악기에 대한 테크닉과 이해도가 한몫 하는 것이다.

 

그러니까 C++을 배울 때 학습 초반에 너무 달리지 말고 인내심을 가질 필요가 있다. 특히나 C++ 은 난해하기로 유명한 언어다. 하지만 난해하기 때문에 그만한 장점도 있다는 것을 알게 될 것이다. 세상은 어렵기 때문에 가치가 있는 일 투성이다. C++을 배우는 일도 그런 일에 속한다.

 

 

*예제코드

#include <iostream>

#define Line {cout << "--------------------------------" << endl;}

using namespace std;


void demo();
int add(int x, int y);

int main()
{
    // 함수호출하기

    cout << "->Main function\n";
    demo();
    cout << "->Main function again!\n";

    Line;

    // 덧셈 함수

    cout <<"메인함수에서 덧셈함수를 호출한다" << endl;
    cout << add(3,4);
    cout << endl << "다시 메인함수로 복귀하였다";

    return 0;
}

void demo()
{
    cout << "  ->Demo Function\n";
}

int add(int x, int y)
{
    cout << "-> 덧셈 함수를 호출하였다\n" << x << " + " << y << " = ";
    return (x+y);
}

공유하기

facebook twitter kakaoTalk kakaostory naver band