
분류 : 활용서
주제 : 킴스큐
개설일자 : 2011년 02월 01일
라이선스 : 비영리,재배포허용
포인트 : 56,006
등급 : 파워유저+ (16)
작성자를 추천해 주세요
(02) 변수/상수/배열/함수/객체
변수/상수/배열/함수/객체..
를 접하기 전에 먼저 각각의 용어에 대한 이해가 필요합니다.
함수라는 단어는 보통 중학교 수학시간에 처음으로 접하게 되는데 "y는 x에 대한 관계식" 혹은 "y는 x에 의해서 종속적으로 정해는 값" 등으로 배우게 됩니다.
사실 써놓고도 쉽지 않습니다.
단어자체가 어렵기 때문에 이해하기도 쉽지 않았다는 것을 한참 시간이 지난후에 깨달았는데 가르치는 입장에서 좀더 쉬운 단어를 이용해 풀어준다면 적어도 "함수" 수준에서 수학을 포기하는 학생이 줄어들지 않을까 하는 생각을 해 봅니다.
사실, 함수는 중학교때 처음으로 듣는 단어이지만 알고보면 국민하교 아니 초등하교때 부터 배우는 개념입니다.
y = f(x)
정말 많이 본 식입니다.
이 것을 php 함수로 표현하면 이렇습니다.
function f(x)
{
retrun $value;
}
$y = f($x);
그리고 이 것을 초등학교 수준으로 표현하면 다음과 같습니다.
6 = []*3
이 것을 함수료 표현하면, y = f(x) 이고
y = f(3) 입니다.
그렇다면 f 즉, function 은 * 2 가 됩니다.
너무 쉽습니다.
그런데 이 것 마져도 중학교때 이해하지 못하는 경우가 태반입니다.
왜그럴까요?
"단어" 자체의 의미를 파악하지 못했기 때문입니다.
(혹은 관심이 없었기 때문입니다)
때문에 변수/상수/배열/함수/객체.. 를 이해하기 위해서는 단어 자체의 의미부터 이해해야만 정상적인 접근이 가능합니다.
다음은 각각의 용어에 대한 한자어입니다.
익히 아시겠지만 대부분의 용어들은 한자어입니다.
따라서 각각의 용어에 대한 한자의 기본뜻을 이해하지 않고 접근하는 것은 본래의 뜻을 접근하지 못했다고 볼 수 있으며 그럴 경우 제대로 된 이해를 이끌어내기 어렵다는 것이 필자의 생각입니다.
변수 : 變數
상수 : 常數
배열 : 排列
함수 : 函數
객체 : 客體
이 것을 한자 그대로 직역하면..
변수 : 변할 수 있는 수 또는 변하는 수
상수 : 일정한 수
배열 : 일정하게 벌려놓는 것
함수 : 상자(통) 수
객체 : 각각의 몸 , 손님의 몸?
다시 이 것을 의역하면..
변수 : 결과가 바뀔수 있게 할 수 있는 어떤 상황 (수)
상수 : 이미 정해져 있는 불변의 상황 (수)
배열 : 일정한 규격에 따라 분리되어진 집합
함수 : 주어진 변수가 정해진 관계식에 대입된 상황 (결과)
객체 : 모든 사물,동작 등에 접근할 수 있도록 구조화한 형체 (개념)
* 위의 풀이는 필자 개인적인 의견이므로 실제와 다를 수 있습니다.
아직도 이해하기 어렵습니다.
좀더 풀어보겠습니다.
변수 : 오늘 비가 온다는 예보가 있는데 야구장을 가야하나 말아야 하나.. 오늘의 변수는 비구나..
상수 : 파이는 무조건 3.141592.... 이다. 파이는 항상 일정한 상수다.
배열 : 김밥 한줄을 썰어서 10조각이 나왔다. 썰어진 김밥은 배열이다. 김밥[0] 은 첫번째 김밥 조각이다.
함수 : 압력솥에 잘 씻은 쌀과 물을 넣고 가열했더니 20분후에 쌀밥이 됐다. 함수는 압력솥이다.
객체 : 자동차는 바퀴,핸들,시트,달리다 로 표현할 수 있다. 바퀴는 자동차를 위한 객체이다.
* 위의 풀이는 필자 개인적인 의견이므로 실제와 다를 수 있습니다.
그래도 이해가 안된다면..
좀더 풀어보겠습니다.
1)변수 (variable)
변수는 변하는 수, 변할 수 있는 수, 나 때문에 상황이 바뀔 수 있는 수...
오늘 야구장에 가야하는데 날씨가 변수다...
<?php
$날씨 = '맑음';
if ($날씨 == '비')
{
echo '우천취소';
}
else {
echo '야구 정상적으로 진행';
}
?>
날씨 라는 변수가 "맑음" 일 경우 야구는 정상적으로 진행될테지만 "비" 라면 우천취소가 될 것입니다.
즉, 날씨는 맑을 수도 있고 흐릴 수도 있고 비가 올 수도 있는 "변수" 라는 것입니다.
그런데 변수에는 여러가지 형식(자료형)이 있습니다.
위의 경우 $날씨 라는 변수는 문자형(string) 형식입니다.
이 형식 즉, 자료형은 변수 뿐만 아니라 배열,상수,함수,객체 모두 해당되는데 다음과 같은 것들이 있습니다.
- 정수형 (integer)
- 실수형 (float)
- 문자형 (string)
- 객체형 (object)
- 배열형 (array)
- 자원형 (resource)
이중 정수,실수,문자만 이해하고 넘어가겠습니다.
정수는 -N ... -2,-1,0,1,2 ... N 과 같은 수이고
실수는 소수점을 가진 수이고
문자는 말그대로 문자입니다.
중요한 점은 변수라는 것은 정수,실수,문자 등으로 사용될 수 있다는 점이며 다음으로 다룰 상수,배열,함수,객체도 마찬가지라는 것입니다.
자료형에 대한 자세한 것은 다음장에서 더 깊이 다뤄보도록 하고 여기에서는 변수에 대한 이해까지만 짚어보기로 하겠습니다.
2) 상수 (constant)
원의 면적을 구하기 위해서는 원주율이 필요합니다.
원주율은 그리스문자인 π(파이)로 표기하며 3.1415926535... (필자의 기억으로는 여기까지..) 입니다.
이 값은 정해진 값입니다.
원주율 = 약 3.14
라는 것은 불변의 약속(법칙?)입니다.
이 것이 어떤 경우는 3.19 또 어떤 경우에는 2.14 라면 상수가 될 수 없습니다.
즉, 상수는 정확하게 미리 정해져 있는 수 여야 합니다.
이와같이 php 에서는 미리 정해져 있는 상수들이 있는데 상수의 특징은 변수와는 달리 $ 가 붙지 않는다는 것입니다.
__LINE__ 이나 __FILE__ 과 같은 상수는 굳이 선언하지 않아도 미리 정의되어 있는 상수입니다.
상황에 따라서는 define() 함수를 이용해 상수를 정의할 수 있습니다.(만들어 낼 수 있습니다.)
__RB__ 라는 상수를 만들고 "최고의 CMS" 라고 정의하고자 한다면..
define('__RB__','최고의 CMS'); 를 선언해 줄 경우 어디에서는 __RB__ 는 '최고의 CMS' 로 통용됩니다.
그렇다면 변수를 이용해도 되는 것을 왜 굳이 상수를 사용할까요..
변수와 상수의 가장 큰 차이점은 한번 정의된 값이 변경될 수 있느냐 없느냐는 것입니다.
변수의 경우는..
$var = 'a';
$var = 'b';
라고 할때 $var 는 처음 선언된 a 가 변경되어 b 가 되지만 상수는 다음과 같이 변경을 하였을때..
define('constant','a');
define('constant','b');
constant 가 b 가 되지 않고 여전히 a 로 유지됩니다.
이 점이 가장 큰 차이점이며 이를 이용해야만 하는 경우가 프로그래밍을 하다보면 종종 생기게 됩니다.
3) 배열 (array)
배열은 일정한 형식으로 분리된 집합이라 정의할 수 있는데 이 표현이 사실 이해하기 쉽지 않습니다.
때문에 적절한 예제가 필요합니다.
필자는 다음과 같은 예를 들어볼까 합니다.
* 다음의 예는 필자 개인적인 의견이므로 적절치 않을 수 있습니다.
<?php
$아파트 = 20;
아파트 라는 변수입니다.
if ($아파트 == 20)
{
echo '아파트는 20층입니다.';
}
else {
echo '아파트는 20층이 아닙니다.';
}
?>
아파트라는 변수에 대한 조건식입니다.
아파트 변수에 20 이라는 정수형 데이터(층수를 의도한..)를 담았습니다.
그런데 위와같이 단순한 조건이 아닌 아파트의 층수별 세대주에 대한 처리를 해야할 일이 생겼습니다.
이 경우..
$아파트1층의세대주 = '홍길동';
$아파트2층의세대주 = '아무개';
...
...
$아파트 20층의세대주 = '세븐고';
와 같이 표현을 한다면...
아파트가 20층인걸 다행으로 생각해야 할 것입니다.
초고층 주상복합이라면 생각만 해도 끔직합니다.
이와 같은 경우에 배열이 필요합니다.
배열은 기본적으로 다음과 같은 형식으로 생성합니다.
$아파트 = array(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20);
그리고 $아파트[0] , $아파트[1] ... $아파트[n] 의 형식으로 표현합니다.
배열의 첫번째를 0 부터 시작합니다.
따라서 $아파트[3] 일 경우 값은 4 가 됩니다.
그런데 조금 이상합니다.
앞서 $아파트1층의세대주는 '홍길동' 으로 정의하고자 했는데 이 것을 배열로 처리하는 방법을 설명하지 않았습니다.
이제 층층의 세대주를 지정해 주겠습니다.
$아파트 = array(
'f1' => '홍길동',
'f2' => '아무개',
...
'f20' => '세븐고'
);
앞서 일일히 변수를 통해 세대주를 지정해 주었던 것과 비교하면 아주 간단합니다.
아파트 2층의 세대주는 누구일까요?
$아파트['f2'] 입니다.
매우 심플하면서 직관적입니다. 여기까지가 1차(원 연관)배열입니다.
배열을 이해하면 프로그래밍의 반은 이해한 것이다라고 필자는 주저없이 말하곤 합니다.
그만큼 배열은 중요합니다.
배열을 이해함에 있어서 항상 잊지 말아야 할 것은 "입체적인 접근" 입니다.
초급자들이 배열을 접근함에 있어서 실수하는 것이 있는데 바로 1차원에서 멈춘다는 것입니다.
대부분 위에 예로 올려드린 정도에서 배열을 다루거나 심지어 배열에 대한 명확한 이해없이 어림짐작으로 사용하는 경우도 흔히 보게 됩니다.
배열은 1차원에서 그치지 않고 N차원까지 접근할 수 있고 또한 배열의 인자에 또 다른 하위배열이나 객체를 담을 수 있습니다.
다시 $아파트 배열을 보겠습니다.
앞서 $아파트의 세대주들을 정의했었는데 거기에 세대주들의 나이를 지정해 보려고 합니다.
$아파트 = array(
'f1' => array('홍길동',34),
'f2' => array('아무개',45),
...
'f20' => ('세븐고',36)
);
$아파트 20층에 살고 있는 사람의 세대주와 나이는 몇살일까요?
세대주는 $아파트['f20'][0] 이고 나이는 $아파트['f20'][1] 입니다.
더 나아가 $아파트 20층에 살고 있는 세븐고의 초,중,고등학교 정보도 담으려고 합니다.
어떻게 하면 될까요?
$아파트['f20'][0][] = array('강동','외산','명석');
$아파트 20층에 살고있는 세븐고는 어느 초등학교를 나왔을까요?
$아파트['f20'][0][0] 초등학교를 나왔습니다.
지금까지 대략 120개 정도의 변수가 필요한 작업을 $아파트 라는 하나의 배열로 처리해 보았습니다.
20층이어서 120개지 50층짜리 주상복합이면 300개의 변수가 필요합니다.
더 나아가 초,중,고 뿐만 아니라 대학교,직업,연락처,이메일까지 더하면 700개의 변수가 동원되어야 합니다.
그런데 배열을 이용했더니 $아파트 라는 배열 하나로 모든 것을 처리할 수 있었습니다.
이 것이 바로 배열의 힘입니다.
아무리 커다른 프로그램이라 할지라도 배열하나면 모든 변수를 처리할 수 있습니다.
Rb 제작시 $RB 라는 배열로 모든 변수를 처리하려 했으나 최소 5차배열까지 사용해야 할 것으로 판단되어 사용자가 헷갈릴 것을 우려해 포기했던 과거가 있습니다.
4) 함수(function)
함수는 "관계식" 으로 표현할 수 있는데 앞서 보았던 수학식 y = f(x) 로 표현됩니다.
y = f(x)
y 는 f 라는 함수에 x 를 대입하였을때 돌려받는 어떤 값입니다.
php 로 표현하면..
$y = f($x);
입니다.
$y 는 $x 값이 전달된 f 함수에 따라 값이 변하게 됩니다.
즉, 함수는 변수의 확장이라고 보시면 됩니다.
$a = 1;
$b = 2;
$c = $a + $b; //3
변수를 이용한 일반적인 더하기 표현입니다.
이 것을 함수로 표현하면 다음과 같습니다.
function sum($a,$b)
{
return $a + $b;
}
$c = sum(1,2); //3
그런데 왜 함수를 사용해야 할까요..
더하기를 빈번하게 사용해야 한다고 가정할때 함수를 사용하지 않았다면 계속해서 변수들을 생성하고 그 변수들을 사용해서 연산을 해 주어야 할 것입니다.
하지만 `더하기` 라는 함수를 만들어 놓으면 위와같이 $결과값 = sum($a,$b) 를 이용해 모든 더하기에 대해서 처리가 가능하게 됩니다.
불필요한 변수셋팅이나 코드량도 줄어들게 되므로 효율면에서 상당한 효과를 보게 되는 것입니다.
예를들어 `구구단` 프로그램을 작성한다고 할때 함수를 사용하지 않았다면 3단,5단... N단을 처리할때 그때그때 코드를 새로 작성해 주어야 할 것입니다.
이 것을 함수로 표현하면 언제든지 별도의 추가프로그래밍 없이 N단에 대한 처리가 가능하게 됩니다.
function gugudan($n)
{
for ($i = 1; $i <= 9; $i++)
{
echo $n .'*'.$i.'='.($n*$i).'<br />';
}
}
gugudan(3); // 구구단 3단
gugudan(7); // 구구단 7단
여기에서 잠시 짚고 넘어갈 것이 있습니다.
앞서 보았던 sum() 함수와 gugudan() 함수를 보면 하나는 결과값을 넘겨주고 다른 하나는 그렇지 않음을 알 수 있습니다.
sum 함수는 결과값을 돌려주고 있지만 gugudan() 함수는 결과값을 돌려주지 않고 함수내에서 직접 출력을 시키고 있습니다.
이렇듯 함수는 return 을 통해 결과값을 돌려줄 수도 있고 그렇지 않을 수도 있습니다.
그리고 돌려주는 결과값이 정수일 수도 있고 실수일도 있으며 문자일 수도 있습니다.
나아가서 앞서 언급했던 자료형들을 모두 넘겨줄 수 있습니다.
다음은 코드값에 따라 해당국가의 영문과 한글을 돌려받는 간단한 함수입니다.
CountrySet() 함수에 코드값인 ko,cn,jp,en 등을 넘겨주면 해당코드의 영문,한글을 돌려받게 됩니다.
그런데 이때 돌려받는 데이터의 자료형이 정수도 아니고 실수도 아니고 문자도 아니고 배열입니다.
function CountrySet($code)
{
$lang = array(
'ko' => array('korean','한국'),
'cn' => array('china','중국'),
'jp' => array('japan','일본'),
'en' => array('usa','미국')
);
return $lang[$code];
}
$country = CountrySet('ko');
$country 는 array('korean','한국') 이라는 배열값을 리턴받게 됩니다.
따라서 $country[0] 는 `korean` , $country[1] 은 `한국` 이 됩니다.
중요한 점은 함수내에서 결과값을 돌려줄때 단순히 숫자나 문자뿐만이 아닌 배열이나 객체도 포함된다는 것이며 함수에 넘겨주는 인수의 경우도 단순히 숫자나 문자가 아닌 배열이나 객체를 넘겨줄 수 있다는 것입니다.
5) 객체 (object)
다음에 계속...
- 노트(52)
- 목차
- 분류별
- 펼쳐보기
- 포토(2)
- 동영상(0)



신고
인쇄
스크랩


추천




