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. 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이 갑자기 등장했어요
      • 내 생각에는 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분에 동영상이 끊어지는 부분이 있습니다. 뒤이어 편집을 하셨지만 이전과 이후의 내용이 이해가 잘 되지 않는 것으로 보아 뭔가 들어가야할 내용이 빠진 것으로 보입니다.
              • 코딩!
                감사합니다..
                함수. 전역변수. 지역변수...
              • site[$i]를 둘러싸고있는 따옴표 빼고 돌려보세요
                대화보기
                • 궁금합니다
                  for($i=0;$i<7;$i++){
                  if($_GET['site[$i]']=== true){
                  echo $_GET['site[$i]'], "<br>";}
                  }

                  여기가 왜 안되는지 궁금합니다
                  [] 안에 []가 또 나와서 그러는것같은데 알려주세요
                • 팝스애플
                  자바스크립트 에서는 전역변수에 대한 사용범위가 자유로운데 php는 그렇지 않군요..좋은 강의 감사드립니다
                • 행복부자
                  강의 내용 중 깨알 오타 '활당' -> '할당' ㅋ 함수까지 정주행 완료합니다.
                  수고 많으셨습니다.
                • 나라라
                  전역변수를 함수 내에서 사용하면 undefined variable 이라고 ( 지정되지않은 변수) 라고 나오는데,
                  전역변수를 함수의 인자로 사용할 수 는 있더군요 !!
                  print get_argument($전역변수); <이처럼 쓸 수는 있더라구요..
                  초보인지라 오늘 깨달은걸 적고 갑니당
                • 아라한사
                  어쩌다보니 애들 가르칠 학교에서 잠깐 워드프레스를 가르칠 일이 생겼습니다.
                  예전에 공부한 PHP를 다시 어느정도 머리속에서 환기를 시켜야 할것같아서
                  어딜 볼까 하다가 이고잉님 강의를 보게되네요.

                  항상 감사드립니다.
                • 나무꾼
                  감사합니다~
                • 하얀오리
                  강의 잘 보고 있습니다. 동영상 끊긴부분에 대하여 말씀드리겠습니다.
                  10:40분 test 1 에 대한 전역변수와 지역변수 설정시 결과값을 보는 화면이 빠졌고,
                  <?php
                  $test = 1;
                  function ger_arguments($arg) {
                  $test = 2 ;
                  echo $test ;
                  }
                  get_arguments(1) ;
                  ?>
                  바로 아래와 같은 소스가 화면에 나왔고, 함수안에서 global이 사용되면 좋지 않다는 말씀만 하셔서
                  그 부분이 조금 이해가 안가네요^^;
                  <?php
                  $test = 1;
                  function ger_arguments() {
                  golbal $test ;
                  $test = 2;
                  }
                  get_arguments() ;
                  echo $test ;
                  ?>
                • seymour
                  너무 잘 보고 갑니다!!

                  함수에 대한 이해가 완벽해 졌습니다.

                  class에 대한 강의도 볼 수 있을까요??
                • 행복부자
                  이제 마지막에 언급하신 재미라는걸 알기 시작했습니다.
                  그 동안은 간단한 코드라 붙여 넣기해서 실습했는데,
                  이번 커리부터는 다 코팅하면서 했네요.

                  감사합니다.
                • 샤핀
                  감사합니다.
                • 김수미
                  덕분에 하나씩 배웁니다
                • wonjun
                  function get_arguments($arg=100, $arg2){
                  return $arg1+$arg2;
                  }

                  echo get_arguments(null,4);

                  저도 공부중인데 혹시나 하고 해봤더니 되네요 ^^
                  대화보기
                  • imDev
                    함수의 기본값을 실제로 많이 이용하는지 궁금합니다!

                    가벼운내용으로 한번 알고만 넘어가도 되는건지...

                    그리고 매개변수를 이런식으로 2개 받는데

                    function get_arguments($arg=100, $arg2){
                    return $arg1+$arg2;
                    }

                    function get_arguments(4);

                    하면 104 반환되게

                    이렇게는 안되는건가요??
                  • 환글
                    좋은 강의고맙습니다~~~
                  • public^^
                    잘 보고 있습니다.
                    항상 감사하게 생각하고 있습니다.
                  • 별모모
                    [ PHP, 일 내겠네~! ] PHP 5.4 이상의 배열을 보면서 C로 객체로 무장한 PHP가 몇 가지 변화를 반영한 것을 보면서 강력해지고 있는 것을 느낍니다. 어쩌면 PHP가 컴파일링 언어를 포함하여 가장 강력한 언어가 될지도 모른다는 생각이 듭니다.

                    배열의 [ "리스트1", "리스트2", "리스트3" ]와 function()[] 을 보면서 "소름" 돋았습니다. 이 정도면, 당연히 return function()[]; 까지 될 것 같습니다.
                  • egoing
                    그럼 아름소리님 믿고 이 부분은 넘어갈께요. 혹시 연결이 안되는 부분이 있으면 제보 부탁드려요!
                    대화보기
                    • 아름소리
                      앗 죄송합니다.
                      제가 시간을 잘못 명기했네요.
                      인자의 기본값 동영상에서 '10:40' 부근입니다.
                      "global" 키워드에 대한 사전 설명 없이, 결과를 설명하는 부분이 나와서 말씀드렸던 것인데요.

                      지금보니, 지역변수에 대해만 이해하고 넘어가도 큰 무리가 없을 것 같습니다.
                      감사합니다.
                    • egoing
                      알려주셔서 고맙습니다. 그런데 말씀하신 부분은 끊기는 것 같지는 않은데 다시 한번 봐주시겠어요?
                      제가 본 부분은 인자를 두개 전달하는 것에 대한 설명 부분입니다.
                      대화보기
                      • 아름소리
                        잘 보고 있습니다
                        그런데 동영상 '인자의 기본값'의 12:45에서 불연속적인 부분이 있습니다.
                        그 부분에서 scope에대한 설명도중에, 갑자기 global 결과화면이 나옵니다.
                        참고하세요
                      버전 관리
                      egoing
                      현재 버전
                      선택 버전
                      graphittie 자세히 보기