선생님을 위한 프로그래밍 수업

함수

토픽 선생님을 위한 프로그래밍 수업 > 웹 애플리케이션 만들기 > PHP

함수

함수(function)란 하나의 로직을 재실행 할 수 있도록 하는 것으로 코드의 재사용성을 높여준다. 사실 함수 이전에 우리가 배웠던 것들로도 프로그램을 만들 수 있다. 그런 점에서 함수 이전의 내용들은 프로그래밍의 실체라고 할 수 있다. 그 이후부터 등장하는 함수나 객체지향과 같은 개념들은 그것 자체가 프로그래밍의 연산이나 논리에 직접적으로 관여하는 것이라기 보다는 방대한 양의 코드를 줄여주고, 유지보수를 쉽게하고, 버그가 발생할 여지를 줄여주는 것들이라고 할 수 있다. 이것들 없이 거대한 소프트웨어를 만든다는 것이 불가능하지는 않지만, 현실적으로 어렵다.

함수의 형식

함수의 형식은 아래와 같다.

function 함수명( [인자...[,인자]] ){
   코드
   return 반환값;
}

함수의 정의와 호출

함수는 키워드 function 뒤에 함수의 이름이 오고, 괄호가 따라온다. 괄호 안에는 함수에 대한 입력 값을 담을 변수의 이름이 오고, 복수의 입력 값을 정의 할 때는 변수와 변수 사이에 콤마로 구분한다. 중괄호에는 함수가 호출 되었을 때 실행될 코드가 온다. 다음은 함수의 예를 보여준다. 이 함수의 이름은 numbering이고, 내용은 0부터 9까지를 화면에 출력한다.

/function/1.php

<?php
function numbering(){
    $i = 0;
    while ($i < 10) {
        echo $i;
        $i += 1;
    }
}
numbering();
?>

아래 예제는 위의 함수를 호출한다.

numbering()

함수가 없다면

아래 예제를 보자. 이전 시간에 0부터 9까지 출력하는 애플리케이션을 만들었다. 그런데 0부터 9까지를 5번 출력해야 한다면 어떻게 해야할까? 아래와 같이 해야 할 것이다.

/function/2.php

<?php
$i = 0;
while ($i < 10) {
    echo $i;
    $i += 1;
}

$i = 0;
while ($i < 10) {
    echo $i;
    $i += 1;
}

$i = 0;
while ($i < 10) {
    echo $i;
    $i += 1;
}

$i = 0;
while ($i < 10) {
    echo $i;
    $i += 1;
}

$i = 0;
while ($i < 10) {
    echo $i;
    $i += 1;
}

?>

만약 이것을 1000번 해야 한다면? 각각의 로직이 1000 줄에 육박한다면? 그리고 그 내용을 수정해야 한다면? 암담한 느낌이 드는가? 함수를 사용한다면 이러한 문제를 현저히 줄일 수 있다. 아래의 예제를 보자. 결과는 같지만 로직은 단 한번만 등장한다.

/function/3.php

<?php
function numbering () {
    $i = 0;
    while($i<10){
        echo $i;
        $i += 1;
    }
}
numbering();
numbering();
numbering();
numbering();
numbering();
?>

입력과 출력

함수의 핵심은 입력과 출력이다. 입력된 값을 연산해서 출력하는 것이 함수의 기본적인 역할이다. 다음은 함수에서 입력과 출력의 역할을 하는 구문들에 대한 설명이다.

return (출력)

함수 내에서 사용한 return은 return 뒤에 따라오는 값을 함수의 결과로 반환한다. 동시에 함수를 종료시킨다. 아래 내용을 보자. 결과는 egoing,k8805다.

/function/4.php

<?php
function get_member1(){
    return 'egoing';
}


function get_member2(){
    return 'k8805';
}

echo get_member1();
echo ',';
echo get_member2();
?>

get_member1와 get_member2를 출력(echo)한 결과가 각각 egoing과 k8805인 이유는 함수에서 return이 등장하면 return 뒤의 값이 반환되기 때문이다.

return은 결과를 반환하는 것 외에 함수를 중지시키는 역할도 한다. 다음 코드를 보자. 결과는 egoing이다.

/function/5.php

<?php
function get_member(){
    return 'egoing';
    return 'k8805';
    return 'sorialgi';
}
echo get_member();
?>

k8805와 sorialgi는 출력하지 않았다. 왜 그럴까? 그것은 return 'egoing'을 실행한 후에 함수가 종료되었기 때문이다. 함수에서 return이 등장한 이후에는 함수 내의 어떠한 코드도 실행되지 않는다.

인자

인자

인자(argument)는 함수로 유입되는 입력 값을 의미하는데, 어떤 값을 인자로 전달하느냐에 따라서 함수가 반환하는 값이나 메소드의 동작방법을 다르게 할 수 있다. 다음 예를보자. 결과는 1,2이다.

/function/6.php

<?php
function get_argument($arg){
    return $arg;
}

print get_argument(1);
print get_argument(2);

?>

4행의 get_argument(1)은 1행에서 2행 사이에 정의된 함수를 실행하는 구문이다. 4행의 1은 get_argument로 1이라는 값을 전달하겠다는 의미다. 이 때 1행에 정의된 ($arg) 구문에 의해서 변수 $arg의 값으로 숫자 1이 함수 안으로 전달된다. 이 변수는 get_argument 안에서만 유효하다. 이 관계는 아래와 같다.

복수의 인자

그럼 여러개의 입력 값을 받고 싶다면 어떻게 해야할까? 다음 예제를 보자. 결과는 30과 50이다.

/function/7.php

<?php
function get_arguments($arg1, $arg2){
    return $arg1 + $arg2;
}
echo get_arguments(10, 20);
echo get_arguments(20, 30);
?>

위의 예제를 그림으로 나타내면 아래와 같다. 즉 함수를 호출 할 때 전달한 인자 10과 20은 함수의 선언부(1행)의 arg1, arg2에 차례로 할당된다. 이렇게 전달된 값은 함수 내부로 전달되서 더해진 후에 반환된다.

인자의 기본값

만약 함수를 호출 할 때 기본값을 사용하고 싶다면 어떻게 해야할까? 기본값이란 인자의 값이 주어지지 않았을 때 사용할 값을 의미한다. 다음 예제를 보자. 결과는 1, 100이다.

<?php
function get_arguments($arg1=100){
    return $arg1;
}
echo get_arguments(1);
echo ',';
echo get_arguments();
?>

1행의 $arg = 100 은 인자 $arg의 기본 값으로 100을 사용하겠다는 의미다. 그렇게되면 인자의 값이 설정되지 않았을 때 $arg의 값은 100이 된다.

댓글

댓글 본문
  1. DreamBoy
    2023.10.25. PHP - 함수 파트 수강했습니다.
  2. 코딩혁명
    감사합니다~
  3. dueto park
    2022.07.04. 함수 수강 완.
  4. 코드파괴자
    22.05.19 complete.
  5. 드림보이
    2022.01.14. 함수 파트 수강완료
  6. ggyuker
    21.12.31 수업완료 (완벽하게 이해는 아님)
  7. jeisyoon
    2021.07.25 Function - OK
  8. 재영
    @Daunbi Jeong
    시간이 오래 지나 이미 답을 얻으셨을지 모르지만 다른 분들도 의문을 가질 수 있을것 같아 남겨드립니다.
    우선 get_argument와 get_arguments는 각각 그 이름을 함수명으로 하여 함수를 정의한 것 입니다.

    풀어서 해석하자면 아래의 코드도 함수명은 다르지만 정상적으로 같은기능으로 동작하게 됩니다.

    function a($arg){
    retrun $arg;
    }
    echo a(1);

    여기서는 함수명이 a로 정의되었으나 실행하여도 같은 결과를 얻을수 있다는걸 아시게 될겁니다.

    질문하신부분을 정리하자면 앞부분의 get_argument 함수에서는 인자를 1개만 전달받아 반환하지만 get_arguments 함수에서는 2개의 인자를 전달받아 반환하게됩니다.
    이에 함수명을 정하실 때 단순히 인자를 뜻하는 argument에 복수형을 뜻하는 s를 붙이신것으로 판단됩니다^^
    대화보기
    • wico
      감사합니다
    • Daunbi Jeong
      앞부분에는 get_argument라고 쓰는데 뒤에 입력 값이 여러 개일 때는 get_arguments라고 쓰네요. 상관없는 건가요?
    • choon
      감사합니다.
    • 호두
      고맙습니다
    • 방랑객
      1) echo $test; 부분으로 2만 출력되는게 맞습니다.
      2) get_arguments() 함수는 global을 통해 전역변수 $test의 값 1을 값2로 변경하는 기능만 합니다.(리턴이 없음)
      따라서 출력되는 값이 없습니다.
      3) 함수명을 통하여 값을 출력하고 싶으시다면 함수 내에 return $test; 를 추가하고 함수 밖에서
      echo get_arguments(); 로 작성해야 됩니다.
      대화보기
      • 하니사
        저는 오히려 global 이 안되어 있으면 변수들이 통용이 안돼서 불편하던데,
        다른 강의에서도 global은 추천하지 않더라구요.
        좀 더 수준이 늘면 이해되겠죠!
      • 웅이
        강의 제일 마지막 부분 코드
        <?php
        $test = 1;
        function get_arguments(){
        global $test;
        $test = 2;
        }
        get_arguments();
        echo $test;
        ?>
        를 실행하면 2만 출력되는게 맞나요?
        7라인의 get_arguments(); 혹은 앞에 echo를 붙인 echo get_arguments(); 는 왜 출력이 안되는건가요?
        함수안에 return을 넣어도 출력값은 안나오네요...
        강의가 중간에 끊켜서 설명이 없네요 ㅠㅠ
      • 정우현
        /function/7.php 아래에 있는 함수 그림에서
        function $arg1 + $arg2;를
        return $arg1 + $arg2;로 바꿔야할 것같아요!
      • 머시써
        함수 잘 봤습니다. 수고하셨어요
      • Hyung Jun Choi
        인자의 기본값 강의영상에 '할당'이 아닌 '활당'이라고 언급하시네욥.. 정정이 필요해 보입니다..ㅎㅎ
      • dosamo
        완료
      • 송성태
        함수 잘 봤습니다!
        그런데 동영상에 오류가 있습니다, 선생님.
        10:49초 경에 'global'이 바로 등장합니다.
        앞 부분 설명이 약간 짤린 것 같습니다. ^^
      • 다시시작
        아직 완전히 이해하지 않았지만 일단 완료.
      • kimjs9105
        감사합니다~ 며칠간 아파서 제대로 못봣네요 주말동안 열심히 공부하겠습니다~~~
      • spiritord
        감사합니다
      • sheis
        잘 봤어요^^
      • 김동욱
        ㅋㅋㅋㅋasmr 댓글 실화냐
      • 심화평
        07-13 감사합니다
      • 댓글웃김
        ㅋㅋㅋㅋㅋㅋㅋ
      • treehouse
        함수마저 쉽게 이해시킨 이고잉 센세 당신이란 사람은 대체..
        4년이나 지난 동영상임에도 촌스럽기는커녕 오히려 시대를 앞서간 모던함 강의...

        목소리마저 완벽해서 강의 동영상인지 asmr인지 별풍쏴야할것같은 목소리..
        더 킹갓엠페러 제네럴 충무공 이고잉 센세...
      • 기린
        좋은강의 항상 감사드립니다.
      • 김세창
        인자의 기본값 지역변수,전역변수. 대충 이해함.
        다시한번 더 보기

        잘 봤습니다 .^^ ㅎㅎ
        2017.03.30
      • funlife
        감사합니다.
      • NamJin Kim
        감사합니다 마지막 코드가 달라서 그런거 같아요 echo $i;
        9+1 =10
        $i<10 은 조건에서 안맞아서 그런거 같아요 확실하지는 않지만;;
        대화보기
        • 지나가다
          While 문 안의
          $i 가 9 일때 정상적으로 "echo $i" 출력
          $i += 1; // $i 가 10 이 됨

          while 문의 조건문으로 가서 비교문 검사해 보니 조건이 false 임
          $i 가 10인 상태이나 조건 비교에서 false 라서 { 내용 } 을 처리 하지 않고 loop 문을 빠져나옴

          참고로 아래 코드처럼 해보세요
          <?php
          function numbering () {
          $i = 0;
          while($i<10){
          echo $i;
          $i += 1;
          }
          echo $i; // 요기 이거 추가해서 시험해 보세요 ^^
          }
          대화보기
          • NamJin Kim
            코드랑 다른 질문인데요
            <?php
            function numbering () {
            $i = 0;
            while($i<10){
            echo $i;
            $i += 1;
            }
            }

            출력값이 0123456789 자나요
            마지막에 i에 9가들어가면 9+1 되서 10도 출력 되야하는거 아닌가요?
            왜 10은 출력이 안되고 0~9 까지만 출력되는거죠?
            수학적문제인지?아니면 제가 이해를 잘못하고 있는건 가요?
          • 신입1
            global 을 권장하지 않는다면 php 에서는 프로그램 짤때 지역에서 전역변수 값을 바꾸는 식으로 짜는 경우가 없나요?
          • 감사합니다
            함수 인자의 기본값 동영상에서 10:43에서 영상이 편집된 것 같아요 44초로 넘어가는 순간 global이 갑자기 등장했어요
          • angel
            내 생각에는 while 문은 결국 numbering() 안에 포함된것인데
            for 문이 while 문 위에 있든 아래에 있든 먼저 실행되는것이 당연한것 같네요.
            대화보기
            • Brandon S. Ha
              감사합니다
            • JustStudy
              고맙습니다
            • SK Kim
              힘내고 있습니다!
              요건 그냥 이렇다!..라고 생각하고 넘어가야겠네요.
              나중에 코딩 지식이 더 쌓이면 저절로 이해가 될듯.
              대화보기
              • YW Kim
                To SK Kim

                test1 함수 안에 echo가 있기 때문에 먼저 1111 이 나오는 것이 맞습니다.

                return은 본문의 echo "3333".test1().test2(); 로 값을 넘겨주는 것이기 때문에 예상하신대로 나오는 것이고요

                호기심이 많으신 분 같네요 ^^

                공부 힘내세요!
              • SK Kim
                의견 감사합니다.
                전자 내용은 무엇을 특별히 구현할려고 한건 아니고 첫 동영상 내용의 이해를 돕기위해 이것저것 실험한거에요.
                영상과 다르게 호출을 5번 대신 10번한거고 화면에 출력된걸 count하기 쉽도록 앞에 $i 즉 for문 횟수도 같이 출력할려고 한건데...
                정작 앞이 아니라 뒤에 출력되어 후자 내용 즉 test 함수들로 또 실험한거죠..ㅋㅋ
                echo가 무조건 먼저 실행 된다는 내용은 지금까지 강의를 들으면서 처음 들어요.
                그게 사실이라고 해도 좀 이상한거 같아요.
                대화보기
                • 생활코딩왕팬
                  중괄호끝에 세미콜론이 붙는거는 문법에 맞지 않다고 봅니다...
                  그리구...
                  test1 함수에 return 안쓰고 echo쓰니깐 무조건 가장먼저 출력되는겁니다
                  echo는 인자 전달이고뭐고없이 함수고뭐고 상관없이 그냥 읽히는순간 출력되불어요~
                  echo "3333".test1().test2(); 이부분이 읽혀지기 전에
                  코딩 상 맨 위에서부터 읽어내려오니깐
                  가장 먼저 나타난 echo 명령부터 일단 실행시키고 보는거져
                  의도하신바가 뭔진 몰겟지만 저런식으로 코딩하실거면 그냥 return이라고 수정하시는게 좋으실듯..
                  그리고
                  $i = 0;
                  while ($i < 10) {
                  echo $i;
                  $i += 1;
                  };
                  for ($i=0; $i < 10 ; $i++) {
                  echo $i.numbering()."<br>";
                  };
                  이 부분은 대체 무얼 구현하려고하시는건지 도무지 모르겠네여
                  문법에 어긋나는거 하나하나 다 잡아보다보니깐
                  구현하시려고 하셨던 부분까지도 변형시켜버리는것 같아서
                  함부로 답변해드릴수가 없는 난해한 부분인듯요~
                  차라리 뭘 구현하시려는지만 명시되있다면
                  그것에 맞춰서 고민해 볼수있었을텐데......
                  구현하시려고하는게 어떤건진 모르겠지만
                  아래 코드가 혹시 도움이 되실지 모르겠네요
                  님의 질문코드를 저 나름대로 추측하여 구현해본 코드입니다
                  <html>
                  <body>
                  <?php
                  function numbering(){
                  $i = 0;
                  while ($i < 10) {
                  echo " $i";
                  $i += 1;
                  }
                  }
                  $j=1;
                  for ($j=1; $j < 11 ; $j++) {
                  echo "<".$j.">";
                  echo numbering()."<br><br>";
                  }
                  ?>
                  </body>
                  </html>

                  ***혹여나 제가 동문서답이라도 한것이라면...이해해 주세요..php공부를 어제 처음시작한 사람입니다.ㅠ***
                  대화보기
                  • SK Kim
                    첫 동영상 공부하면서 이거저거 하다 예상하지 않은게 나오네요.
                    function numbering(){
                    $i = 0;
                    while ($i < 10) {
                    echo $i;
                    $i += 1;
                    };
                    for ($i=0; $i < 10 ; $i++) {
                    echo $i.numbering()."<br>";
                    };
                    요렇게 하면 함수 numbering() 내용이 먼저 나오고 그다음 $i."<br>"이 출력 됩니다.
                    실험삼아 다음과 같이 해보니 함수안에 echo가 있고 그것을 echo로 출력해서 그런거 같은데 잘 모르겠네요.
                    function test1(){
                    echo 1111;
                    };
                    function test2(){
                    return 2222;
                    };
                    echo "3333".test1().test2();
                    test2()는 예상되로 "3333" 뒤에 출력 되는데 test1()은 무조건 제일 먼저 출력 됩니다.
                  • 진돌
                    재미있는 강의!
                    아직까지는 피곤하지 않네요...^^:
                    감사합니다!
                  • 2015-11-16
                    아직까진 자바스크립트와 문법이 다른게 거의 없군요.
                  • 우렁군
                    /function/6.php 파일에서 메시지를 출력할 때 다른 파일들과 달리 'print'를 사용하신 특별한 이유가 있는 건가욧?
                  • Jeff
                    동영상 마지막쯤 (함수 내에서 global 전역번수 호출 바로 전)편집으로 흐름이 끊겼네요. 일시 멈춤해놓고 추정해서 이해했어요. 늘 감사한 맘으로 배우고 있어요~^ ^
                  • rkdwltn0@naver.com
                    인자의 기본값 부분 10:40분에 동영상이 끊어지는 부분이 있습니다. 뒤이어 편집을 하셨지만 이전과 이후의 내용이 이해가 잘 되지 않는 것으로 보아 뭔가 들어가야할 내용이 빠진 것으로 보입니다.
                  • 코딩!
                    감사합니다..
                    함수. 전역변수. 지역변수...