본문 바로가기
Software/C++&MFC 핵심노트

[C++/MFC 핵심노트] Function(함수)

by lovey25 2019. 11. 6.
반응형

함수는 명령어들의 그룹이라고 할 수 있습니다. 여러가지 명령어들을 하나로 묶어서 함수로 만들어 놓으면 이 덩어리를 호출하는것 만으로 내부의 명령어들을 사용할 수 있도록 만들어 둔 개념입니다.

함수의 구문

함수라는 건 이런 구조로 되어 있습니다.

반환형 함수명(파라미터 목록)
{
    명령어
    명령어
    .
    .
}

반환형: 함수가 반환하는 데이터의 타입
함수명: 함수의 이름, 함수를 호출할 때 사용됨
파라미터: 함수를 호출할 때 아규먼트를 함수로 전달을 하게되는데 이 값은 파라미터로 참조가 됨. 파라미터 리스트는 타입 순서 그리고 개수를 나타내여야 한다. 파라미터는 생략가능
명령어: 함수가 실제로 수행해야하는 일들을 중괄호({, }) 안에 작성

"함수명"으로 함수를 호출하면 함수 내부의 명령어들이 차례대로 수행되기 때문에, 만약 함수 내부에 수행되어야 할 명령어들이 예들들어 10줄의 코드인데, 프로그램에서 이 루틴을 10번을 수행해야 한다면, 함수를 쓰지 않는다면 10줄X10번으로 100줄의 코드가 되겁니다. 그러나 함수를 사용하면 함수를 정의하는데 10줄의 코드가 필요하고 10번의 함수 호출에 10줄의 코드만 필요하기 때문에 100줄의 코드가 20줄로 줄어드는 효과가 있습니다.

함수의 사용

함수의 장점은 단순히 코드를 간단하게 하는 효과만 있는것이 아닙니다. 코드를 블럭 단위로 관리하기 때문에 유지관리 전반에 큰 도움이 됩니다.

이제 예제와 함께 함수의 사용법을 알아보겠습니다.

본 학습노트의 초반에, 예제 및 실습용으로 만들었던 더미프로젝트를 가지고 설명을 해 보겠습니다. 

더미프로젝트를 보시면 "myprint()"라는 함수를 만들어서 추가 했었습니다. (https://kwonkyo.tistory.com/61#function 여기를 누르시면 해당코드로 이동합니다.) 당시에는 기능상 필요하니까 그냥 묻지도 따지지도 않고 코드를 사용하고 설명없이 넘어 갔었지만 이제 여기서 일부를 설명합니다. 함수중에서 아래 코드 부분만 우선 살펴보겠습니다.

void myprint(CString str)
{
    CMyFirstProgramDlg* c = (CMyFirstProgramDlg*)::AfxGetMainWnd();
    c->edit_result += str;
}

앞에서 본 함수의 구조에 대입해 비교를 해보죠.

반환형은 "void"로 리턴값이 없으며 함수의 이름은 "myprint"이며 "CString" 타입의 문자열을 파라미터로 잔달받아서 "str"이라는 변수에 할당하는 구조로 되어 있습니다.

그리고 함수 내부의 복잡해 보이는 코드는 이번 포스팅의 주제를 좀 벗어나기 때문에 건너띄지만 이것만 이해하면 됩니다. "str"에 담긴 문자열은 "edit_result"라는 변수에 추가하도록 하는것이 이 함수의 역할인데요. "edit_result"라는 변수는 더미프로젝트에서 문자열을 화면에 표시하는 에디트박스와 연결되어 있어서 이 함수가 실행되면 전달된 문자열이 화면에 출력이 되는 그런 효과가 나타납니다. 

이렇게 함수가 정의되었으니 이제 더미프로젝트에서 함수를 호출해서 사용을 해 보도록 하겠습니다.

[실습코드#1] 

void CMyFirstProgramDlg::OnBnClickedButton1()
{
    // TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다.
 
    // ↓↓↓ << 실습용 코드가 시작되는 위치 입니다. >> ↓↓↓
    // ------------------------------------------------------
     
    myprint(_T("쭉쭉!"));     
 
    // ------------------------------------------------------
    // ↑↑↑ << 실습용 코드가 끝나는 위치 입니다. >> ↑↑↑
 
    UpdateData(FALSE);
}

결과는 다음과 같습니다.

Overloading

오버로딩은 같은 이름의 함수를 여러게 만들수 있도록 해주는걸 말합니다. 더미프로젝트에서 void myprint(int i)와 void myprint(CString str)이 그 예입니다. 두 함수는 이름은 같지만 파라미터가 달라서 서로 다른 함수인것처럼 동작하게 됩니다.

[실습코드#2]

void CMyFirstProgramDlg::OnBnClickedButton1()
{
    // TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다.
 
    // ↓↓↓ << 실습용 코드가 시작되는 위치 입니다. >> ↓↓↓
    // ------------------------------------------------------
     
    myprint(_T("쭉쭉!")); // void myprint(CString str) 호출	
    myprint(61);         // void myptint(int i) 호출
 
    // ------------------------------------------------------
    // ↑↑↑ << 실습용 코드가 끝나는 위치 입니다. >> ↑↑↑
 
    UpdateData(FALSE);
}

예제가 오버로딩을 명확하게 보여주는 좋은 예는 아니지만, "_T("쭉쭉!")" 이라는 문자열을 아규먼트로 전달할때와 "61"이라는 정수형을 전달할때 호출되는 함수가 서로 다르다는 것만 이해하시죠. ㅋ

 

끝!

반응형

댓글