I. 파라미터 체크 및 변환
    1. trim()
        - 문자 앞뒤 공백제거 
$searchTerm = trim($searchTerm);
if (!$searchTerm) {
    echo "검색기간을 입력하세요.";
    exit;

    2. get_magic_quotes_gpc()
        - 서버에서 자동으로 문자열을 escape 해 주도록 세팅되어 있는지 확인하는 함수

    3. addslashes(), doubleval()
        - 데이터베이스 쿼리 조건절의 파라미터로 사용된다면 addslashed() 함수를 이요하여 escape 해줘야 한다.
        - 데이터베이스 숫자 필드의 경우에는 이상한 문자를 제거하기 위해서 doubleval()을 이요한다.
if (!get_magic_quotes_gpc()) {
    $searchTerm = addslashes($searchTerm);
    $prive = doubleval($prive);

    4. stripslashes()
        - 서버가 자동으로 escape 하도록 세팅되어 있으면 데이터베이스에서 추출한 데이터는 stripslashes()를
          호출하여 / 문자를 제거해야 한다.

    5. htmlspecialchars()
        - HTML에서 특별한 기능을 하는 문자를 인코딩한다. ( & < > " )

II. 데이터 베이스 접속 및 쿼리
    1. mysqli()
        - 서버 접속을 위해서 mysqli(서버명, 사용자id, 패스워드, 데이터베이스명) 을 사용한다.

    2. mysql_connect_errno()
        - 서버에 접속해서 유효한 데이터베이스 접속을 얻었는지 확인 한다.
        - 오류가 나며 오류 번호를, 성공했을 경우에는 0 을 리턴한다.
        - 데이터베이스에 접속하려 했을 때 코드 앞에 오류 억제 연산자 @ 를 사용한다.
          이렇게 하면 오류가 났을 때 자신의 코드로 처리할 수 있다.
        - Apache의 maxClients(1.x 버전), ThreadsPerChild(2.x버전) 는 httpd.conf 에서,
          MySQL의 max_connections 는 my.conf 에서 수정한다.

$con = @new mysqli($GLOBALS['gServerName'], $GLOBALS['gUserId'],
                   $GLOBALS['gPassword'], $GLOBALS['gDatabase']);

if ($con->connect_errno) {

    printf("%d : %s <br/>", $con->connect_errno, $con->connect_error);
    exit(); 

}


    3. $con->select_db()
        - 기본 데이터 베이스 변경
$con->select_db($GLOBALS[gDatabase]);

    4. $con->query()
        - 데이터베이스 쿼리를 수행하여 결과 값을 $result 에 저장한다.
        - 아래와 같은 코드는 보안에 문제가 있으니 문법을 이해하는 정도로만 사용

$userId = "skanddh";
$sql =
"select * from User where userId = " . $userId;

$result = $con->query($sql);


    5. $result->num_rows
        - 데이터베이스에서 조회된 결과 row 수를 알 수 있다.

$rowCount = $result->num_rows;


    6. $result->fetch_assoc()
        - 각 row 마다 호출하여 한 row의 값을 배열로 받는다.
        - 결과 값을 출력한다.

for($i=0; $i<$rowCount; $i++) {

    $row = $result->fetch_assoc();

    print("userId = " . htmlspecialchars(stripslashes($row['userId'])) .
          "<br/>");

    print("userName = " . htmlspecialchars(stripslashes($row['userName'])) .
          "<br/>");

    print("age = " . htmlspecialchars(stripslashes($row['age'])) . "<br/>");
}


    7. $result->fetch_object()
        - $result->fetch_assoc() 호출 시의 배열과는 다르게 결과가 object 로 넘어온다.

for($i=0; $i<$rowCount; $i++) {

    $row = $result->fetch_object();

    print("userId = " . htmlspecialchars(stripslashes($row->userId)) .
          "<br/>");

    print("userName = " . htmlspecialchars(stripslashes($row->userName)) .
          "<br/>");

    print("age = " . htmlspecialchars(stripslashes($row->age)) . "<br/>");

}


    8. $result->free(), $db->close();
        - 결과 값 release  및 데이터베이스 접속 끊기

$result->free();

$con->close();


    9. $con->affected_row
        - query 가 insert, delete, update 문일 경우 affected_row 로 영향받은 row의 갯수를 알 수 있다.
        - query() 메소드 보다는 statement 의 execute() 메소드를 사용하는 것이 좋다.

$userId = 'me';

$userName = 'john';

$age = 30;

$sql = " insert into User (userId, userName, age) " .

       "     values ('" . $userId . "', '". $userName . "', ". $age . ") ";

$con->query($sql);

printf("%d user inserted into database.<br/>", $con->affected_rows);

$con->commit(); 


    10. $stmt = $con->prepare($sql),   $stmt->bind_param(),     $stmt->execute()
         - Prepared Statement 를 사용하여 보안성을 높힌다.
         - bind_param() 호출 시 첫번째 전달인자의 의미,    s : string,   i : integer,   d : double

$sql = " insert into User (userId, userName, age) " .

       "           values (?, ?, ?) ";

$stmt = $con->prepare($sql);

$stmt->bind_param("ssi", $userId, $userName, $age);

$stmt->execute();

printf("%d user inserted into database.<br/>", $con->affected_rows);

$stmt->close();


    11. $stmt = $con->prepare($sql),   $stmt->bind_param(),     $stmt->execute(),   $stmt->bind_result(),  $stmt->fetch()
         - bind_result() 를 이용하여 조회되어 넘어오는 값을 변수에 할당할 수 있다. 

$sql = " select userId, userName, age from User ";

if ( $stmt = $con->prepare($sql) ) {

    $stmt->execute();

    if ($stmt->errno) {
        printf(
"execute() >> %d : %s <br/>",$stmt->errno, $stmt->error);
    } 

    $stmt->bind_result($rUserId, $rUserName, $rAge);

    $count = 0;

    while ($stmt->fetch()) {

        $count++;

        print("userId = " . htmlspecialchars(stripslashes($rUserId)) .
              "<br/>");

        print("userName = " . htmlspecialchars(stripslashes($rUserName)) .
              "<br/>");

        print("age = " . htmlspecialchars(stripslashes($rAge)) . "<br/>");

    }
    printf("%d row seleted. <br/>", $count);

    $stmt->close();

}



 



 
반응형
Posted by seungkyua@gmail.com
,
I. require 와 include
    1. 다른 파일을 불러온다. HTML 태그, php 함수, php 클래스 등이다.
    2. require() 는 실패했을 경우 치명적인 오류를 내지만 include() 는 가벼운 경고만 낸다.
    3. require_once()와 include_once() 는 라이브러리 파일을 두 번 이상 포함시키는 일을 막아준다.
        그러나 require()나 include() 보다 속도가 느리다. 
    4. php 문은 파일 확장자가 .html 이거나 .php 등일 때에만 스크립트 언어로 처리되어 실행.
    5. require로 불러들일 파일의 확장자 이름에 .inc와 같은 특별한 규칙을 두어 작성하는 것도 좋은 방법
        단, 이런 문서를 웹 문서 트리 안에 저장할 때에는 사용자들이 직접 접근 하지 못하도록 주위 (패스워드 등) 
        php 환경설정에서 아래와 같이 디렉토리를 웹 문서 디렉토리로 설정하고 추가로 config 설정파일은
        php 웹 문서가 아닌 디렉토리로 지정할 수 있다.(/Library/WebServer/php/includes)
        예) include_path = ".:/Library/WebServer/php/includes:/Library/WebServer/Documents"

II. 참조 전달 방법
    1. & 를 이용하면 참조로 전달 할 수 있다.
function increment(&$value, $amount = 1) {
    $value = $value + $amount;

III. 클래스 만들기
    1. 생성자와 소멸자
        - 생성자는 __construct() 라는 특별한 이름으로 파라미터를 가지며 생성할 수 있다.
        - 소멸자는 __destruct() 라는 이름으로 만들며 파라미터를 가지지 못한다.
 
    2. 클래스 속성
        - 접근자가 생략되면 모두 public 이다.
        - 클래스 속성의 접근자는 private 으로 하고 __set(), __get() 으로 속성에 접근한다.
        - 자기 자신의 인스턴스는 $this 로 접근한다.

class Point {

    private $x;

    private $y;

    public function __construct($x, $y) {

        $this->x = $x;

        $this->y = $y;

    }

    public function __get($name) {

        return $this->$name;

    }

    public function __set($name, $value) {

        $this->$name = $value;

    }

    public function display() {

        print("\$this->x = " . $this->x . "<br/>");

        print("\$this->y = " . $this->y . "<br/>");

    } 

}

$point = new Point(3, 5);

print($point->x);         // 3

print($point->y);         // 5

$point->x = 7;

print($point->x);         // 7

$point->display(); 


    3. 클래스 상속
        - 부모의 클래스는  parent 키워드를 이용한다.

class Rectangle extends Point {

    private $width;

    private $height;


    public function __construct($x, $y, $width, $height) {

        parent::__construct($x, $y);

        $this->x = $x;

        $this->y = $y;

    }

}

$rectangle = new Rectangle(10, 20, 100, 200);

print($rectangle->x);   // 10

 
    4. 인터페이스
        - 인터페이스는 interface 키워드를 사용한다.
        - 구현은 implements 로 한다.

interface Displayable {

    public function display();

}

class WebPage implements Displayable {

    public function display() {

        print("Hello World!! <br/>");

    }

}

$page = new WebPage();

$page->display();


    5. 클래스의 상수 및 정적 메소드 
        - 상수는 const 키워드를 사용하고 :: 연산자로 접근한다.
        - 정적 메소드는 static 키워드를 사용하고 :: 연산자로 접근한다.

class Math {

    const pi = 3.14159;

    public static function squared($input) {

        return $input * $input;

    }

}

print("Math::pi = " . Math::pi . "<br/>");

print("Math::squared(8) = " . Math::squared(8) . "<br/>");


    6. 클래스 타입 hinting
        - 클래스의 특정 타입을 파라미터 전달 시에 전달할 수 있다.
function check_hint(Point $object) {
    // ...

    7.  추상 클래스
        - abstract 키워드를 사용한다.

abstract class A {

    public abstract function operationX($param1, $param2);

}

class ConcreteA extends A {

    public function operationX($param1, $param2) {

        return $param1 + $param2;

    }

}

$a = new ConcreteA();

print($a->operationX(3, 4) . "<br/>");


    8. 메소드 오버로딩
        - __call() 메소드를 이용하여 오버로딩을 구현한다.
        - 첫번째 전달인자는 호출되는 메소드이고, 두번째 전달인자는 파라미터로 넘길 파라미터 배열이다.
public function __call($method, $param) {
    if ($method == "display") {
        if (is_object($p[0])) {
            $this->displayObject($p[0]);
        } else if (is_array($p[0])) {
            $this->displayArray($p[0]);
        } else {
            $this->displayScalar($p[0]);
        }
    }
}

$object = new Overload();
$object->display(array(1, 2, 3));
$object->display('cat'); 

    9. 클래스 자동 import
        - __autoload() 함수를 이용하여 자동으로 include 할 수 있다.
        - 이 함수는 클래스 메소드가 아니라 독립된 함수이다.
        - 아래는 클래스 파일과 같은 파일명을 읽어 들이는 예제이다.
function __autoload($name) {
    include_once $name . ".php";

    10. Reflection API
require_once("config.inc");

$class = new ReflectionClass("Point");
print("<pre>" . $class . "</pre>"); 


반응형
Posted by seungkyua@gmail.com
,
I. 배열관련 함수
    1. each()       : 포인터를 이동하기 전에 값을 리턴한 후에 포인터를 뒤로 이동한다.
    2. current()   : 현재 포인터의 값을 리턴한다. (pos()와 동일)
    3. reset()       : 포인터를 배열의 첫번째 요소로 이동시키고 값을 리턴한다.
    4. end()        : 포인터를 배열의 마지막 요소로 이동시기고 값을 리턴한다.
    5. next()       : 포인터를 뒤로 이동한 후에 그 값을 리턴한다.
    6. prev()       : 포인터를 앞으로 이동한 후에 그 값을 리턴한다. (end() 와 같이 사용)
    7. count()     : 배열 요소의 수를 리턴한다. (sizeof()와 동일)

II. 기타 유용한 함수
    1. explode("\t", $a_str)
        - 구분자를 탭으로 하여 문자열을 array 로 반환한다.
    2. intval()
        - 문자열 중에서 숫자 부분만 정수로 바꾸어 리턴한다.  ("12 age" 이면 12 만 리턴) 
    3. nl2br()
        - 문자열에 뉴라인(\r\n, \n\r, \n, \r) 이 있으면 <br /> 로 변경한다. 
    4. isset()
        - 변수가 세팅되었거나 값이 있는지 확인한다.
$name = $_POST['name'];
$password = $_POST[password'];

if ( (!isset($name)) || (!isset($password)) ) {
    echo '사용자 id와 패스워드를 입력하세요.';

    5. urlencode(), urldecode()
        - 문자열을 url 에 맞게 encode 및 decode 한다.

    6. die(), exit()
        - 스크립트 실행을 중단시킨다.
        - die() 는 오류메세지를 출력하거나 스크립트를 끝내기 전에 함수를 실행시킬 수 도 있고,
          절반쯤 끝난 페이지를 출력버퍼에서 제거할 수 도 있다.
function err_msg() {
    echo 'MySQL error was: ' . mysql_error();
}

mysql_query($query) or die(err_msg()); 






 
반응형
Posted by seungkyua@gmail.com
,
I. 데이터 타입
    1. four scalar types
        - boolean
        - integer
        - float ( double)
        - string

    2. two compound types
        - array
            $arr = array("foo" => "bar", 12 => true);
            echo $arr["foo"];   // bar
            echo $arr[12];       // 1
            unset($arr);

        - object

    3. two special types
        - resource
        - NULL 

II. 타입 알아내기 
    1. gettype($a_str)
        - "bool", "int", "double", "string", "array", "object", "resource", NULL, "unknown type" 중 하나를 반환한다
    2. is_int($an_int), is_long(), is_integer()
        - 변수가 정수형인지 검사
    3. is_double(), is_float(), is_real()
        - 변수가 부동소수점형인지 검사
    3. is_string($a_str)
    4. is_array($a_arr)
    5. is_bool()
    6. is_null()
    7. is_numeric()
    8. is_object()
    9. is_scalar()
    10. is_callable()
        - 변수에 저장된 값이 호출할 수 있는 함수의 이름인지 검사

III. 변수 초기화 여부 및 제거
    1. isset($a) : 변수값이 세팅되었으면 true
    2. unset($a) : 변수를 삭제
 
IV. 변수의 범위
    1. 전역 변수는 스크립트 내에서 정의된 변수로 스크립트 내에서 사용가능하지만 함수 안에서는 사용못함
    2. 함수 안에서 정의된 변수는 함수 안에서만 사용
    3. global 키워드로 슈퍼글로벌 변수로 정의 가능 (어디에서든 접근 가능)

V. 슈퍼글로벌 변수
    1. $GLOBALS
        - 모든 전역 변수의 배열 ($GLOBALS["myvalue"] 처럼 접근)
    2. $_SERVER
    3. $_GET
    4. $_POST
    5. $_COOKIE
    6. $_FILES
    7. $_ENV
    8. $_REQUEST
        - $_GET, $_POST, $_COOKIE 를 포함
    9. $_SESSION


 
반응형
Posted by seungkyua@gmail.com
,

Mac 에서 Apache 서버 Start

Mac 2011. 5. 11. 15:18
Mac에는 apache 서버가 자동으로 설치되어 있다.
아파치 서버의 실행은 root 로 접속한 다음과 같다.

#> apachectl -k [stop | restart | graceful | graceful-stop | start]

아파치 환경 설정파일
#> vi /etc/apache2/httpd.conf

php5를 실행하기 위해서는 아래의 코멘트를 풀어준다.
LoadModule php5_module        libexec/apache2/libphp5.so 

php5 기본 환경설정 세팅
#> cp /etc/php.ini.default /etc/php.ini
#> vi /etc/php.ini
      error_reporting = E_ALL | E_STRICT
      include_path = ".:/Library/WebServer/php/includes:/Library/WebServer/Documents"

기본적인 웹루트 파일은 다음과 같다.
DocumentRoot "/Library/WebServer/Documents" 

User home 디렉토리도 설정되어 있다.
Include /private/etc/apache2/extra/httpd-userdir.conf

php error log 위치
/var/log/apache2/error_log
 
반응형
Posted by seungkyua@gmail.com
,
I. RegExp 정규표현 객체 생성방법
    1. 리터럴 사용 (앞뒤에 / 를 사용하여 감싼다. ' 나 "는 넣지 않는다.)
        var pattern = /s$/; 

    2. RegExp 객체 생성
        var pattern = new RegExp("s$");

II. 정규 표현식에서 다음의 기호앞에는 \ 를 써야 한다. ( ' " @ # 은 제외한다.)
     문자와 숫자 앞에 나오는 \ 는 대부분 특별한 의미가 있으므로 주의한다.

     ^ & . * + ? = ! : | \ / ( ) [ ] { }

III. 정규 표현식
    1. 문자 클래스

         [...]     : 대괄호 안에 있는 문자
         [^...]   : 대괄호 안에 없는 문자
         .          : 줄바꿈이나 Unicode 줄마침을 제외한 아무 문자
         \w       : ASCII  문자  [a-zA-Z0-9_]와 동일
         \W      : ASCII 분자가 아닌 문자   [^a-zA-Z0-9_]와 동일
         \s        : Unicode 공백 문자
         \S       : Unicode 공백 문자가 아닌 문자
         \d       : ASCII 숫자     [0-9]와 동일
         \D      : ASCII숫자가 아닌 문자      [^0-9]와 동일
         [\b]    : 백스페이스

    2. 반복문자
         ?        : 앞의 항목이 0 또는 한번 나타난다.   {0,1} 과 동일하다.
         +       : 앞의 항목이 한 번 이상 나타난다.  {1, } 과 동일하다.
         *       : 앞의 항목이 0번 이상 나타난다.  {0, } 과 동일하다.

    3. 정규 표현식 참조
        - 정규 표현식 내에서 괄호로 묶인 부분 표현식은 순서대로 \와 숫자를 결합하여 참조한다.
        - 문자 클래스인 [...] 안에는 참조를 사용할 수 없다.

            /['"][^'"]*['"]/            : 작은따옴표나 큰따옴표 내에 한 개 이상의 문자가 있는 경우,
                                               그러나 시작과 끝의 따옴표는 다를 수 있다. (시작은 ' 끝은 " 일 수 있다)
            /(['"])[^'"]*\1/           : 시작과 끝의 따옴표가 같다. 여기서 \1 은 첫번째 () 참조를 나타낸다.

    4. 정규 표현식 앵커 문자
         ^          : 문자열의 시작 부분이나, 여러 라인을 찾는 경우에는 줄의 시작 부분에 매치된다.
         $          : 문자열의 끝 부분이나, 여러 줄을 찾는 경우에는 줄의 끝 부분에 매치된다.
         \b         : 단어 경계에 매치된다.  즉,  단어, 문자열의 시작이나 끝에 매치된다.  [\b] 백스페이스와 다르다.
                       Java 라는 단어만 매치시킬려면 Java 라는 단어가 문장 처음 혹은 끝에, 중간에 올 수 있다.
                       예) /\bJava\b/
         \B         : 단어 경계가 아닌 곳에 매치된다.
                        JavaScript 나 postscript에 매치되지만 script나 Scripting에 매치되지 않는다.
                        예) /\B[Ss]cript/
         (?=p)    : 이후에 나올 문자들이 패턴 p에 매치된다.
                        JavaScript: The Definitive Guide 는 매치되지만 Java in a Nutshell 은 : 이 없으므로 매치되지 않음
                        예) /[Jj]ava([Ss]cript)?(?=\:)/
         (?!p)     : 이후에 나올 문자들이 패턴 p에 매치되어서는 안된다.

    5. 정표 표현식 플래그(flag)
        - flag는 / 문자 바깥에 기술된다.
         i            : 패턴 매칭이 대소문자 구별없이 이루어져야 한다.
         g           : 패턴 매칭이 전역적이어야 한다. 즉, 탐색된 문자열에서 매치된 부분을 모두 얻어야 한다.
                        java 라는 단어(Java 혹은 JAVA 등)를 대소문자 구별없이 모두 찾는다.
                        예) /\bjava\b/gi
         m          : 여러 줄 상태, \b 는 문장의 처음과 끝, 중간 단어만 매칭하지만 ^는 줄의 시작이나 문자열의 시작에 매치,
                        $는 줄의 끝이나 문자열의 끝에 매치된다.
                        Java\nis fun (\n은 줄바뀜)
                        예) /Java$/im 

IV. RegExp 객체 사용법
    1. exec() 메소드
        - 문자열을 전달인자로 받아 정규 표현식을 실행한다. 매치되는 부분을 찾지 못하면 null을 리턴한다.
           매치되면 배열 객체가 리턴되며 배열의 0번 원소에는 정규표현식 매치된 문자열이 들어있다.
           배열객체의 index 프라퍼티는 매치가 일어난 문자의 위치가 저장되고 input프로퍼티는 검색대상이었던
           문자열을 참조한다.
        -  g플래그를 가진 정규 표현식이라면 RegExp객체의 lastIndex프라퍼티는 현재 매치된 부분 문자열의
           바로 다음위치이다. 매치되는 부분이 없으면 lastIndex 는 0 로 설정된다.
           그 다음은 lastIndex 부터 다시 매치되는지를 찾는다.
           
           var pattern = /Java/g;
           var text = "JavaScript is more fun than Java!";
           var result;
           while ((result = pattern.exec(text)) != null) {
               alert("Matched ' " + result[0] + "' at position " + result.index + "; next search begins at " + pattern.lastIndex);
           }



 
반응형
Posted by seungkyua@gmail.com
,
1. 함수나 객체명의 중복을 피하기 위해서 네임스페이스를 적용한다.

    var com;
    if (!com) com = {};
    else if (typeof com != "object") throw new Error("com already exists and is not an object");

    if (!com.ahnseungkyu) com.ahnseungkyu = {}
    else if (typeof com.ahnseungkyu != "object") throw new Error("com.ahnseungkyu already exists and is not an object");

2. closure를 사용하여 private 네임스페이스 정의
    var com;
    if (!com) com = {}
    if (!com.david) com.david = {};
    com.david.Class = {};

    (function() {
        var counter = 0;
        function getCounter() { return counter; }

        var ns = com.david.Class;
        ns.getCounter = getCounter;
    })();







 
반응형
Posted by seungkyua@gmail.com
,
1. 인스턴스 메소드를 호출하면 메소드 내의 this 키워드는 메소드가 속한 객체를 가르킨다.
2.  클래스 메소드는 생성자 함수를 통해 호출되기 때문에this 키워드는 특정한 인스턴스를 참조하지 않는다.
     대신 생성자 함수 자체를 참조한다. (일반적으로 클래스 메소드에서는 this를 사용하지 않는다)
3. 모든 함수에는 prototype 이라는 프로퍼티가 있는데, 이것은 함수가 정의될 때 부터 자동적으로 생성된다.
    prototype 프로퍼티의 초기값은 constructor 프로퍼티 하나만 가지는 객체가 지정된다.
    
    function Rectangle(w, h) {
        this.width = w;
        this.height = h;
        // new Rectangle(...) 객체가 생성될 때 마다 메소드도 생성된다. 메모리 낭비다.
        this.area = function() { return this.width * this.height; }  
    } 

    // new Rectangle(...)로 생성되는 모든 객체는 area() 메소드를 공유한다. (prototype의 특징)
    Rectangle.prototype.area = function() { return this.width * this.height; }

4. 클래스 프로퍼티와 메소드는 모두 생성자 함수에 저장한다. (함수도 객체이기 때문에 가능하다)

    // 생성자 함수를 정의한다.
    function Circle(radius) {
        this.r = radius;                  // 인스턴스 프로퍼티를 초기화한다.
    }

    // PI는 클래스 프로퍼티로 지정된다. 또한 생성자 함수의 프로퍼티가 된다.
    Circle.PI = 3.14;

    // prototype 메소드를 추가하여 모든 인스턴스가 해당 메소드를 공유하여 사용하게 한다.
    Circle.prototype.area = function() { return Circle.PI * this.r * this.r; }

    // max 는 클래스 메소드이다.
    Circle.max = function(a, b) {
        if ( a.r  > b.r ) return a;
        else return b;
    }

    // 사용법
    var c = new Circle(1.0);
    var a = c. area();
    var d = new Circle(1.2);
    var bigger = Circle.max(c, d);

5. private 프로퍼티 구현

    function ImmutableRectangle(w, h) {
        this.getWidth = function() { return w; }
        this.getHeight = function() { return h; }
    }

    ImmutableRectangle.prototype.area = function() {
        return this.getWidth() * this.getHeight();
    }

6. 클래스 상속(1)

    function Rectangle(w, h) {
        this.width = w;
        this.height = h;
    }
    Rectangle.prototype.area = function() { return this.width * this.height; }
    Rectangle.prototype.toString = function() {
        return "[" + this.width + "," + this.height + "]";
    }

    function PositionedRectangle(x, y, w, h) {
        Rectangle.call(this, w, h);
        this.x = x;
        this.y = y;
    }
    PositionedRectangle.prototype = new Rectangle();

    delete PositionedRectangle.prototype.width;
    delete PositionedRectangle.prototype.height;

    PositionedRectangle.prototype.constructor = PositionedRectangle;
    PositionedRectangle.prototype.contains = function(x, y) {
        return (x > this.x && x < this.y + this.width && y > this.y && y < this.y + this.height);
    }
    PositionedRectangle.prototype.toString = function() {
        return "(" + this.x + "," + this.y + ") " +
                   Rectangle.prototype.toString.apply(this);
    }


7. 클래스 상속(2)
    - 6번의 방법에서 생성자 부분만 바꿔주고 재정의 부분도 superclass를 사용한다.

    PositionedRectangle.prototype.superclass = Rectangle;
    function PositionedRectangle(x, y, w, h) {
        this.superclass(w, h);
        this.x = x;
        this.y = y;
    }
    PositionedRectangle.prototype.toString = function() {
        return "(" + this.x + "," + this.y + ") " +
                   this.superclass.prototype.toString.apply(this);
    }

8. 클래스 메소드 확장
    
    function borrowMethods(borrowFrom, addTo) {
        var from = borrowFrom.prototype;
        var to = addTo.prototype;

        for (m in from) {
            if (typeof from[m] != "function") continue;
            to[m] = from[m];
        }
    }

9. 객체 타입 판단
    - typeof undefined   :  "undefined"
    - typeof null             :  "object"
    - typeof f                  : "function"   f 가 함수라면
    - typeof o                 : "object"    o 가 객체이거나 null 이라면

    - x instanceof Array      : x가 Array 객체라면 true
    - x instanceof Function : x 가 함수라면 true
    - x instanceof Object     :  x가 객체(Array, RegExp, Date, Error 포함)이거나 함수라면 true

 
반응형
Posted by seungkyua@gmail.com
,
Javascript 함수

I. 메소드로서의 함수
    - 함수를 객체 프로퍼티에 할당하면 메소드로서 함수를 사용할 수 있다.
    - 함수를 메소드로서가 아니라 함수로 호출했다면 this 키워드는 전역 객체를 가리킨다.
    - 메소드로 호출된 함수는 호출한 객체를 this 라는 키워드로 받을 수 있다.
      그러나, 메소드로 호출된 메소드 안에서 중첩된 함수를 호출하면 중첩된 함수 내부에서 this 키워드는
      전역 객체를 가리킨다.

          var calculator = {
                operand1: 1,
                operand2: 1,
                compute: function() {
                    this.result = this.operand1 + this.operand2;    // this 는 calculator 객체를 나타낸다.
                }
          }; 
          calculator.compute();

II. apply()와 call() 메소드
    - call() 과 apply() 메소드를 사용하면 함수가 마치 다른 어떤 객체의 메소드 인 것 처럼 호출 할 수 있다.
    - call() 과 apply() 메소드의 첫번째 전달인자는 함수가 소속되어 호출될 객체를 나타내면 이 전달인자는
      함수 몸체 안에서 this 키워드의 값이 된다.

      아래의 코드는 함수 f()에 두 숫자를 전달하고 이 함수를 마치 객체 object 의 메소드인 것처럼 호출한다.
          f.call(object, 1, 2);

          object.m = f;
          object.m(1, 2);
          delete object.m;

    - apply() 메소드는 함수로 건네줄 전달인자를 배열로 지정한다.
        f.apply(object, [1, 2]);

III. 클로저(closure)
    - 중첩된 함수를 사용하고 반환할 수 있으며, 이렇게 중첩된 함수들은 closure라 불린다.
      아래 코드에서 o 는 객체, f 는 함수를 의미한다.
        function bindMethod( o, f ) {
            return function() { return f.apply(o, arguments); }     // 리턴되는 중첩된 anonymous 함수가 closure가 된다.
        }
        var person = { hello: function(arg) { alert(arg); } };
        var sum = bindMethod(person, hello);
        sum("Hello World");            // person 객체의 hello 메소드를 호출한다.


        function bindArguments( f, ) {
            var boundArgs = arguments;
            return function() {                            // 추가적인 전달인자와 합쳐서 호출된다. 이것을 currying 이라 부른다.
                var args = [];
                for (var i = 1; i < boundArgs.length; i++) args.push(boundArgs[i]);
                for (var i = 0; i < arguments.length; i++) args.push(arguments[i]);
                return f.apply(this, args);
            }
        }
 


 
반응형
Posted by seungkyua@gmail.com
,
I. 일반 객체의 프로퍼티 존재 확인하기
    1. in 연산자 사용
        - 프로퍼티 "x"가 존재하면 값에 상관없이 1을 저장
            if ( "x" in o ) o.x = 1; 

    2. undefined 로 비교
        - 프로퍼티 "x"가 존재하고 값이 undefined가 아니라면 1을 저장 
            if ( o.x !== undefined ) o.x = 1; 

    3. null 로 비교
        - 프로퍼티 "x" 가 존재하고 이 값이 null 이나 undefined가 아니라면 1을 저장
            if ( o.x ) o.x = 1;

II. constructor 생성자 프로퍼티
    1. 모든 객체는 생성자 함수인 constructor 프로퍼티를 가지고 있다.
         var d = new Date();        // Date 라는 constructor 프로퍼티로 Date 객체를 생성
         if ( d.constructor == Date )   // 결과 값은 true
         if (  (typeof d == "object") && (d.constructor == Date) ) // 결과 값은 true

    2. instanceof 연산자는 constructor 프로퍼티의 값을 사용한다.
         if (  (typeof d == "object") && (d instanceof Date) ) // 결과 값은 true

III. hasOwnProperty() 메소드
    1. 객체가 해당 프로퍼티를 가지고 있는지 검사한다.
        프로퍼티가 상속받은 것이 아니고 객체 안에 지역적으로 정의되어 존재한다면 true 아니면 false
         var o = {};
         o.hasOwnProperty("undef");        // false; 정의되지 않은 프로퍼티
         o.hasOwnProperty("toString");    // false; 상속받은 프로퍼티
         Math.hasOwnProperty("cos");     // true; Math 객체에 cos 프로퍼티가 존재

IV. 모든 객체의 조상인 Object 클래스에 존재하는 최상의 프로퍼티들
    1. constructor 프로퍼티
    2. toString() 메소드
    3. toLocaleString() 메소드
    4. valueOf()  메소드
    5. hasOwnProperty() 메소드
    6. propertyIsEnumerable() 메소드
    7. isPrototypeOf() 메소드

V. 배열 객체
    1. 배열의 길이
        - 배열의 길이는 length 프로퍼티로 알 수 있으며, 배열 안에서 가장 큰 인덱스 값보다 하나 더 큰 수 이다.
        - 배열의 원소들도 undefined 값을 가질 수 있는 특징을 생각하면 위의 문장이 이해가 갈 듯.
            var a = new Array();       // a.length == 0
            a = new Array(10);         // a.length == 10
            a = new Array(1, 2, 3);   // a.length == 3
            a = [4, 5];                        // a.length == 2
            a[5] = 1;                          // a.length == 6
            a[49] = 0;                        // a.length == 50
 
    2. 배열의 메소드
        - join() 메소드
            . 배열의 모든 원소를 문자열로 변환하고 이어 붙여서 반환한다.
                var a = [1, 2, 3];
                var s = a.join();      // s = "1,2,3"
                s = a.join(", ");       // s = "1, 2, 3"
 
        - reverse() 메소드
            . 배열 안의 원소 순서를 반대로 정렬하여 반환한다.
                var a = new Array(1,2,3);    // a[0]=1, a[1]=2, a[2]=3
                a.reverse();                           // a[0]=3, a[1]=2, a[2]=1

        - sort() 메소드
            . 배열 안의 원소들을 정렬하여 반환한다.
                var a = new Array("banana", "cherry", "apple");
                a.sort();           // a[0]="apple", a[1]="banana", a[2]="cherry"

            . 배열 안의 undefined 원소는 배열의 끝 부분으로 정렬된다.
            . 배열 안의 원소들이 문자열이 아니라면 비교를 위해 임시로 문자열로 변환 작업이 수반된다.
            . 비교 함수를 전달인자로 하여 정렬할 수 있다. 비교 함수는 전달인자를 두 개 받는데,
              첫번째 전달인자가 두번째보다 먼저 나타나야 한다면 비교 함수는 0보다 작은 숫자를 반환해야 한다.
                var a = [33, 4, 1111, 222];
                a.sort();                                                   // 알파벳순 : 1111, 222, 33, 4
                a.sort( function(a, b) { return a-b; } );    // 번호순 : 4, 33, 222, 1111

        - concat() 메소드
            . 배열의 모든 원소에 전달인자들을 모두 이어 붙인 새로운 배열을 리턴한다.
                var a = [1, 2, 3];
                a.concat(3, 4, 5);   // [1, 2, 3, 4, 5] 를 리턴한다.

        - slice() 메소드
            . 배열의 일부분을 리턴한다.
                var a = [1, 2, 3, 4, 5];
                a.slice(0, 3);         // 0 번째 부터 3번째는 제외하고 그 이전까지 리턴  [1, 2, 3]
                a.slice(3);             // 3 번째 부터 끝까지 리턴 [4, 5]
                a.slice(1, -1);        // -1 은 맨 마지막 원소를 가리킨다. [2, 3, 4]

        - splice() 메소드
            . 배열의 원소를 삭제하거나 삽입할 때 
               var a = [1, 2, 3, 4, 5, 6, 7, 8];
               a.splice(4);           // [5, 6, 7, 8]을 리턴한다. a = [1, 2, 3, 4]
               a.splice(1, 2);       // 1번째에서 2개수 만큼 잘라낸다.  [2, 3]을 리턴한다. a = [1, 4]

        - push() 메소드
            . 배열의 끝 부분에 이어 붙이고 새로운 길이를 리턴한다.
               var stack = [];
               stack.push(1, 2);      // stack: [1, 2]     길이 2를 리턴한다.

        - pop() 메소드
            . 배열의 마지막 원소를 제거하고 배열의 길이를 감소시킨 후 배열에서 제거한 원소를 리턴한다.
               stack.pop();              // stack: [1]          원소 2를 리턴한다.
               
        - unshift() 메소드
            . 배열의 맨 앞에 원소를 삽입한 후 배열의 새로운 길이를 리턴한다.
               var a = [];
               a.unshift(1);             // a: [1]         길이 1을 리턴한다.
               a.unshift(22);           // a: [22, 1]   길이 2를 리턴한다.

        - shift() 메소드
            . 배열의 첫 번째 원소를 제거한 후, 나머지 배열 원소들을 전부 앞으로 옮기고 제거한 원소를 리턴한다.
               a.shift();                   // a: [1]         원소 22를 반환한다.

       

 
반응형
Posted by seungkyua@gmail.com
,