따배씨++ (6. function, 함수)

5369 단어 cppcpp

안녕하십니까. 김동우입니다.

이번 노트에서는 함수에 대한 얘기를 좀 적어보고자 합니다.

지난 길을 걸어오며 어느 정도 C++에 대한 감이 차차 생기고 있습니다.

앞으로 10개 정도의 노트는 기본기와 관련된 노트가 될테니, 모두 열심히 달려봅시다.

바로 코드부터 넣어보도록 하겠습니다.

#include <iostream>

using namespace std;

int multiplyTwoNumbers(int num_a, int num_b) 
{
	int mul = num_a * num_b;
	// return값과 함수의 자료형을 일치해야 한다.
	// addTwoNumbers와 sum이 같은 이유.

	debug 결과
	아래 cout 문 실행 => 함수호출 => num_a 생성 => num_b생성 =>  
	num_a, num_b 대입, mul 생성=> mul 연산 => mul 반환 => 
	cout 문 함수 반환값 대입 => endl => 다음 cout문 실행 (반복)
	

	// 각 변수인 a, b, mul의 경우 초기값으로 쓰레기 값을 할당받는다.
	// ex -858993460 등

	return mul;
}

void print() {
	cout << "Hellow" << endl;
}

int addTwoNumbers(int a, int b) {

	print(); // 함수 내 함수 호출은 가능하다.

	return a + b;
} // 위와 같이 간략하게도 표현할 수 있다.
// 함수 내 함수 정의는 python언어 등만 가능하다.
// class에서는 class 내 class 선언이 가능하다.

int main() // 소스 파일들 중 컴파일 당시 main은 단 하나만 존재한다.
{
	int sum = addTwoNumbers(1, 2);

	// 함수를 호출하여 사용하는 변수와, 함수의 자료형은 일치해야한다.
	// void - int  조합은 컴파일 할 수 없다.


	//cout << addTwoNumbers(4, 2) << endl;
	//cout << addTwoNumbers(3, 4) << endl;
	//cout << addTwoNumbers(8, 13) << endl;

	// 중복을 보고, 함수를 이용하여 편리하게 사용할 수 있다! -> 패턴이 된다.
	// 더하기를 보고 덧셈의 기능을 하는 함수를 만든 것 처럼 말이다.
	// 함수는 편하려고 쓰는거다! rename으로 이름도 쉽게 바꿀 수 있다.
	// 반복패턴이 생긴다면 함수로 만들어라. 2개, 3개더라도 말이다.

	return 0;
}

자, 앞으로의 노트는 이런 방식으로 코드에도 제 노트와 생각을 적도록 하겠습니다.

벨로그의 글에서는 보다 개념에 가까운 것들에 접근하고자 합니다.

  1. 함수

    함수는 지난 글에서도 적어두었듯, 특정 기능들을 수행할 수 있는 분할된 코드입니다.

    저는 이것을 사용하는 이유에 대해 말씀드릴 때 간략한 코드를 작성하기 위해서라고 말씀드렸습니다.

    제가 이해하고 있기로는 그렇기 때문입니다.

    간략한 코드는 유지보수에 도움이 되고, 실제 코드를 작성할 때 함수는 상당히 편리한 무언가로 존재하게 됩니다.

    그렇다면, 이 함수는 언제 만들어질까요?

    여기서 위 코드에 적힌 내용을 보시면, 중복을 관리하기 위한 하나의 방식으로 이해하고 있다는 것을 보실 수 있을겁니다.

    잠깐, 패턴은 뭔데요?

    당장 제 주관이 듬뿍 담긴 패턴의 의미는 중복을 관리하는 하나의 틀입니다. 템플릿이라고 부르기도 하고, 이는 언제까지나 요구에 의해 최소한으로 작성될 코드의 파편이 됩니다.

    우리에게 당장 필요한 패턴의 의미는 그 정도의 개념이면 됩니다. 더도 말고, 덜도 말고 이 노트에서는 그렇습니다.

    즉, 이는 특정 문제를 해결하는 솔루션이자, 기능을 내포하고 있는 단일 조각입니다. 어쩌면 문제(중복)가 발생하는 지점에서는 해당 구문 전체를 패턴으로 볼 수 있겠습니다.

    예를 들어, 덧셈과 출력을 동시에 하는 실행파일을 만들고 싶은 경우입니다.

    그렇다면 우린

cout << sth << endl;
cout << sth << endl;
cout << sth << endl;

이런식으로 출력 함수를 작성합니다. 심지어 sth 안에는 a + b 형태의 수식이 들어가게 될겁니다.

그러나 우린 3번이나 같은 형태를 하고 있는 코드를 적었고, 우린 이 코드를 더 간편하고, 보기 쉬운 코드로 바꿀 의무가 있습니다.

그러기 위해서는 약간의 사고가 필요하게 됩니다.

  • 가장 먼저, 기능을 분리합시다.

    1. 덧셈

    2. 출력

    2가지 기능을 분리할 수 있습니다.

  • 여기서 해당 기능을 수행하게 해주는 코드를 다시 생각해봅시다.

    1. a + b

    2. cout << << endl

  • 그리고 우린 이 두 기능을 수행하는 함수를 각각 만듦으로써 패턴에 다가서게 됩니다.

int addTwoNumbers(int a, int b)
{
	return a+b;
} 
// 덧셈

void printNumber(int a)
{
	cout << a << endl;
} 
// 출력

다음 항목에서 이어집니다.

  1. return-void, parameter

    위 함수는 2가지 기능을 단순하게 표현한 것 외에 실용성은 극히 떨어집니다.

    그러나 두 함수의 선언 당시 int와 void로 각각 type이 다르다는 것을 보여주기 위한 예시용 코드로는 손색이 없죠.

    return이 존재할 경우 int, char, double, float 등의 data type을 갖는 함수로 선언할 수 있습니다.

    그러나, return값이 존재하지 않는 특정 기능을 수행하는 함수는 void로 선언하시면 됩니다.

    엥 그런데 우리 함수를 선언할 때 변수 선언을 () 안에 했네요?

    이를 우리는 parameter, 매개변수라고 부릅니다. 함수에서는 이 변수를 활용해 특정 기능을 수행하게 되고, 이 변수의 값은 사용처에서 대입하게 됩니다.

    그것을 우리는 arguements, 인수라고 부르게 됩니다.

    즉, 사용처인 main함수 혹은 다른 함수 내에서 해당 함수를 호출할 때 값을 넣어준다면 그것은 args, 인수가 됩니다.

    자, 이제 위 함수가 내포하는 것들은 약간은 알았으니 하나로 합칠 필요가 있습니다.

    그리고 그 과정에서는 main함수 내에서 어떠한 형태로 존재하길 바라는가? 에 대한 생각을 해야 합니다.

    이 생각은 상당히 심오한 생각이 될지도 모릅니다. 아는 것이 많을수록 상당히 어려운 질문이거든요.

    존재하느냐, 존재하지 않느냐, 존재한다면 어디까지 존재할 수 있느냐 이러한 고민 말이에요. 상당히 철학적인 고민이 아닐 수 없습니다. 🤣🤣

    생성된 변수가 함수 호출 이후 소멸하길 바라는가, 아니면 변수를 소멸시키지 않고 main 내에서 지속적으로 사용할 것인가 하는 등의 고민은 꽤나 중요하지만, 지금은 필요 없으니 단순하게 합쳐봅시다.

void printAddTwoNumbers(int a, int b)
{
	cout << a + b << endl;
}

int main() {

	printAddTwoNumbers(2, 3);
    printAddTwoNumbers(3, 4);
    printAddTwoNumbers(4, 5);

	return 0;
}

자, 이런식으로 두 기능을 모두 수행하는 하나의 void 함수를 만들었습니다.

그리고 전과 같이 출력을 위해 3행의 코드를 작성했고, 값 또한 함수 옆에 인수로 잘 전달했습니다.

전과는 달리 조금은 지능적인 코드가 작성되었고, 우리는 덧셈 기능 외의 기능을 이용하기 위해 함수 원형 내부의 수식 하나만 변경해주면 되는 매우 간단하고 강력한 힘을 얻게 되었다고 생각합니다.

이외에도 입력을 받아 출력하는 코드를 첨부할테니, 생각해보시는 시간을 가지실 수 있었으면 좋겠습니다.

#include <iostream>

using namespace std;

void printAddTwoNumbers(int a, int b)
{
	cout << a + b << endl;
}

int main() {

	int a;
	int b;

	cin >> a;
	cin >> b;

	printAddTwoNumbers(a, b);

	return 0;
}

자, 이번 글은 여기서 마치도록 하겠습니다.

좋은 웹페이지 즐겨찾기