객체에 기본을 학습하는 것도 내부함수나 함수구조에 관해서 익숙하게 학습을 이어온 경우라면 비교적 쉽게 이해할 수 도 있지만 그렇지 않은 경우는 굉장히 어렵게 보일 수 있습니다. 또 함수 사용에 관해 이해를 하였다 해도 php에 관해 처음 알아가는 단계라면 익숙치 않은 새로운 사용이나 구조에서 낯선것을 이해하는 과정이 또 어려울 수 있습니다.
그러나 객체의 구조에 대해서 정확히 이해를 하지 않고 그냥 넘어간다면 더 고급 기술을 익히기는 어려울 것입니다. 이보다 쉬운 단계에서의 학습도 마찬가진 입니다. 좀 어렵게 느껴진다고 패스하거나 포기하면 안될 것 입니다. 분명 어렵다면 뭔가 학습의 과정중에 빠지거나 그냥 넘겨버린 것들이 있을 수 있습니다. 그럴때는 이전 학습내용 중 빼먹거나 잊는 것이 없나 다시 학습해 보고 그런것이 아닌 새로운 것으로 인한 이해의 어려움이라면 반복해서 계속 읽고 이해하려 하다보면 이해가 되는 순간이 오게 될 것 입니다.
기본 함수 사용이 아닌 함수를 보다 효율적으로 사용하기 위해 객체화 시켜서 사용을 하는데 어떤 형식으로 만들고 사용하는지 이해를 정확히 해야 겠습니다.
클래스, 메서드(함수), 인스턴스, 생성자 등의 용어나 public 이 의미하는 것 등을 학습 과정에서 이해할 필요가 있습니다.
<?php
class Entree {
public $name;
public $ingredients = array();
public function hasIngredient($ingredient) {
return in_array($ingredient, $this->ingredients);
}
}
위와 같은 기본적인 객체화 된 코드가 있다고 한다면
class 는 객체 틀 이라고 보면 될 것 같습니다. class 옆에는 해당 클래스를 특정하는 이름을 붙이게 됩니다. 함수나 클래스 모두 이름을 붙여주고 사용하고 싶은 곳에서 호출을 마음대로 할 수 있게 해주기에 필요한 형식이죠.
public 은 외부에서 해당 속성 또는 메서드 등을 접근할 수 있도록 해주는 키워드 입니다. 이 부분이 작용하는 것은 나중에 학습을 따로 해도 될 것 같습니다.
function 은 함수를 정의 할때 사용하는 것으로 class 안에서는 메서드라고 부르죠.
위 코드를 대략적으로 설명을 드리면
저 하나의 틀을 가지고 객체의 메서드를 실행할때 다양하게 입력값을 주입하여 그 입력의 결과를 반환 받을 수 있는 간단한 코드 입니다.
Entree 라는 class 이름을 가졌기에 이 이름을 지칭하면서 사용을 해야 하겠죠?
실행이되는 메서드는
주입한 $this->ingredients 배열 안에 $ingredient 이 존재한다면 값을 반환하는 간단한 메서드 입니다.
해당 반환값을 if 등에 조건으로 이용한다면 값이 있다면 true 가 됩니다.
그럼 어떻게 사용을 하는지 살펴보겠습니다.
객체를 생성한다고 하기도 하고 인스턴스를 생성한다고 합니다.
저 틀을 다양하게 사용할 수 있는데 하나의 단위로 사용하는 것을 객체생성이나 인스턴스 생성이라고 이야기 합니다.
$soup = new Entree;
new Class명 이렇게 하게 되면 객체를 생성하게 되는 것 입니다.
이것을 $soup에 할당을 한 것이죠.
$soup->name = '닭고기 수프';
$soup->ingredients = array('닭고기', '물');
new Entree 의 새로운 인스턴스로 사용될 변수를 만들어줍니다.
이번 코드에서는 $this->ingredients 에 사용될 $soup->ingredients 가 의미가 있고 위 name은 의미가 없습니다.
$soup 로 할당한 채로 해당 class의 메서드를 실행하게 되면 위 변수가 함께 적용이 되는 것이죠.
메서드 사용을 위한 준비가 되었다면 이제 실제적으로 위 인스턴스가 사용될 코드를 살펴보면
foreach (['닭고기','레몬','빵','물'] as $ing) {
if ($soup->hasIngredient($ing)) {
print "수프의 재료: $ing.\n";
}
}
특정한 갑들(배열) 을 매서드에 대입하여 결과가 반환되어 출력이 되는 코드 입니다.
foreach 반복문에 의해 닭고기,레몬...... 들이 순서적으로 $ing 변수에 담겨서 한번씩 반복 실행이됩니다.
$soup->hasIngredient('닭고기')
가 실행이 되었다면 $soup 에 할당된 Entree 클래스의 hasIngredient 메서드가 실행이 되겠죠.
public function hasIngredient($ingredient) {
return in_array($ingredient, $this->ingredients);
}
이부분 입니다.
in_array($ingredient, $this->ingredients);
는
in_array('닭고기', array('닭고기', '물'));
이 되는 것입니다.
$this->ingredients 는 객체(인스턴스)를 새롭게 정의(생성) 할때 $soup->ingredients = array('닭고기', '물'); 로 할당을 했기 때문에 이렇게 사용이 되는 것 입니다.
['닭고기','레몬','빵','물'] 4번의 반복된 작업을 하게 되겠네요.
이렇게 검사를 해서 array 에 비교하고 싶은 값이 있다면
수프의 재료:닭고기 이렇게 출력이 되게 되는 것이죠.
코드를 정리해서 적어보면
<?php
class Entree {
public $name;
public $ingredients = array();
public function hasIngredient($ingredient) {
return in_array($ingredient, $this->ingredients);
}
}
$soup = new Entree;.
$soup->name = '닭고기 수프';
$soup->ingredients = array('닭고기', '물');
foreach (['닭고기','레몬','빵','물'] as $ing) {
if ($soup->hasIngredient($ing)) {
print "수프의 재료: $ing.\n";
}
}
이런식의 코드가 되며 결과는
수푸의 재료 : 닭고기.
수푸의 재료 : 물.
이렇게 됩니다.
그럼 객체화가 다양학 재사용이 가능하다고 했으니 여기에 새로운 객체(인스턴스)를 추가 생성해도 똑같이 사용이 가능해 집니다.
$soup = new Entree;.
$soup->name = '닭고기 수프';
$soup->ingredients = array('닭고기', '물');
위 객체(인스턴스) 생성(정의) 하는 부분만 추가해 주고 추가해준 객체로 메서드 실행만 해주면 되니까요.
$sandwich = new Entree;
$sandwich->name = '닭고기 샌드위치';
$sandwich->ingredients = array('닭고기', '빵');
이렇게 또 코드를 써주면 이번에는 새로운 객체(인스턴스)가 정의가 되는 것입니다. 구분을 하기 위해 $sandwich 라는 변수에 새롭게 담았다는게 눈여겨 볼 만한 정도이죠.
<?php
class Entree {
public $name;
public $ingredients = array();
public function hasIngredient($ingredient) {
return in_array($ingredient, $this->ingredients);
}
}
$soup = new Entree;.
$soup->name = '닭고기 수프';
$soup->ingredients = array('닭고기', '물');
$sandwich = new Entree;
$sandwich->name = '닭고기 샌드위치';
$sandwich->ingredients = array('닭고기', '빵');
foreach (['닭고기','레몬','빵','물'] as $ing) {
if ($soup->hasIngredient($ing)) {
print "수프의 재료: $ing.\n";
}
if ($sandwich->hasIngredient($ing)) {
print "샌드위치 재료: $ing.\n";
}
}
수프의 재료: 닭고기.
샌드위치의 재료: 닭고기.
샌드위치의 재료: 빵.
수프의 재료: 물.
이런 결과로 샌드위치 부분이 추가가 됩니다.
하나의 클래스의 메서드를 여러개의 객체(인스턴스)를 정의해서 재사용이 가능한 것이 이러한 객체화의 목표라고 볼 수 있을 것 같습니다.