SW/C++

C++11 : 함수를 이해해 볼까요?

얇은생각 2018. 12. 27. 07:30
반응형

함수바로알기

함수는 객체의 기능에 해당합니다. 철수를 객체라고 가정하면 철수는 '먹기' 기능을 수행합니다. 따라서 철수라는 객체에 먹기 함수를 추가할 수 있습니다.


#include <iostream>
using namespace std;
 
class Chulsoo
{
public:
    void Eat();
};
 
void Chulsoo::Eat()
{
    cout << "ö      Դ´ " << endl;
}
 
int main(void)
{
    Chulsoo chulsoo;
    chulsoo.Eat();
    return 0;
}
cs

 

Chulsoo라는 클래스를 선언합니다. public 이라는 키워드가 있으며 void eat 문장이 있습니다. 이름이 eat인 것을 보니 먹기와 관련이 있음을 알 수 있습니다. 위의 예제를 통해 기본적인 클래스와 함수를 활용하는 문법을 살펴보세요.

 

 

함수의 구성요소

반환값 함수명 (매개변수 목록)

반환값 : 함수를 수행한 다음 반환하는 값을 나타냅니다.

함수명 : 함수를 식별하는 요소입니다.

매개변수목록 : 함수의 기능을 수행하기 위한 입력값입니다.

 


함수 선언과 정의 그리고 호출

함수 선언을 설명하기 위해서 아래 예제를 참고해주세요. 과연 무엇이 문제일까요?


#include <iostream>
using namespace std;
 
int main(void)
{
    Chulsoo chulsoo;
    chulsoo.Eat();
    return 0;
}
 
class Chulsoo
{
public:
    void Eat();
};
 
void Chulsoo::Eat()
{
    cout << "철수는 먹는다" << endl;
}
cs


이 예제의 오류는 선언되지 않았다는 내용이 전부입니다. 이미 선언했는 데 대체 왜그럴까요?

 

우리는 이 예제를 통해서 클래스 변수와 클래스 멤버 함수는 사용 전에 모두 선언이 되어야 하는 것을 알 수 있습니다. 클래스 변수와 클래스 멤버 함수에 관한 개념은 클래스에서 더 자세히 다루겠습니다. 함수 선언에 대해 더 알아보도록 하겠습니다.

  

 

함수선언

함수 선언은 컴파일러가 함수를 처리하려고 할 때, 다음 사항들을 점검하기 때문에 필요합니다.


#include <iostream>
using namespace std;
 
class Chulsoo
{
public:
    void Eat();
};
 
int main(void)
{
    Chulsoo chulsoo;
    chulsoo.Eat();
    return 0;
}
cs

 

컴파일러는 함수 선언을 보고 반환값의 자료형이 무엇인지 안다.

컴파일러는 함수 선언을 보고 매개변수의 개수가 올바른지 확인한다.

컴파일러는 함수 선언을 보고 매개변수의 자료형이 올바른지 확인한다.

 

컴파일러는 함수 선언을 보고 앞의 세가지 정보를 파악한 다음 컴파일을 진행합니다.

 

컴파일러 관점에서는 함수를 호출할 때, 반환값의 자료형이 무엇인지 매개변수의 개수와 자료형이 무엇인지 알고, 이러한 정보가 다를 경우 오류를 반환합니다. 만약 선언 없이 컴파일러가 이러한 정보를 파악하려고 하면 함수 정의를 파일에서 찾아내야 하는데, 이는 컴파일러의 속도를 떨어뜨릴 뿐 아니라 효율적이지도 않습니다.

 

 

함수정의 

다음 예제를 보도록 하겠습니다.


#include <iostream>
using namespace std;
 
class Chulsoo
{
public:
    void Eat();
};
 
int main(void)
{
    Chulsoo chulsoo;
    chulsoo.Eat();
    return 0;
}
cs

 

이 예제는 오류가 있는 코드입니다. 오류 내용은 chulsoo::eat(void) 함수를 확인할 수 없는 것입니다. 컴파일러 관점에서 함수를 확인할 수 없다는 것입니다. 빠진 부분은 무엇일까요?

 

void Chulsoo::Eat()
{
    cout << "철수는 먹는다" << endl;
}
cs

 

함수 정의란 철수는 먹는다라는 기능을 실제로 구현하는 부분입니다. 다음 코드는 단순히 화면에 철수는 먹는다는 문자열만 출력합니다.

 


함수 호출

마지막으로 함수 호출은 앞서 살펴본 main 함수의 chulsoo.eat() 문장에 해당합니다. Main() 함수가 실행되다가 함수 호출문을 만나면 실행 흐름이chulsoo.eat() 함수로 바꾸어집니다.

 

만약 앞에서 살펴본 예제와 같이 chulsoo.eat() 함수에 매개변수가 있다면 함수 내부에 변수를 생성하고 함수를 호출할 때 전달한 인자로 해당 변수를 초기화합니다.

 

함수는 return 문을 만날 때 실행을 마칩니다. Return 문에 값이 있다면 그 값을 반환하고 다시 chulsoo.eat() 함수에서 main() 함수로 실행 흐름을 바꿉니다.

반응형