본문 바로가기
PHP/생활코딩

5/29(6) 생활코딩

by SKim입니다 2020. 5. 30.

* 오늘의 진도

 PHP

  함수와 객체의 비교

 

 

26. 함수와 객체의 비교

먼저 다른 사람이 만든 객체의 사용자가 된 후에

스스로 객체를 만들어보자.

 

(1) 함수를 통해서 파일을 다루는 방법

 

oop/compare.php

 

어떤 파일이 파일인가/디렉토리인가/존재하지 않는가를 체크

 

 

 

 

 

 

 

 

 

1~100 랜덤 숫자

 

 

함수를 통해서 로직을 잘 정리정돈한다는 측면에 주목한 프로그래밍 패러다임이

Procedure Programming이다.

 

 

(2) 객체를 통해서 파일을 다루는 방법

 

객체라고 해서 함수를 안 쓰는 것이 아니다.

다만 함수 바깥쪽에 껍데기가 하나 더 생기는 것이다.

 

PHP는 처음에는 함수 중심의 PP로 만들어졌다가

나중에 OPP를 수용하게 됐다.

→ OPP 이전과 이후 스타일이 공존

 

장점: OPP라는 산을 처음부터 넘을 필요가 없이,

 함수까지만 익혀도 충분히 많은 것을 할 수 있다.

 

 (객체를 쓰지 않는다고 해서 잘못된 프로그래밍이거나, 

 거대한 것을 못 만드는 것은 절대 아니다.

 다만 객체의 도움을 받아면 그것을 좀더 쉽게 할 수 있다.)

 

단점: 잡탕같이 정리정돈 안 된 느낌이 들 수 있다.

 cf) JAVA는 처음부터 객체 지향의 화신의 포지션으로 시작한 언어이기 때문에

   OPP의 관점에서 아주 깔끔한 언어이다.

   그러나 객체지향이라는 큰 산을 넘어야 하기 떄문에

   처음 프로그래밍하는 사람에게는 상당히 고통스러운 언어이다.

 

 

is_file, is_dir와 같은 함수는 사용자가 만든 것이 아니라

PHP가 내장하고 있었던 함수이다. = api

 

이 api는 php가 객체 지향을 채택하지 않았을 때 만들어진 api이기 때문에

함수의 형태를 가지고 있다.

 

하지만 php가 객체 지향을 채택한 이후에

php를 이용해서 파일을 제어할 때,

객체 지향적인 방식으로 파일을 제어할 필요성이 있을 것이다.

그래서 생겨난 새로운 api가 SplFileObject라는 것이다.

 

https://www.php.net/manual/en/book.spl.php

 

PHP: SPL - Manual

There are no user contributed notes for this page.

www.php.net

Spl은 Standard PHP Library의 약자이다.

즉, 객체 지향 방식으로 우리가 PHP를 제어하기 위해서 사용하는

PHP의 새로운 라이브러리이다.

 

 

File Handling

 - SplFileObject

이것을 사용하면 우리가 객체지향 방식으로 파일을 제어할 수 있다.

 

https://www.php.net/manual/en/class.splfileobject.php

 

PHP: SplFileObject - Manual

Note that this class has a private (and thus, not documented) property that holds the file pointer. Combine this with the fact that there is no method to close the file handle, and you get into situations where you are not able to delete the file with unli

www.php.net

 

 

우리가 제어하고자 하는 파일은 data.txt 파일이다.

함수처럼 보이지만, 객체를 만드는 코드이다.

그 객체의 이름은 SplFileObject이다.

 

함수와 구별하기 위해서 앞에 new를 붙인다.

그러면 선택된 영역은 객체가 된다.

객체를 리턴하는 것이다.

 

그리고 그 리턴된 객체를 파일이라는 변수에 담았다.

 

new와 SplFileObject는 문법이기 때문에 꼭 저렇게 써야 하지만,

$file 변수의 이름은 마음대로 지정해도 된다.

 

isFile을 사용해보겠다.

 

회색으로 선택된 두 코드는 정확하게 똑같은 일을 한다.

fread는 우리가 읽으려는 파일에서 어느 정도의 정보를 읽고싶은지를 적어줘야 한다.

 

 

위의 코드와 밑의 코드는 똑같은 역할을 한다.

다만 위의 코드는 함수를 이용해서 파일을 제어하고,

밑의 코드는 객체에 담겨있는 함수를 이용해서 파일을 다루고 있다.

 

 

 

(3) (1)과 (2)의 차이

 

차이①

(1)의 코드의 단점은 파일의 이름이 각각의 함수의 인자로 들어간다는 것이다.

이 함수 하나하나는 각자 독립적이기 때문이다.

→ 입력값의 중복이 발생한다.

 

(2)는 10행에 입력된 값(data.txt)이 무엇이냐에 따라서

그것에 대해서 여러가지 함수들이 실행되고 있고,

이 함수들은 서로 같은 객체에 소속되어 있다.

 

객체라는 것에 $file이라는 변수에 담겨있는 객체에 소속되어 있기 때문에

각각의 함수들은 이 파일 이름을 내부적으로 공유하고 있어서

인자로 파일의 이름을 줄 필요가 없다.

 

 

차이②

(1)의 함수들이 서로 연관되어 있다는 사실을 알기가 쉽지 않다.

필요한 함수를 찾으려면 그 많은 것을 다 뒤져야 한다.

 

그리고 우리가 is_dir이라는 함수를 직접 만들고 싶다면

이름이 충돌이 나서 할 수 없다.

즉, 서로 연관된 함수들이 그룹핑되어있지 않다.

 

(2)와 같이 객체를 사용하면 디렉토리를 만들어서 연관된 파일을 저장하는 것과 같이 정리정돈된다.

 

 

차이 ③ data2.txt파일에 대해서도 적용하고 싶다면,

복사해서 쉽게 할 수 있다.

 

 

* 문법/요소에 대한 정리 *

 

SplFileObject는 Class이다.

Class 앞에 new를 준 다음에 실행하면

Class는 이 Class를 기반으로 해서 만들어진 객체를 리턴한다.

 

그래서 SplFileObject라는 클래스는

data.txt를 가지고 있는/대상으로 하는

SplFileObject라는 객체를 리턴해서 $file에 담았다.

 

클래스는 설계도와 같다.

우리는 설계도에 데이터(data.txt)를 넣는 것을 통해서

Instance라고 하는 것을 얻어낼 수 있고,

 

Instance에 메소드를 호출하게 되면,

우리가 만든 그 Instance의 내부적으로 저장되어 있는 데이터들을 대상으로 해서

이 함수들이 실행된다.

 

그러므로 Instance는 설계도를 바탕으로 해서 만들어진 구체적인 제품이라고 볼 수 있다.

 

회색으로 선택한 isFile은 함수이긴 한데,

객체에 담겨 있는 상태에서는 메소드라고 부른다.

 

data.txt 자리에 어떤 값이 들어가냐에 따라서

함수들은 다른 파일들을 대상으로 동작하고 있다.

그리고 이것을 통해서 만들어진 각각의 Instance들은 서로 다른 값을 가지고 있다.

 

이 data.txt 자리에 들어가는 값을 부르는 여러가지 표현이 있는데

일단 이 상태에서는 state(상태)라고 부른다.

 

즉, Instance들은 서로 다른 상태를 가지고 있기 떄문에

메소드를 호출했을 대 메소드가 다르게 동작한다.

 

 

 

 

26. 함수와 객체의 비교 - 객체를 이용해서 배열을 다루기

객체를 만드는 입장이 되기 전에

객체를 사용하는 입장이 먼저 되자

→ 배열을 객체 방식으로 제어하는 방법

 

배열 만들기 - 둘은 똑같은 방식이다.

 

 

배열에 담겨 있는 값을 하나하나 꺼내서 화면에 출력하려면

foreach를 쓰는 것이 편리하다.

 

as $item이라고 하면,

foreach가 동작할 때, $adata에 담겨있는 값을 하나하나 꺼내서

$item이라고 하는 변수로서 { } 에서 사용할 수 있도록 하는 것이다.

 

https://www.php.net/manual/en/book.spl.php

 

PHP: SPL - Manual

There are no user contributed notes for this page.

www.php.net

 

Miscellaneous Classes and Interfaces

- ArrayObject

배열을 객체 방식으로 제어할 수 있는 기능

 

이것을 이용해서 똑같이 동작하는 코드를 만들었다.

 

 

array_push와 append도 똑같은 기능을 한다.

(배열에 값 추가)

 

 

count도 똑같다.

'PHP > 생활코딩' 카테고리의 다른 글

5/30 생활코딩  (0) 2020.05.30
5/29(7) 생활코딩  (0) 2020.05.30
5/29(5) 생활코딩  (0) 2020.05.29
5/29(4) 생활코딩 * 텍스트큐브 강의 건너뛰었음 *  (0) 2020.05.29
5/29(3) 생활코딩  (0) 2020.05.29

댓글