본문 바로가기

비개발자의 개발 일지

현장 팀장에서 수출 ERP까지 — AI와 함께 시스템을 만든 기록

시리즈 보기
php

PHP 함수 매개변수와 변수 스코프 — 전역/지역/삼항 완전 정리

by 왕진 2026. 6. 13.
반응형

 

 

Web Development · PHP Function Args

PHP 함수의 매개변수 —
전역변수, 지역변수, 삼항 연산자

$myage를 함수에 넘겨 성인 여부를 판정하는 코드
시작 오늘 분석할 코드

외부에서 만든 나이 변수($myage)를 함수 check_adult매개변수로 넘겨 성인 여부를 판정·출력하는 코드다. 함수 정의, 매개변수, 지역변수, 삼항 연산자가 모두 한 번에 등장한다.

<?php $myage = 19; // 연령 — 전역변수 check_adult($myage); // 기능 함수 호출 — $myage가 매개변수 $age에 전달됨 function check_adult($age){ // $age = 매개변수 (지역변수) $adult_age = 20; // 비교용 기준 — 지역변수 $adult_check = ($adult_age <= $age) ? "어른" : "아이"; print $adult_check." 입니다."; } ?>
실제 출력 결과
아이 입니다.
용어 용어 정리
function사용자 정의 함수를 만드는 키워드
매개변수함수가 외부에서 받는 값을 담는 변수
인수 (argument)함수 호출 시 실제로 넘기는 값
전역변수함수 바깥에 선언된 변수
지역변수함수 안에서만 살아있는 변수
스코프변수의 유효 범위 — 어디서 쓸 수 있는가
삼항 연산자조건 ? 참값 : 거짓값 — 짧은 if-else
.문자열 결합 연산자 (PHP 고유)

1 함수 정의 vs 함수 호출

함수는 정의(만들기)호출(실행하기)이 분리되어 있다.

정의 (define)
function check_adult($age) { … }
틀을 만들어두는 단계
만들기만 해서는 실행 안 됨
호출 (call)
check_adult($myage);
실제로 실행하는 단계
괄호 안에 인수를 적어 넘김
PHP는 호이스팅(hoisting)을 일부 지원한다. 즉 호출이 정의보다 앞에 있어도 (이 코드처럼) 동작한다. 하지만 가독성을 위해 보통 정의를 먼저 적는다.

2 매개변수와 인수의 관계
function check_adult($age) { ← 매개변수 (parameter): 받을 그릇 … } check_adult($myage); ← 인수 (argument): 실제 넘기는 값 │ └→ $age = $myage 의 복사본 (= 19)
구분 정의에서 호출에서
이름 매개변수 (parameter) 인수 (argument)
역할 받는 변수의 그릇 실제 넘기는 값
이 코드 $age $myage
함수 안에서는 $myage라는 이름은 존재조차 모른다. 단지 그 값(19)이 $age라는 새 변수에 복사돼 들어왔을 뿐.

3 전역변수와 지역변수의 차이

PHP의 변수 스코프(범위)는 매우 엄격하다 — 다른 언어와 달리 함수 안에서 함수 바깥의 변수에 자동으로 접근할 수 없다.

$myage = 19; ← 함수 바깥 → 전역변수 function check_adult($age) { $adult_age = 20; ← 함수 안 → 지역변수 // 여기서 $myage는 보이지 않는다! }
변수 선언 위치 유효 범위 함수 안에서 접근
$myage 함수 바깥 전역 직접 접근 불가 (매개변수로 넘겨야 함)
$age 매개변수 함수 안 가능 (자기 함수 안에서)
$adult_age 함수 안 함수 안 가능
$adult_check 함수 안 함수 안 가능
※ 함수가 끝나면 지역변수는 모두 사라진다. $age, $adult_age, $adult_check는 함수 바깥에서 사용 시 undefined 경고가 뜬다.

4 값으로 전달 — 복사본이 들어간다

PHP의 기본 매개변수 전달은 값 복사(pass by value)다.

$myage = 19; check_adult($myage); ← $age에는 19가 "복사"된다 function check_adult($age) { $age = 100; ← 함수 안에서 바꿔도 } ← 바깥의 $myage는 19 그대로
※ 참조로 전달하려면
  • 매개변수 이름 앞에 &를 붙임: function f(&$x)
  • 그러면 함수 안 변경이 바깥 변수에도 그대로 반영됨
  • 객체는 참조처럼 동작 — 값 복사로 적어도 같은 객체를 가리킴

반응형
5 삼항 연산자 — 짧은 if-else
$adult_check = ($adult_age <= $age) ? "어른" : "아이";

삼항 연산자 조건 ? 참값 : 거짓값한 줄로 분기 결과를 변수에 담을 때 쓴다. 일반 if-else와 비교하면 다음과 같다.

if-else (3줄)
if ($adult_age <= $age) {
  $adult_check = "어른";
} else {
  $adult_check = "아이";
}
삼항 (1줄)
$adult_check = $adult_age <= $age ? "어른" : "아이";
같은 동작, 더 짧음
$adult_age = 20, $age = 19 → 20 <= 19 거짓 → $adult_check = "아이"

6 점(.) — 문자열 결합 연산자

PHP는 문자열을 합칠 때 + 가 아니라 . 을 쓴다. (자바스크립트와의 큰 차이점)

print $adult_check." 입니다."; // "아이" . " 입니다." // = "아이 입니다."
방식 특징
점 결합 $a . " " . $b 명시적, 항상 안전
큰따옴표 보간 "$a $b" 짧고 읽기 쉬움
중괄호 보간 "{$a}님" 변수 경계 모호 시 사용
+ 사용 (틀림) $a + $b 숫자 덧셈으로 해석됨
"문자" + "다른 문자"는 PHP에서 0이 된다 (각각 숫자로 변환되어 0+0=0). 문자열 결합은 반드시 ..

7 실행 흐름 단계별 추적
1
$myage = 19전역 스코프에 변수 생성, 값 19 저장
2
check_adult($myage) 호출함수 안으로 점프 → $age 매개변수에 19 복사
3
$adult_age = 20함수의 지역변수 생성
4
($adult_age <= $age)20 <= 19 → 거짓 → 삼항이 "아이"를 선택
5
$adult_check = "아이"지역변수에 결과 저장
6
print "아이"."입니다.""아이 입니다." 출력
7
함수 종료지역변수 ($age, $adult_age, $adult_check) 모두 소멸

8 자주 하는 실수
실수 증상 해결
함수 안에서 $myage 직접 사용 undefined 경고 → null 처리 매개변수로 넘기거나 global $myage;
매개변수 누락 "missing argument" 경고 호출 시 모든 매개변수 채우거나 기본값 지정
문자열 결합에 + 0 또는 NaN 같은 결과 PHP의 결합 연산자는 .
삼항에서 괄호 누락 연산 우선순위 꼬임 조건을 괄호로 감싸기
비교 연산자 방향 헷갈림 <<= 혼동 경계값(20)이 어느 쪽 포함인지 명확히
function 키워드 오타 구문 오류 function (소문자, 한 단어)

9 함수가 좋은 이유
※ 만약 함수 없이 짠다면?
  • 나이 검사 코드를 매번 복사·붙여넣기 해야 함
  • 한 곳에서 버그 고쳐도 다른 곳은 그대로 → 일관성 깨짐
  • 코드 의도(이게 무얼 하는 코드인가)가 잘 안 드러남

함수 한 번 정의하면 check_adult(15), check_adult(35) 같이 입력만 바꿔 무한히 재사용할 수 있다. 코드의 의도도 함수 이름만 봐도 분명해진다.


핵심 한 줄 요약

function사용자 정의 함수를 만드는 키워드
매개변수함수가 외부에서 받는 값을 담는 변수 ($age)
전역 vs 지역PHP는 함수 안에서 바깥 변수에 자동 접근 안 됨
값 복사매개변수는 기본적으로 복사본이 들어간다
삼항 연산자조건 ? 참값 : 거짓값 — 짧은 분기
.PHP의 문자열 결합 연산자 (자바스크립트와 다름)
함수의 의의동일 로직을 한 번 정의하고 무한 재사용
반응형

댓글