2014년 3월 24일 월요일

Javascript, prototype, [[Prototype]]

자바스크립트에는 프로토타입이라는 특이한 요소가 있다.
이 프로토타입이 혼동스러운 가장 큰 이유는 우리말로는 프로토타입 하나지만,
실제 자바스크립트에는 prototype과 [[Prototype]] 두 개가 존재하기 때문이다.
주변에 접할 수 있는 책에서 '프로토타입 객체'라고 하면 prototype을 말하는 것일까 아니면 [[Prototype]]을 말하는 것일까?
솔직히 내가 읽은 여러권의 책으로는 그때그때 달랐다.. 이다. ㅠㅜ
그래서 한 번 명확하게 정리 해봤다.
함수 객체에만 존재하는 prototype 객체와 모든 객체에 존재하는 [[Prorotype]] 객체로 나누어 기술한다.

정리하다가 특이한 점을 하나 더 발견했는데, prototype 객체의 constructor는 실제 그 prototype 객체를 생성한 함수가 아니라는 점이다!!!!
---------------------
  • new를 통해 생성된 객체는 [[Prototype]] 객체를 가진다.
  • new를 통해 생성된 객체의 [[Prototype]] 객체는 생성자 함수의 prototype 객체다.
  • 모든 객체는 new를 통해 생성된다.(리터럴을 쓰더라도 내부적으로는 new를 통해 생성)
  • 따라서 모든 객체의 [[Prototype]] 객체는 생성자 함수의 prototype 객체다.

  • 모든 함수 객체의 constructor는 Function 객체다.
  • 모든 함수 객체만 prototype 객체를 가진다.
  • 함수 객체도 객체다.
  • 따라서 함수 객체는 prototype 객체와 [[Prototype]] 객체를 모두 가진다.
  • prototype 객체는 constructor와 [[Prototype]]라는 property만을 가지고 있는 객체로서, 함수 객체가 아니다.
  • 따라서 일반적인 함수 객체의 prototype 객체와 [[Prototype]] 객체는 당연히 다르다.
  • 다만 Function 객체만 예외적으로 prototype 객체와 [[Prototype]] 객체가 같다.

  • 일반적인 객체의 constructor는 그 객체를 생성하는데 사용된 생성자 함수 객체다.
  • prototype 객체는 실제로 Object 함수에 의해 생성되지만, prototype 객체의 constructor는 Object 함수가 아니라, 그 prototype 객체를 'prototype'이라는 이름의 property로 가지고 있는 함수 객체다.
  • 따라서 prototype 객체의 [[Prototype]]은 constructor의 prototype 객체가 아니라 실제 prototype 객체를 생성한 Object 함수의 prototype 객체다.

  • 이름 있는 함수의 prototype 객체는 그 함수의 이름으로 표시되지만, 그 함수 객체와는 다른 객체다.
  • 이름 없는 함수의 prototype 객체는 Object라는 이름으로 표시되지만, 일반적으로 말하는 Object 객체와는 다른 객체다.

아래의 값은 모두 참이다. 
  [[Prototype]]는 표기법이며, 브라우저에 따라 예약어가 다르다.
  크롬이나 파이어폭스에서는 [[Prototype]] 대신 __proto__라고 쓰면 된다.

  • var obj = {}, func = function func() {};

  • obj.[[Prototype]] === obj.constructor.prototype
  • func.prototype.[[Prototype]] !== func.prototype.constructor.prototype // <- prototype 객체의 constructor와 실제 prototype을 생성하는데 사용된 생성자 함수가 다르다!!
  • func.prototype !=== func.[[Prototype]]

  • Function.prototype.constructor === Function
  • Function.[[Prototype]].constructor === Function
  • Function.prototype === Function.[[Prototype]]
  • Function.constructor === Function
  • Function instanceof Object
  • Object instanceof Function
  • Object.prototype.constructor === Object

2014년 3월 14일 금요일

Cygwin 로컬 파일 권한 문제

Cygwin 로컬 파일 권한 문제

cygwin을 windows 7에 설치하여 원격 서버에 붙이는 터미널 용도로만 사용하면 괜찮은데, 직접 로컬에서 사용하면 아래와 같이 로컬 파일의 권한이 전혀 주어지지 않는 문제가 있다.
해결 방법은.. 의외로 쉽다.
풀어 쓰면, cygwin에서
vi /etc/fstab
해서 아래와 같이 noacl 만 추가해 주고 저장 후
cygwin을 재시작 하면 된다.

2014년 3월 8일 토요일

리눅스 Tomcat 한글 깨짐

리눅스에서 설치하는 TOMCAT은 기본 인코딩이 UTF-8이 아니라서 설정 해주지 않으면 한글이 깨져나온다.
아래의 내용은 TOMCAT 7.0.47 을 기준으로 작성하였다.

소스 레벨의 처리

HTML

  • HTML5의 경우
    <!DOCTYPE html>
    <html lang="ko">
    <head>
        <meta charset="utf-8"/>
    ...
    
  • 그 외
    ...
    <head>
        <META HTTP-EQUIV="contentType" CONTENT="text/html;charset=UTF-8">
    ...
    

Servlet

  • doPost() 나 doGet() 안에
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
        request.setCharacterEncoding("UTF-8");
    
        // 파라미터 받는 부분 utf-8 사용
        String keyword = request.getParameter("keyword");
        String urlEncodedKeyword = URLEncoder.encode(keyword,"utf-8");
    

JSP

  • 페이지 상단 지시자 지정 부분에
    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    

서버 설정 처리

server.xml

TOMCAT/conf 에 있는 server.xml 의 connector 지정 부분(70행 쯤에 있다)에 아래와 같이 URIEncoding를 추가하여 지정해준다.

setenv.sh

TOMCAT/bin 디렉토리에 setenv.sh 라는 파일을 새로 만들어 아래 내용 추가하여 기본 파일 인코딩을 utf-8로 지정해 주고 TOMCAT 재시작
    #!/bin/bash
    JAVA_OPTS="$JAVA_OPTS -Dfile.encoding=\"utf-8\""
이렇게 하면 되는 이유는 TOMCAT/bin/catalina.sh 를 열어보면 알 수 있다.
약 23행 정도에 아래와 같은 내용이 있다.
TOMCAT 실행 관련 환경변수는 직접 catalina.sh 에 추가하지 말고, TOMCAT/bin/setenv.sh 에 작성하라고 되어 있다. 실제 스크립트에 setenv.sh를 체크하는 부분이 작성되어 있다.