본문 바로가기

별걸다하는 IT/프로그래밍언어

함수(function)란? 함수의 종류, 함수 역할 및 기능, 메인(Main)함수

반응형

[C언어, C++언어 목차 포스팅 링크 모음]

[Java언어 목차 포스팅 링크 모음]

오늘은 기초 중의 기초 함수에 대해서 다뤄볼까해요.

 

함수(function)란?

수학에서 많이 봤기 때문에 익숙한 그림이죠?

x를 넣었더니 안에서 뭔까 투닥투닥 짬뽕 후 f(x) 즉 y를 뱉어주는 그림이예요.

함수란 어떤 재료를 넣어 새로운 값을 만드는 틀이라고 생각하면 이해하기 쉬워요

근데 틀이 왜 필요할까요?

 

 

 

사용자 정의 함수

 

맨날 하던거처럼 예시로 이해해볼까요? 어차피 다 배울 거기 때문에 한 줄 한 줄 모든 코드를 이해하기보다는 요 포스팅에서는 '함수가 무엇이고 왜 필요한지' 흐름에 대한 이해를 잡는 것에 중점을 두는 것이 좋습니당 

 

예시 ↓

 

 

 

자 중간고사가 끝났어요!!.

학생들은 수학, 영어, 국어 과목을 시험을 봤고 그 채점 점수 파일이 나한테 있다고 가정해봅시다. 각 학생들 평균 점수를 구한 다음 알려주려고 해요.

 

 

 

 

 

 

[C++]

#include <iostream>
using namespace std;

int main()
{
    //김만수 성적
    int kms_total_score = 80 + 70 + 30;
    float kms_avg = (float)kms_total_score / 3;
    cout << "학생 김민수는 " << kms_avg << "점입니다\n";

    //양하늘 점수
    int ygn_total_score = 90 + 80 + 30;
    float ygn_avg = (float)ygn_total_score / 3;
    cout << "학생 양하늘은 " << ygn_avg << "점입니다\n";

    //최상미 점수
    int csm_total_score = 90 + 80 + 30;
    float csm_avg = (float)csm_total_score / 3;
    cout << "학생 최상미는 " << csm_avg << "점입니다\n";

    return 0;
}

(C++은 출력하는데 사용하는 키워드가 cout이예요, Java일 경우 System.out.print, C일경우 printf 언어마다 다르지만 같은 역할을 합니다. 결국은 화면 모니터에 글자를 보여주는 역할을 해요)

예시는 C언어로 들었지만 이번 포스팅은 개념만 이해하는 데 초점을 맞출거라 언어는 크게 의미를 두지 말고 진행합시다.

 

중괄호

int main(void) { ... }

먼저 int main() 함수 뒤에 중괄호 { 가 나오죠?! 이 중괄호는 main 함수의 시작을 알립니다.

닫는 중괄호 '}' 가 나올때까지 여기는 main함수의 구역이라는 약속, 즉 표시입니다. (나중에 말할거지면 결국 main도 하나의 함수예요. 프로그램의 시작을 여기서부터 할거야! 라고 알리는 함수입니다)

 

7~9번 코드

7. int kms_total_score = 80 + 70 + 30;    
8. float kms_avg = (float)kms_total_score / 3;   
9. cout << "학생 김민수는 " << kms_avg << "점입니다\n";

7번 라인 : 김만수 학생의 수학, 영어, 국어 점수를 더해서 토탈 점수를 저장한 다음

8번 라인: 평균을 구하기 위해 총 점수를 3으로 나눴습니다.

9번 라인: 그리고 학생에게 점수를 알려줬습니다.

 

근데 학생이 3명이라 이 짓(?)을 3번을 반복해줬어요 ㅎㅎㅎ

 

문제점

지금 예시는 학생이 3명인것만 작성했지만 만약 100명이라면 와우 코드가 얼마나 길어질까요? 10000명이라면..?

저걸 저렇게 써서 만들바에는 그냥 계산기 두드리는게 더 빠르겠어요.

게다가 저렇게 평균점수 구하는건 간단한 기능이라서 3줄만 차지하니 이정도지 만약에 어떤 하나의 기능을 구현하는데 100줄을 차지한다면 코드의 길이는 더 심각해지고 뭐가 뭔지 알아보기 힘들거예요.

함수의 역할

자 저렇게 특정 기능을 반복해서 사용해야 할 때, 매번 저렇게 일일이 작성해주면 비효율적이니까 하나의 붕어빵 틀처럼, 틀을 만들어놓고 찍어내자! 이게 함수입니다.

#include <iostream>
#include <string>
using namespace std;

void print_avg_score(int math, int eng, int kor, string student_name)
{
    int total_score = math + eng + kor;
    float avg = (float)total_score / 3;
    cout << "학생 " << student_name << "는" << avg << "점입니다\n";
}
int main()
{
    //김민수 점수
    print_avg_score(80, 70, 30, "김만수");

    //양하늘 점수
    print_avg_score(90, 80, 30, "양하늘");
    
    //최상미 점수
    print_avg_score(90, 80, 30, "최상미");

    return 0;
}

여기서 void~로 시작하는 5번째 라인부터 10번째 라인이 평균 점수 출력해주는 기능을 맡아줄 함수예요. 함수역시 시작과 끝을 중괄호로 표기합니다. 함수를 작성하는 문법도 언어마다 조금씩 차이가 있습니다.

 

[함수를 사용하고 난 후 남은 MAIN ]

int main(){    
    print_avg_score(80, 70, 30, "김만수");     //김민수 점수
    print_avg_score(90, 80, 30, "양하늘");     //양하늘 점수
    print_avg_score(90, 80, 30, "최상미");     //최상미 점수
    return 0;
}

이렇게 함수로 따로 빼놓으니까 main 내부가 클린해졌죠? 

main내부에서 3줄에 걸쳐 작성했던게 이제는 내가 만든 함수 이름을 호출함으로써 1줄로 줄어들었어요. 이렇게 우리가 직접 필요에 따라 정의해서 사용하는 함수를 사용자 정의 함수라고 합니다.

지금이야 라인개수 차이가 얼마 안나보이지만, 기능이 복잡해 코드 수가 길수록 또 반복해야할 일이 늘어날 수록 차이는 커질거예요.

라이브러리 함수

사실 저기 있는 cout도 우리가 정의하진 않았지만 편리하게 쓰라고 남이 정의해둔 거예요.

 

여기서 cout이라는 객체에 연산자 <<를 사용하면 모니터에 출력하는 기능을 하도록 함수가 정의되어있습니다. 사실 모니터에 출력을 하려면 그 내부 과정이 매우 복잡해요!! 일단 운영체제한테 나 모니터에 화면 출력할거야 라는 메시지를 전달해야 하고, 또 운영체제는 하드웨어한테 야 어떤 프로그램이 모니터에 뭐 좀 출력하고 싶대 준비해 등등 밑단에서 움직여야 하는 로직들이 있습니다. 누군가가 이거를 만들어줬기 때문에 우리가 이런걸 일일이 신경쓸 필요 없게, 모르게 편하게 사용할 수 있게 된거예요.

 

이런 것을 라이브러리 함수라고 합니다. 앞으로 프로그래밍을 하면서 많은 라이브러리 함수를 사용하게 될거예요.

 

----- ----- -----

즉 함수란 프로그램에서 처리할 내용을 모아두는 기본 단위입니다.

함수가 호출되면 함수 안에 있는 문장들이 순차적으로 수행돼요.

문장들을 수행하다가 함수의 끝을 만나거나 리턴문을 만나면 함수를 호출한 것으로 되돌아갑니다. 

(즉 위 예시에서는 함수명을 호출하는 14번 라인을 만나면 해당 함수명과 똑같은 함수 몸체를 찾아 5번으로 올라가서 차례로 수행 다하고 10번라인에서 함수의 끝을 만나 다시 15번 라인으로 돌아옵니다)

여러번 갖다가 쓸 수 있습니다. 뽀대나는 말로 코드의 재사용성을 높여줘요. 가독성도 높여줍니다. 구조적으로 프로그램을 작성할 수 있게 해줘요.

 

main도 함수다!

자바나 안드로이드나, C나 어떤 프로그램이든 개발할 때 보면 main이 있는데 main에서 프로그램이 시작되고 종료됩니다.

main은 프로그램의 시작점이자 프로그램의 끝입니다. 좀 더 자세히 말하면 컴파일러가 처음으로 컴파일할 사작지점을 명시해주는 역할을 해요. 프로그램의 실행 순서는 결국 main의 흐름인거죠, 그러다가 함수호출당하면 함수한테 뿅 갔다가 다시 돌아오고..ㅎㅎ 아무튼 시작점을 명시해줘야하니까 main은 반드시 하나여야 합니다. 그런데 이 main도 함수라는거~!

 

A program is made of one or more functions, one and only one of which must be named main.

The execution of the program always starts with main, but it can call other functions to do some part of the job.

프로그램은 하나 또는 그 이상의 함수들로 구성되어 있어요, 그 중 하나는 main!

프로그램은 항상 main부터 시작해서 실행하는데 main은 특정 작업을 수행하기 위한 함수들을 호출할 수 있습니다.

 

오늘은 대략 함수가 무엇인지에 대해 살펴보았고,

함수의 구조, 함수 작성법, 인수, 리턴값, 함수 포인터, 주의해야할 점 등등 함수에 대해서 다뤄야 할 많은 내용들은 각 언어 포스팅 함수 파트에서 좀 더 자세히 다룰게요.

도움이 됐다면 ♥ 공감과 댓글 또는 혜자광고클릭으로 ♥

너무 해달라고 애교부리는거같지만..ㅎㅎㅎㅎ (머쓱...ㅎㅎ님도 좋구 나도 좋구 모두 좋규 다 좋구)

 

반응형
  • 나그네 2020.07.26 04:35

    👍

  • 아리랑 2021.02.09 11:58

    진짜 최고로 깔끔한 함수 설명이에요 !!!!!!!!!!!!!!!!!!!!!! 궁금증 완전 해결 ㅜㅜㅜㅜ

  • 그레나다 2021.03.18 13:32 신고

    안녕하세요
    좋은 글 감사합니다.
    그런데 cout은 클래스 아닌가요? 다른 포스팅에서는 클래스라고 하셨었거든요
    실제 함수는 연산자 오버라이딩 함수인 << 이지 않나요?

    • IT 양햄찌(jhnyang) 2021.03.18 15:43 신고

      안녕하세요~ cout는 엄밀히말하면 스트림클래스인 ostream의 객체입니다. 연산자 오버로딩을 통해 출력기능을 부여한게 맞아요. 아무래도 입출력함수 이렇게 많이 통용하다보니 의식하지 못한채로 기재했나보네요 ㅎㅎ 오해의소지가 있을 수 있으니 수정토록하겠습니다 알려주셔서 감사해요 :) 👍

    • 그레나다 2021.03.18 17:13 신고

      답변해 주셔서 정말 감사합니다.
      저도 질문드리면서 올바른 용어를 사용하지 못했네요. 객체, 연산자 오버로딩 ㅎㅎ 좋은 하루 되세요