Language/PHP

공부 내용 정리 PHP :: 초급 II

Cs.Woo 2021. 5. 31. 23:29

# 객체지향 프로그래밍

 서로 연관되어있는 함수(메소드)와 변수들을 하나로 묶어서 객체라는 것에다가 그룹핑하여 이름을 짓고, 불러서 사용하도록 구성하여 프로그래밍을 하는 것이다.

 php는 본래 객체지향을 위한 언어가 아니였다. 그러나 근래 객체지향이라는 것이 프로그래밍에 있어서 가장 중요한 패러다임으로 자리매김하면서 php에도 객체지향적으로 변화하였다. 

 따라서 php로 만들어진 프로그램 혹은 웹들을 살펴보면 객체지향적으로 프로그래밍된 것과 그렇지 않은 것이 공존하고 있는 상태이다. 본 장에서는 php를 객체지향적으로 프로그래밍 하는 법에 대한 내용을 기초적으로 학습한 내용을   정리하였다.

 

# 함수와 객체

 객체지향도 함수와 큰 차이는 없다. 함수가 생겨나고, 같은 기능을 가진 함수와 변수를 같은 곳에 묶어서 사용하기 좋게 정리해놓은 것이 결국엔 객체이기 때문이다. 하기 예제는 함수와 객체에 대한 코드이다.

<?php

# 함수를 사용한 프로그래밍

# is_file 이라는 내장함수를 사용함.
var_dump(is_file('data.txt')); 
# is_dir 이라는 내장함수를 사용함.
var_dump(is_dir('data.txt')); 
# file_get_contents 이라는 내장함수를 사용함.
var_dump(file_get_contents('data.txt')); 
# file_put_contetns 와 rand 라는 내장함수를 사용함.
file_put_contents('data.txt', rand(1,100));


# 상기와 결과가 완전히 같은 객체를 이용한 프로그래밍

# 객체의 생성은 앞에 new가 붙는다.
# 나머지는 함수와 같은형식이고, 인풋은 ()안에 넣어준다.
# 객체를 생성하여 변수에 넣어준 것이다.
$file = new SplFileObject('data.txt');

# 1 SplFileObject안에있는 is_file을 사용하는 법
# file은 이제 객체이기 때문에 하기와 같이 사용한다.
# 객체 안에 메소드를 사용하는 방법은 객체 -> 메소드 식이다.
var_dump($file -> isfile());

# is_dir() 을 사용하는 법
var_dump($file ->isdir());

# file_get_content 와 같은 기능을 가진 Spl의 메소드
# fread()메소드는 인자로 파일의 사이즈를 입력해주어야 한다.
# 따라서 파일의 사이즈를 구하는 메소드를 사용
var_dump($file->fread($file->getSize()));

# file_put_contents와 같은 기능을 가진 spl의 메소드
# 내용은 상기와 같다.
# 입력값을 주기 위하여 rand()라는 함수를 사용하였다.
$file->fwrite(rand(1,100));

 

 상기 코드를 살펴보면,  함수를 이용하여 data.txt를 제어한 구문에서는 모든 함수에게 인자로서 data.txt를 부여한 것을 확인할 수 있다. 이는, 객체를 사용하지 않고 함수를 사용하였을 때에는 각각의 함수가 서로 독립성을 가진 함수이기 때문에 실행하려면 독립적인 값을 주어야 하는 이유이기 때문인 것이다.

 반면에 객체를 사용한 data.txt의 제어에서는 객체를 생성할 때 한번 인자를 주고 클래스 안에 존재하는 함수(메소드)에게는 각각 인자를 따로 부여하지 않았다. 이는 하나의 객체 안에 존재하는 메소드들이 같은 인자값을 공유하고 있기 때문인 것이다. 기능에 따라 분류하였기 때문에 인자를 같이 공유할 수 있는것이고, 이는 중복을 피할 수 있고, 보다 직관적이며 효율적이게 되는 것이다.

 함수로 한다면 각각의 인자값을 바꾸어야 하지만, 객체를 이용하면 하기와 같이 코드가 완성이 되는 것이다.

 

$file = new SplFileObject('data.txt');
var_dump($file -> isfile());
var_dump($file ->isdir());
var_dump($file->fread($file->getSize()));
$file->fwrite(rand(1,100));

$file2 = new SplFileObject('data2.txt');
var_dump($file2 -> isfile());
var_dump($file2 ->isdir());
var_dump($file2->fread($file->getSize()));
$file2->fwrite(rand(1,100));

$file3 = new SplFileObject('data3.txt');
var_dump($file3 -> isfile());
var_dump($file3 ->isdir());
var_dump($file3->fread($file->getSize()));
$file3->fwrite(rand(1,100));

...

 

 객체에서의 용어는 하기와 같다.

 

$file = new SplFileObject('data.txt');
 # SqlFileObject : 클래스(Class)

 # 클래스에 앞에 new를 붙여 사용한다면 이 클래스는 객체(object)를 리턴해준다.
 # 이때 생성되어 할당되는 객체를 인스턴스(instance)라고 한다.
 
 # 인스턴스를 생성할 때 부여하는 data.txt는 상태(status)라고 일컫는다.
 # 인스턴스들은 부여될 때 서로 다른 상태(status)를 갖고 있기 때문에,
 # 똑같은 인스턴스에 부여해도 다른 값을 나타낼 수 있다는 것이다.
 
 # file변수 안에는 SqlFileObject 클래스로 생성된 인스턴스가 담겨있다.
var_dump($file -> isfile());
 # isfile과 같은 것은 메소드(method)이다.
 # 객체에 담겨있는 함수와 같은 것은 메소드(method) 라고 일컫는다.
var_dump($file ->isdir());
var_dump($file->fread($file->getSize()));
$file->fwrite(rand(1,100));

 

# 배열(Array)을 객체방식으로 제어하기

  객체방식으로서 배열을 제어하기 위한 학습을 진행하였고 그 예제와 코드는 하기와 같다.

<?php
# 함수를 이용한 방식

## 배열(Array)생성
## 배열 생성법엔 여러 방법이 존재
$aData = array('a', 'b', 'c');
$aData  = [ 'a', 'b', 'c' ];

## 배열에 있는 값을 전부 꺼내서 출력함 (foreach)
foreach ( $aData as $item ) {
 echo $item . "<br>";
}

# 1. 함수로서 배열을 제어 
## 배열에 값 추가
array_push($aData, 'd');

## 배열 갯수 조회
var_dump(count($aData));

# 객체를 이용한 방식

## 배열을 다룰 수 있는 객체를 생성하여 변수에 할당
## array('a', 'b', 'c')배열에 대한 객체를 생성하여 oData에 할당
$oData = new ArrayObject(array('a', 'b', 'c'));

## 함수형과 같은 방식으로 제어 가능
foreach( $oData as %item ) {
	echo $item . "<br>";
}

## 1. 객체로서 배열을 제어
## 배열에 값 추가
$oData -> append('d');

## 배열 갯수 조회
var_dump($oData -> count());


 상기의 예제도 마찬가지로, 함수로서 배열을 제어한다면, 각각의 함수에게 제어하고자 하는 배열을 호출 할 때 마다 인자로서 php엔진에게 알려주어야 하는데, 객체로서 배열을 제어한다면, 처음 객체를 생성할 때 알려주었던 배열을 객체 내에 존재하고 있는 함수(메소드)들이 공유하고 그것을 공통적으로 제어하기 때문에, 메소드를 호출할 때 마다 배열을 인자로서 전달해줄 필요성이 사라진다.

 또한 함수를 이용하여 협업을 한다면, 중간에 다루고자 하는 배열이 수정되거나 변질되어도 눈치채기가 어렵고, 오류가 발생할 확률이 높아지는데, 객체로서 배열을 제어한다면, 그러한 가능성이 현격히 적어지게 된다. 즉 협업 그리고 업무 그리고 생산의 효율성이 극적으로 상승한다고 볼 수 있는 것이다.