객체에 대한 이해

2014. 10. 15. 16:08 나홀로스터디/JS For Web Dev


6장 객체에 대한 이해

이 포스팅은 "프론트엔드 개발자를 위한 자바스크립트(2013 인사이트, 한선용 옮김)"에서 발췌 요약한 것입니다.
 
6.1.1 프로퍼티타입
6.1.2 다중 프로퍼티 정의
6.1.3 프로퍼티 속성 읽기


객체지향(Object-oriented) 언어는 일반적으로 클래스를 통해 같은 프로퍼티와 메서드를 가지는 객체를 여러개 만드는 특징이 있는데 ECMAscript는 객체를 "프로퍼티 순서 없는 컬렉션이며 각 프로퍼티는 원시 값이나 객체, 함수를 포함한다" 는 것이다.
이것은 객체가 특별한 순서없이 값의 배열이라는 의미로 ECMAscript객체를 이름-값 쌍의 그룹이며 각 값은 데이터나 함수가 되는 해시 테이블이라고 이해하면 된다.

객체를 만드는 가장 단순한 방법은 Object의 인스턴스를 만들고 여기에 프로퍼티와 메서드를 추가하는 방법이다.

var person = {   name : "nicholas",   age " 29",

  sayName : function(){     console.log(this.name);   } }


6.1.1 프로퍼티타입
프로퍼티의 특징은 내부적으로만 유효한 속성에 따라 자바스크립트 엔진 내부에서 구현하는 것으로 정의했으므로 이들 속성에 직접적으로 접근할수 있는 방법은 없다.
프로퍼티에는 데이터 프로퍼티와 접근자 프로퍼티 두가지 타입이 있고 이들 속성은 [[Enumerable]] 처럼 이름을 대괄호로 감싸서 나타낸다.


데이터 프로퍼티
데이터 프로퍼티는 데이터 값에 대한 단 하나의 위치를 포함하여 이 위치에서 값을  읽고 쓴다.

[[Configurable]] - 해당 프로퍼티가 delete를 통해 삭제하거나 프로퍼티 속성을 바꾸거나 접근자 프로퍼티로 변환할수 있음을 나타내고 기본 속성은 true이다.
[[Enumerable]] - for-in 루프에서 해당 프로퍼티로 반환함을 나타내고 기본속성은 true이다.
[[Writable]] - 프로퍼티의 값을 바꿀수 있음을 나타내고 기본 속성을 true이다.
[[Value]] - 프로퍼티의 실제 데이터 값을 포함하고 기본 속성 값은 undefined이다.

기본 프로퍼티 속성을 바꾸려면 반드시 Object.defineproperty()메서드를 써야하고 이 메서드는 프로퍼티를 추가하거나 수정할 객체, 프로퍼티 이름, 서술자 객체 세가지를 매개변수로 받는다.


접근자 프로퍼티
접근자 프로퍼티에는 데이터 값이 들어있지 않고 대신 getter 함수와 setter 함수로 구성된다
접근자 프로퍼티를 읽을 때는 getter 함수가 호출되며 유효한 값을 반환할 책임은 이 함수에 있고 접근자 프로퍼티에 쓰기 작업을 할 때는 새로운 값과 함께 함수를 호출하며 이 함수가 데이터를 어떻게 사용할지 결정한다.

[[Configurable]] - 해당 프로퍼티가 delete를 통해 삭제하거나 프로퍼티 속성을 바꾸거나 접근자 프로퍼티로 변환할수 있음을 나타내고 기본 속성은 true이다.
[[Enumerable]] - for-in 루프에서 해당 프로퍼티로 반환함을 나타내고 기본속성은 true이다.
[[Get]] - 프로퍼티를 읽을 때 호출할 함수로 기본값은 undefined이다.
[[Set]] - 프로퍼티를 바꿀 때 호출할 함수로 기본값은 undefined이다.

접근자 프로퍼티를 명시적으로 정의할수 없으며 반드시 Object.defineproperty()를 써야한다.
프로퍼티의 값을 바꿨을 떄 해당 프로퍼티만 바꾸는게 아니라 부수적인 절차가 필요한 경우에 사용한다.


6.1.2 다중 프로퍼티 정의
객체에서는 프로퍼티를 동시에 여러개 수정해야할 가능성이 높으므로 Object.defineProperties() 메서드를 제공한다. 

var book = {};

Object.defineProperties(book, {   _year : {     value : 2004   },
  edition : {     value : 1   },

  year : {     get : function(){       return this._year;     },     set : function(newValue){       if(newValue > 2004){         this._year = newValue;         this.edition += newValue - 2004;       }     }   } })

 


이 코드는 book 객체에 _year 와 edition 두 가지 데이터 프로퍼티와 접근자 프로퍼티 year 를 생성한다.


6.1.3 프로퍼티 속성 읽기
ECMAscript5의 Object.getOwnPropertyDescriptor() 메서드를 이용해 원하는 프로퍼티의 서술자 프로퍼티를 읽을수 있고 읽어올 프로퍼티가 포함된 객체, 서술자를 가져올 프로퍼티 이름 두 가지 매개변수를 받는다.

 

'나홀로스터디 > JS For Web Dev' 카테고리의 다른 글

함수 표현식  (0) 2014.10.23
참조타입  (0) 2014.10.17
변수와 스코프, 메모리  (0) 2014.10.07
언어의 기초  (0) 2014.10.01
HTML 속의 자바스크립트  (0) 2014.09.23

표현식과 연산자

2014. 10. 13. 13:12 나홀로스터디/JS 완벽가이드


5장 표현식과 연산자

이 포스팅은 "자바스크립트 완벽 가이드(인사이트, 송인철,이동기,이유원,황인석 옮김)"에서 발췌 요약한 것입니다.
 
5.1 표현식
5.2 연산자 개요
5.3 산술 연산자
5.4 동등 연산자
5.5 관계연산자
5.6 문자열 연산자
5.7 논리 연산자
5.8 비트 단위 연산자
5.9 할당 연산자
5.10 기타 연산자들


5.1 표현식
표현식이란 자바스크립트 인터프리터가 계산하여 값을 구할 수 있는 자바스크립트 구절로 가장 간단한 표현식은 리터럴 또는 변수의 이름이다.  리터럴 표현식의 값은 그 리터럴 값 자신이고 변수 표현식의 값은 해당 변수가 저장하거나 참조하는 값이다.



5.2 연산자 개요
대부분의 연산자는 + 나 - 와 같은 문장부호로 표현되지만 일부는 delete나 instanceof와 같이 키워드로 표현된다.


5.2.1 피연산자 개수

2항 연산자는 두 개의 표현식을 조합하여 하나의 더 복잡한 표현식으로 만들어 내기도 하고 단항 연산자를 지원하기도 한다.

5.2.2 피연산자 타입

피연산자 표현식을 작성할 때는 연산자에 전달되는 데이터 타입과 반환되는 데이터 타입을 주의해야 한다.
'a', 'b' 와 같은 문자열은 곱할수 없지만 자바스크립트에서는 가능한 적절한 타입으로 표현식을 반환하려고 시도한다.
+ 연산자는 숫자 타입 피연산자들에 대해 덧셈을 하지만 문자열타입 피연산자들끼리는 이어 붙이기를 한다.
비교 표현식을 평가하면 언제가 그 비교가 참인지 거짓인지 가리키는 기본 불리언 타입 값을 얻는다.

5.2.3 연산자 우선순위
연산자 우선순위란 연산이 수행되는 순서를 말한다. 원래 정해진 연산자 우선순위를 바꾸려면 확실하게 괄호를 쓰면된다.

5.2.4 연산자 결합 방향

단항, 할당, 3항 비교 연산자들의 결합 방향은 오른쪽에서 왼쪽으로 이루어진다.



5.3 산술 연산자

덧셈( + )
+ 연산자는 숫자 타입 피연산자의 덧셈이나 문자열 타입 피연산자의 이어 붙이기에 쓰이는데 만일 하나의 피연산자가 문자열이라면 나머지 하나의 피연산자를 문자열로 변환한후 이어붙인다.  객체 피연산자는 더하거나 이어 붙일수 있게 숫자나 문자열로 변환하는데 이 변환은 객체의 valueOf() 메서드나 toString() 메서드에 의해 수행된다.

뺄셈( - )
- 연산자가 2항 연산자로 쓰일 경우 첫 번째 피연산자에서 두번째 피연산자를 뺀다. 피연산자가 숫자타입이 아닐경우 먼저 숫자타입으로 변환을 시도한다.

곱셉( * )
* 연산자는 두 연산자를 곱하는데 피연산자가 숫자타입이 아니라면 먼저 숫자타입으로 변환을 시도한다.

나눗셈( / )
/ 연산자는 첫번째 연산자를 두번째 연산자로 나누는데 피연산자가 숫자타입이 아니라면 먼저 숫자타입으로 변환을 시도한다.
자바스크립트에서는 모든 숫자가 부동소수점으로 취급된다.
0으로 나누는 연산결과는 양의 무한대, 또는 음의 무한대가 되며 0/0의 결과는 NaN이 된다.

나머지( % )
% 연산자는 첫번째 피연산자를 두번재 피연산자로 나누고 남은 나머지를 반환한다. 피연산자가 숫자타입이 아닌경우 먼저 숫자타입으로 변환을 시도한다.

단항 마이너스( - )
- 가 하나의 피연산자 앞에서 단항 연산자로 쓰이면 단항 부정을 수행한다.
양수값을 같은 크기의 음수값으로, 음수값은 같은 크기의 양수 값으로 바꾼다.

단항플러스( + )
숫자 리터럴 부호를 명시적으로 지정할수 있게 해준다.
+ 연산자는 전달인자를 숫자 타입으로 변환하는 효과가 있고 전달인자가 변환될수 없는 경우 NaN을 반환한다.

증가( ++ )
++ 연산자는 단항 피연산자에 대해 증가 연산을 수행하는데 피연산자는 변수, 배열, 원소 또는 객체 프로퍼티 중 하나여야한다. 이것이 아닐경우 ++ 연산자는 일단 숫자타입으로 변환을 시도한다.
이 연산자의 정확한 작동은 피연산자의 어느쪽에 연산자가 놓여 있는가에 따라 앞에서 사용될 경우 전치증가 연산자라 부르며 피연산자의 뒤에서 사요오딜 경우 후치증가 연산자라고 부른다.

감소( -- )
-- 연산자는 단항 피연산자에 대해 감소 연산을 수행한다.



5.4 동등 연산자
== 연산자와 === 연산자 모두 두 값이 같은지 확인하는데 쓰이지만 '같다' 는 것을 정의하는 기준이 서로 다르다.
두 연산자 모두 피연산자의 타입을 가리지 않으며 주어진 피연산자가 같으면 true 를, 다르면 false 를 반환한다는 점에서 공통적이다. = 는 '취하다' 또는 '할당하다',  == 는 '~와 동등하다', === 는 '~와 일치한다'라고 읽는다.

반면 객체, 배열, 함수는 '참조에 의해' 비교된다. 두 변수가 같은 객체를 참조할 때에만 이 두 변수는 동등하다고 말하는 것이다.

5.4.2 부등(!=)과 불일치(!==)

부등 연산자 != 는 두 값이 서로 동등할 경우 false를 반환하며 그렇지 않을 경우 true를 반환한다.
불일치 연산자 !== 는 두 값이 서로 일치할 경우 false를 반환하며 그렇지 않을경우 true를 반환한다.




5.5 관계연산자
이 연산자들은 두 값의 관계를 테스트하고 해당 관계가 존재하는지 여부에 따라 true 또는 false를 반환한다.

5.5.1 비교 연산자
비교연산자는 두 값의 상대적인 순서를 판단하는데 쓰인다.

더 작다(<)
더 크다 (>)
더 작거나 같다(=<)
더 크거나 같다(<=)

문자열이 비교될 때에는 Unicode로 인코딩 된 각 문자에 해당하는 숫자값 기준으로 엄격히 문자대 문자로 비교된다.
인코딩 차이와 같은 다양성을 고려하는 문자열 비교 알조리즘으로 String.localeCompare() 메서드가 있다.


5.5.2 in 연산자
in연산자는 좌변의 피연산자로 문자열을 받는다. 우편의 피연산자로는 객체나 배열을 받는다.

5.5.3 instanceof 연산자
instanceof 연산자는 좌변의 피연산자로 객체를, 우변의 피연산자로 객체 클래스의 이름을 받는데 좌변 객체가 우변 클래스의 인스턴스일 경우 연산 결과는 true 이고 그렇지 않을 경우 false이다.




5.6 문자열 연산자
+ 연산자는 두 문자열 피연산자를 이어 붙인다.
<, <=, >, >= 연산자들은 두 문자열을 비교하여 그 순서를 판단하는데 비교의 기준은 알파벳 순서다.
+ 연산자는 숫자 피연산자보다 문자열 피연산자에 우선권을 부여한다.




5.7 논리 연산자

5.7.1 논리 AND(&&)
&& 연산자가 불리언 피연산자에 대해 쓰일 경우 이 연산자는 두 값에 대한 불리언 AND를 수행하고 첫번째 피연산자와 두번째 피연산자가 모두 'true' 일 경우에만 연산결과로 true를 반환하므로 좌변 표현식의 값에 따라 우변 표현식을 평가할 수도 있고 평가하지 않을수도 있다.

5.7.2 논리 OR(||)
|| 연산자가 불리언 피연산자에 대해 쓰일 경우 이 연산자는 두 값에 대한 불리언 OR을 수행하고 두 피연산자중 하나가 true 이거나 둘 다 true 일 경우 연산결과로 true를 반환한다.

5.7.3 논리 NOT(!)
! 연산자는 단항 연산자로 이 연산자는 단일 피연산자 앞에 놓인다.  이 연산자의 목적은 피연산자의 불리언 값을 반전, 즉 반대로 바꾸는 것이다.




5.8 비트 단위 연산자
비트 단위 연산자가 작용하는 것은 32비트 정수 표현법이다.




5.9 할당 연산자
= 연산자는 오른쪽 값을 왼쪽의 변수, 배열 원소, 객체 프로퍼티 등에 할당하므로 앞으로 이 변수, 원소, 프로퍼티 등을 사용하면 그 할당된 값을 참조하는 것이 된다.

할당 연산자의 연산자 결합 방향은 오른쪽에서 왼쪽이고 각 할당 표현식의 값은 우변의 값과 같다. 
  

i = j = k = 0;  





5.10 기타 연산자들

5.10.1 조건부 연산자(?:)
자바스크립트의 유일한 3항 연산자이다.
첫번째 연산자는 ? 앞에 위치하고 두번째는 ? 와 : 사이에 위치하며 세번재는 : 뒤에 위치한다.

x > 0 ? x * y : -x *  y; 

조건부 연산자의 첫번째 피연산자는 불리언 값이어야 하고 조건부 연산자가 반환하는 값은 첫 번째 피연산자의 불리언 값에 의해 결정되는데 그값이 true이면 조건부 표현식의 값은 두 번째 피연산자의 값이 되고 첫번재 피연산자의 값이 false이면 조건부 표현식의 값은 세 번재 피연산자의 값이 된다.

5.10.2 typeof 연산자
typeof 연산자는 단일 피연산자 앞에 위치하는 단항 연산자로 피연산자는 아무 타입이라도 무방하다.
이 연산자의 값은 피 연산자의 데이터 타입을 가리는 문자열로 피연산자가 숫자, 문자열, 불리언 값일 경우 typeof 연산자의 결과도 그에따라 "number", "string", "boolean" 이 된다. 객체, 배열, null에 대해서는 "object" 를 반환한다. 함수 타입의 피연산자에 대해서는 "function" 을, 정의되지 않은 피연산자는 "undefined"를 반환한다.

5.10.3 객체 생성 연산자(new)
new 연산자는 새로운 객체를 생성하고 이를 초기화하기 위한 생성자 함수를 호출한다.

new constructor(arguments); 

constructor는 반드시 생성자 함수로 평가되는 표현식이어야 하고 이에 따르는 전달인자는 괄호로 감싸야 하며 전달인자가 두개 이상일때는 쉽표로 구분한다. new 연산자에만 해당하는 특수한 경우로 자바스크립트에서는 함수 호출에 전달인자가 없을 경우 괄호를 생략할수 있는 간단한 문법을 지원한다.

o = new Object;  // 선택적으로  쓸수 있는 괄호가 생략됨
d = new Date();   //  현재 시간을 나타내는 Date 객체 반환
c = new Rectangle(3.0, 4.0, 1.5, 2.75)   // Rectangle 클래스의 객체 생성
obj = new constructor[i](); 

 
5.10.4 delete 연산자

delete 는 단항 연산자이며 피연산자로 지정된 객체 프로퍼티, 배열 원소 또는 변수의 삭제를 시도하는데 피연산자가 성공적으로 삭제되었을 경우 true를 반환하고 삭제될수 없는 경우 false를 반환한다.
한가지 중요한 점은, delete가 영향을 미치는 것은 오직 프로퍼티 뿐이며 해당 프로퍼티가 참조하고 있떤 객체는 무관하다는 것이다.

5.10.5 void 연산자
void는 단일 피연산자 앞에 쓰이는 단항 연산자로 피연산자의 타입은 아무 타입이라도 관계없다.
이 연산자는 피연산자의 값을 무시하고 undefined를 반환한다. 가장 일반적인 사용처는 클라이언트 측의 javascript: URL 사용으로 브라우저에 평가된 값을 표시하지 않으면서 표현식을 평가할 수 있게 해준다.

5.10.6 쉼표 연산자(,)
쉼표연산자는 왼쪽의 전달인자를 평가하고 오른쪽의 전달인자를 평가한 후 오른쪽 전달인자 값을 반환한다.

i = 0, j = 1, k = 2;

i = 0; j = 1; k = 2;

하나의 표현식만 허락되는 상황에서 부수 효과가 일어나는 다수의 개별 표현식들을 평가해야 할 경우에 사용한다.

5.10.7 배열과 객체 접근 연산자
배열 원소에 접근하는데에는 대괄호 [] 를 사용하고 객체의 원소에 접근하는 데에는 마침표(.)를 사용하면 된다.
[] 와 마침표(.) 모두 자바스크립트 연산자로 취급된다.
연산자는 좌변 피연산자로 객체를 받으며, 우변 피연산자로는 식별자(프로퍼티 이름)를 받는다. 우변 피연산자는 프로퍼티나 메서드의 이름에 해당하는 리터럴이어야 한다.

document["lastMdfified"]
frame[0]['length']
data["val" + i ] 

[]는 보통 배열의 원소에 접근하는데 사용된다. 프로퍼티 이름을 따옴표로 인용해야 하므로 객체 프로퍼티에 접근하는 용도로는 마침표(.) 연산자보다 불편한데 객체가 연관배열로 사용될경우 프로퍼티 이름이 동적으로 생성되며 이 경우에는 오직 [] 연산자만 사용할 수 있다.

5.10.8 함수 호출 연산자
() 연산자는 자바스크립트에서 함수 호출에 사용되고 피연산자의 개수가 정해져 있지 않다.

'나홀로스터디 > JS 완벽가이드' 카테고리의 다른 글

객체와 배열  (0) 2014.10.20
문장  (0) 2014.10.16
변수  (0) 2014.10.07
데이터 타입과 값  (0) 2014.10.01
어휘구조  (0) 2014.09.24

변수

2014. 10. 7. 18:02 나홀로스터디/JS 완벽가이드


4. 변수

이 포스팅은 "프론트엔드 개발자를 위한 자바스크립트(2013 인사이트, 한선용 옮김)"에서 발췌 요약한 것입니다.
 
4.1 변수타입
4.2 변수선언
4.3 변수의 유효범위
4.4 기본타입과 참조타입
4.5 가비지 컬렉션
4.6 변수와 프로퍼티
4.7 변수의 유효 범위(재해석)

변수는 프로그램에서 쓰이는 데이터 값을 저장하고 다루는데 사용된다.


4.1 변수타입
자바스크립트 변수는 타입이 고정되어 있지 않아 어떠한 데이터 타입의 값이라도 담을수 있다.


4.2 변수선언
자바스크립트에서 어떤 변수를 사용하려면 일단 그 변수를 선언해야만 하는데 만일 변수의 초기값을 지정하지 않을 경우 선언은 되지만 값이 저장되기 전까지 값은 undefined이다.

4.2.1 변수 선언의 반복과 생략
var 구문으로 같은 이름의 변수를 여러번 선언해도 무방하다.
var 구문으로 선언되지 않은 변수에 값을 할당하려 하면 자바스크립트가 암묵적으로 그 변수를 선언하게 되며 그 변수는 항상 전역 변수로 선언된다.

4.3 변수의 유효 범위
프로그램에서 그 변수가 정의되어 있는 영역을 맒한다. 전역변수의 유효 범위는 전역적이고 반면 어떤 함수안에서 선언된 변수는 오직 그 함수 안에서만 정의된다. 이런 변수를 지역변수라고 부르며 유효 범위도 지역적이다.
함수 내부에서는 지역 변수가 같은 이름의 전역 변수보다 우선적으로 사용된다.

4.3.1 블록 단위의 유효 범위는 없다.
함수 안에서 정의된 변수는 그것이 정의된 위치에 관계없이 항상 함수 전체에 걸쳐 유효하다.
지역변수는 함수 전체에 걸쳐서 정의되어 있지만 var 문이 실행되고 나서야 실체로 초기화 된다.

4.3.2 정의되지 않은 변수 vs 할당되지 않은 변수
선언되지 않은 변수를 읽으려고 하면 런타임 오류가 발생한다. 그러나 정의되지 않은 변수에 값을 할당할 때는 에러가 발생하지 않는다. 이경우에는 암묵적으로 해당 변수가 전역의 유효범위로 선언된다.

선언은 되었으나 아직 값이 할당되지 않은 변수를 읽으려고 하면 그 변수의 초기값 'undefined' 를 얻게 된다.


4.4 기본 타입과 참조 타입
고정된 메모리를 차지하는 기본 타입은 숫자, 불리언 값, null, undefined 이  있고, 참조타입은 객체(object), 배열, 함수가 있다.
기본 타입의 경우 변수에 실제 값이 저장되지만 참조 타입은 단지 참조만이 저장된다.


4.5 가비지 컬렉션
참조 타입은 크기가 고정되어 있지 않으므로 동적으로 할당되어야 하는데 자바스크립트에서는 프로그래머가 수동으로 메모리를 해제하도록 강제하지 않는 대신 가비지 컬렉션이라 불리는 기술에 의존한다.


4.6 변수와 프로퍼티
변수와 객체 프로퍼티는 같은 방법으로 할당되고 자바스크립트 표현식에서 동일한 방법으로 사용딘다.

4.6.1 전역 객체
자바스크립트 인터프리터가 구동되면 자바스크립트 코드를 실행하기 전에 전역객체를 생성하면서 미리 정의된 값들과 함수들을 참조하는 다수의 프로퍼티들을 초기화한다.
최상위코드, 즉 어떤 함수에도 속하지 않은 코드에서는 자바스크립트의  this 키워드를 사용해서 전역객체를 참조할수 있다.

4.6.2 지역변수 : 호출객체
지역변수는 어떤 객체의 프로퍼티에 해당하고 이 객체를 일컬어 호출 객체(call object)라고 부른다.
호출객체는 전역 객체에 비해 수명이 짧지만 쓰이는 목적은 동일하며 함수를 실행하는 동안 그 함수의 전달인자와 지역변수는 이 호출 객체의 속성으로 저장된다.

4.6.3 자바스크립트 실행 컨텍스트
실행 컨텍스트는 자바스크립트 코드가 실행되고 있는 컨텍스트를 말한다.




4.7 변수의 유효 범위(재해석)
모든 자바스크립트 실행 컨텍스트에는 유효 범위 체인(scope chain) 이라는 것이 있다.



 

'나홀로스터디 > JS 완벽가이드' 카테고리의 다른 글

문장  (0) 2014.10.16
표현식과 연산자  (0) 2014.10.13
데이터 타입과 값  (0) 2014.10.01
어휘구조  (0) 2014.09.24
자바스크립트 소개  (0) 2014.09.23

변수와 스코프, 메모리

2014. 10. 7. 14:27 나홀로스터디/JS For Web Dev


4장 변수와 스코프, 메모리

이 포스팅은 "프론트엔드 개발자를 위한 자바스크립트(2013 인사이트, 한선용 옮김)"에서 발췌 요약한 것입니다.
 
4.1 변수의 원시 값과 참조 값
4.2 실행 컨텍스트의 이해
4.3 가비지 컬렉션의 이해

자바스크립트는 느슨한 타입으로 특정시간에서 특정 값을 가리키는 이름일 뿐,  변수가 가져야 할 데이터 타입에 대한 규칙이 없으므로 실행중에 변수의 값과 데이터 타입이 바뀔수 있다.


4.1 원시 값과 참조 값

ECMAScript의 변수는 원시 값과 참조 값 두가지 타입의 데이터를 저장할 수 있는데 '원시 값'은 단순한 데이터이며 '참조 값'은 여러 값으로 구성되는 객체를 말한다.
원시 타입은 Undefined와 Null, 불리언, 숫자, 문자열인데 변수에 저장된 실제값을 조작하기 때문에 '값으로' 접근한다고 한다.
참조 값은 메모리에 저장된 객체로 직접 메모리 공간을 조작하는 일은 불가능하며 객체를 조작할 때 사실 객체 자체가 아니라 해당 객체에 대한 참조를 조작하는 것이므로 '참조로' 접근한다고 한다.


4.1.1 동적 프로퍼티
원시값과 참조값의 정의는 비슷하지만 참조값에서 정의한 변수에는 프로퍼티와 메서드를 동적으로 추가할수 있다.
var person = new object(); person.name = "Nicholas"; alert(person.name); // "Nicholas"
var name = "Nicholas"; name.age = 27; alert(name.age);  // undefined

4.1.2 값 복사
원시 값을 다른 변수로 복사할 때는 현재 저장된 값을 새로 생성한 다음 새로운 변수에 복사한다.
참조 값을 다른 변수로 복사할 때는 현재 저장된 값을 새로 생성한 다음 새로운 변수에 복사하는 것은 같지만 그 값이 객체 자체가 아니라 저장된 객체를 가리키는 포인터라는 점이 다르다.

4.1.3 매개변수 전달
함수 매개변수는 모두 값으로 전달되는데 함수 외부에 있는 값은 함수 내부 매개변수에 복사된다.
변수는 값으로도, 참조로도 접근할 수 있지만 매개변수는 원시 값, 참조 값 모두 오직 값으로만 전달된다
함수 내에서 매개변수를 덮어쓰면 매개변수는 지역객체를 가리키는 포인터가 된다.

4.1.4 타입 판별
typeof 연산자는 특정 변수가 문자열이나 숫자, 불리언,  undefined라면 정확한 타입을 알수 있고 객체이거나 null이면 'object'를 반환한다.



4.2 실행 컨텍스트와 스코프
변수나 함수의 컨텍스트는 다른 데이터에서 접근할 수 있는지, 어떻게 행동하는지를 규정한다.
가장 바깥쪽에 존재하는 실행 컨텍스트는 전역 컨텍스트로 구현한 환경에 따라 다르게 불리는데 웹 브라우저에서는 이 컨텍스트를 window라고 부르므로 전역 변수와 함수는 모두 window객체의 프로퍼티 및 메서드로 생성된다.
함수를 호출하면 독자적인 실행 컨텍스트가 생성되는데 컨텍스트에서 코드를 실행하면 변수 객체에 '스코프 체인'이 만들어 진다.
스코프 체인의 목적은 실행 컨텍스트가 접근할 수  있는 모든 변수와 함수에 순서를 정의하는 것이다.
4.2.1 스코프 체인 확장
실행 컨텍스트에는 전역 컨텍스트와 함수 컨텍스트 두가지 타입만 있지만 (eval()을 호출할때 생성되는 세번째  타입이 있다) 스코프 체인을 확장할 수 있는 방법도 있다.
try-catch문의 catch블록과 with문은 스코프 체인 앞에 변수 객체를 추가한다.
4.2.2 자바스크립트에는 블록 레벨 스코프가 없다.
블록레벨 스코프를 지원하는 언어에서는 변수가 선언된 컨텍스트 안에서만 존재하지만 자바스크립트에서는 루프 실행이 끝난 후에도 존재한다.
변수선언
var를 사용해 선언한 변수는 자동으로 가장 가까운 컨텍스트에 추가된다. 변수를 선언하지 않은채 초기화하면 해당 변수는 자동으로 전역 컨텍스트에 추가된다.

식별자 검색

식별자가 로컬 컨텍스트에 정의되어 있으면 부모 컨텍스트에 같은 이름의 식별자가 있다해도 참조할 수 없다.




4.3 가비지 콜렉션
자바스크립트는 실행 환경에서 코드 실행 중에 메모리를 관리하는데 이런 의미에서 가비지 콜렉션 언어라고 부른다.

4.3.1 표시하고 지우기
가장 널리 쓰이는 가비지 컬렉션 방법으로 변수가 특정 컨텍스트 안에서 사용할 것으로 정의되면 그 변수는 그 컨텍스트 안에 있는 것으로 표시된다.
4.3.2 참조 카운팅
각 값이 얼마나 많이 참조되었는지 추적한다는 것이다.
4.3.3 성능
가비지 컬렉터는 주기적으로 실행되며 메모리 내 할당된 변수가 많다면 상당히 비용이 드는 작업으로 타이밍이 중요하다.
4.3.4 메모리 관리
일반적으로 가비지 컬렉션을 지원하는 프로그래밍 환경에서는 개발자가 메모리 관리를 신경쓰지 않아도 되지만 자바스크립트라는 환경에서 메모리 관리와 가비지 콜렉션은 다른 환경과 다르다.  메모리 제한은 변수 할당 뿐만 아니라 호출 스택, 스레드에서 실행할 수 있는 문장수에도 영향을 미친다.
메모리 사용을 최적화하는 가장 좋은 방법은 코드 실행에 필요한 데이터만 유지하는 것이다. 필요없어진 데이터에는 null을 할당하여 참조를 제거하는 편이 좋다.
변수에서 참조를 제거한다 해서 할당된 메모리가 자동으로 반환되는 것은 아니다. 참조 제거의 요점은 값의 컨텍스트를 없애서 다음에 가비지 콜렉션을 실행할 때 해당 메모리를 회수하도록 하는 것이다.



'나홀로스터디 > JS For Web Dev' 카테고리의 다른 글

참조타입  (0) 2014.10.17
객체에 대한 이해  (0) 2014.10.15
언어의 기초  (0) 2014.10.01
HTML 속의 자바스크립트  (0) 2014.09.23
자바스크립트란 무엇인가  (0) 2014.09.22

데이터 타입과 값

2014. 10. 1. 18:02 나홀로스터디/JS 완벽가이드


3장 데이터 타입과 값

이 포스팅은 "자바스크립트 완벽 가이드(인사이트, 송인철,이동기,이유원,황인석 옮김)"에서 발췌 요약한 것입니다.
 
3.1 숫자
3.2 문자열
3.3 불리언 값
3.4 함수
3.5 객체
3.6 배열
3.7 null
3.8 undefined
3.9 Date 객체
3.10 정규표현식
3.11 Error 객체
3.12 타입변환요약
3.13 기본데이터 타입 래퍼 객체
3.14 객체에서 기본 타입으로 변환
3.15 값에 의한 vs. 참조에 의한


프로그램 언어로 표현할 수 있고 조작할수 있는 값의 종류를 데이터 타입이라고 하며 프로그램 언어의 기본은 그 언어가 지원하는 데이터 타입의 종류다.
자바스크립트는 세 가지 기본 데이터 타입인 숫자(number), 문자열(string), 불리언(boolean)과 단일값을 갖는 단순데이터 타입인 null과 undefined 가 있고 객체(object)라고 불리는 복합 데이터 타입을 지원한다.

자바스크립트에서 객체는 이름 붙은 값들의 순서 없는 모임을 나타내거나 번호가 붙은 순서 있는 값들의 모임인 배열을 나타내기도 하는데 객체와 배열은 근본적으로는 동일한 데이터 타입이지만 다른 방식으로 사용된다.

자바스크립트는 함수(function) 라고 불리는 특별한 객체를 지원하는데 함수는 특정 동작을 수행하기 위해 호출될
수 있다.



3.1 숫자
자바스크립트는 정수 값과 실수 값을 구별하지 않고 모든 숫자가 64비트 실수 형식을 사용하여 표현한다.
숫자 리터럴 앞에 마이너스(-)를 붙이면 음수를 만들수 있지만 (-)가 붙은 단항 부정 연산자는 숫자 리터럴 문법에 속하지 않는다. 


3.1.1 정수 리터럴
자바스크립트에서 10 진수 정수는 숫자 시퀀스(연속된) 형태로 작성된다.

3.1.2 16진수와 8진수
16진수 리터럴은 '0x''0X' 로 시작하고 16진수 숫자들을 입력한다.(0~9, 10~15)
8진수 리터럴은 숫자 0으로 시작되고 0부터 7까지 숫자 시퀀스가 따르는 형태다

3.1.3 부동소수점 리터럴
지수 표기법을 사용하여 부동소수점 리터럴을 표현할 수 있다.

3.1.4 숫자 조작
자바스크립트 언어에서는 기본 산술 연산자(+,-,*,/) 외에 코어 자바스크립트에서 제공하는 수의 수리 함수를 사용해 복잡한 연산을 수행할수 있고, 함수의 사용 편의를 위해 모두 Math라는 단일 객체의 프로퍼티도 들어있다.

   sine_of_x = Math.sin(x); 


3.1.5 숫자 변환
자바스크립트는 숫자를 문자열 형식으로 변환하거나 문자열을 숫자로 변환할 수 있다.

3.1.6 특수한 숫자 값
자바스크립트에서는 부동 소수점 값으로 표현 가능한 가장 큰 수보다 더 큰 값인 무한대를 나타내는 Infinity가 있다.
수리 연산이 정의되지 않은 결과를 산출하거나 에러를 발생시킬 경우 특수한 값인 NaN이 출력 되는데 어떤 숫자와도 동일하지 않는 값을 비교하기 위해 isNaN() 이라는 특별한 함수를 사용한다.




3.2  문자열(string)
문자열은 Unicode 문자나 숫자, 문장부호들의 시퀀스로 텍스트를 표현하는 자바스크립트 데이터 타입으로 작은 따옴표(' ') 혹은 큰 따옴표 쌍(" ")으로 문자열 리터럴을 포함시킬수 있다.

3.2.1 문자열 리터럴

문자열 리터럴은 한줄을 넘지 말아야 하고 줄바꿈 문자를 포함시키고 싶아면 문자열 리터럴 내에 Unicode를 사용할수 있다.

3.2.2 문자열 리터럴 내 이스케이프 시퀀스
역슬래시(\) 문자는 뒤에 나오는 문자와 결합될 경우 생략부호를 나타낼수 있다. 

   'You\'re right, it can\'t be a quote' 

3.2.3
문자열 조작
자바스크립트의 기본적인 조작은 문자열을 이어 붙이는 것이고 문자열의 길이를 알고 싶다면 length 프로퍼티를 사용하면 된다.

3.2.4 숫자를 문자열로 변환하기
숫자는 필요할 때 문자열로 자동으로 변환된다.
숫자를 문자열로 변환하려면 String() 함수를 사용하고 숫자를 문자열로 변환하는 다른 기법으로 toString() 메서드를 사용할 수 있다.

var string_value = String(number);
string_value = number.toString();


3.2.5 문자열을 숫자로 변환하기
문자열을 숫자로 명시적으로 변환하려면 Number() 생성자를 함수처럼 호출하는 것으로 10진수만 변환할수 있고 정수만 변환하는 parseInt()와 정수와 부동소수점 숫자를 모두 변환하는 parseFloat()가 있다.  지정된 문자열을 숫자로 변환하지 못할 경우 NaN을 반환한다.




3.3 불리언 값

불리언 값은 무엇이 참인지 거짓인지를 표현하는 것으로 truefalse 두 개의 값만을 가질 수 있다.

3.3.1 불리언 타입 변환
불리언 값이 숫자 문맥에서 사용되면 true 는 숫자 1로 false는 숫자 0으로 변환되고 문자 문맥에서 사용되면 "true" 또는 "false"로 변환된다.
명시적 타입 변환을 하는 방법은 Boolean() 함수를 사용하는 것과 불리언 NOT 연산자를 두번 사용하는 방법이 있다.

var x_as_boolean = Boolean(x);
var x_as_boolean = !!x; 

 

 


3.4 함수(function)

함수는 자바스크립트 프로그램에 정의되어 있거나 자바스크립트 구현에 미리 정의되어 있는 실행가능한 코드로 계산 대상인 값들을 지정하는 전달인자(arguments)나 매개변수(parameter) 를 넘겨 받을수 있으며 계산 결과 값을 반환할 수도 있다.

function square(x){ // 함수 이름은 square 이다. 전달인자 x 하나를 받는다.
  return x * x; // 이 함수는 전달인자를 제곱한 값을 반환한다.
}

함수는 단지 정의하고 호출할수 있는 것이지 데이터 타입은 아니다. 그러나 자바스크립트에서 함수는 숫자나 문자열처럼 데이터 값이므로 다른 값처럼 객체 프로퍼티에 할당될 수 있다.
함수가 어떤 객체의 프로퍼티로 할당되면 그 객체의 메서드라고 부른다.

3.4.1 함수 리터럴
자바스크립트는 함수를 정의하는 함수 리터럴 function 키워드, 함수이름(생략가능), 괄호로 둘러쌓인 함수 전달인자 목록, 중괄호로 구성된다.

함수 정의와 함수 리터럴 간에 큰 차이는 함수 리터럴은 자바스크립트 표현식 내에 나타날 수 있다는 점이다.

function square(x) { return x * x; }
var square = funcion(x) { return x * x;}   




3.5 객체(object)
객체는 이름붙은 값들의 모음으로 보통 이 이름붙은 값들을 객체의 프로퍼티라고 부른다.
객체의 프로퍼티를 참조하려면 객체 이름을 쓰고 이어서 마침표와 프로퍼티 이름을 적어주면 된다.

프로퍼티는 배열이나 함수, 객체를 포함한 어떤 타입의 값이라도 담을 수 있고, 함수가 객체 프로퍼티로 저장될 경우 그 함수를 메서드라고 부른다. 객체 메서드를 호출할때는 객체로부터 함수 값을 호출하기 위해 . 을 사용하고 함수를 호출하기 위해 () 를 사용한다.

연관배열로 사용되는 경우 객체 프로퍼티에 접근할때는 대괄호를 사용한다.

image["width"] 


3.5.1 객체 생성
객체는 특수한 생성자 함수를 호출하여 생성할수 있다.

var o = new objoct(); var now =   new Date(); var pattern = new RegExp("\\sjava\\s", "i");


3.5.2 객체 리터럴
자바스크립트는 객체를 생성하고 프로퍼티를 지정하는 객체 리터럴(객체 초기자라고도 불린다) 문법을 제공한다.

3.5.3 객체 변환

객체가 문자열 문맥에서 사용되면 toStrint() 메서드가 호출되고 반환하는 문자열이 사용된다.  객체가 숫자 문맥에서 사용되면 객체의 valueOf() 메서드를 호출하고 그 값을 반환한다.


 

3.6 배열(array)
배열은 객체처럼 데이터 값들의 모음으로 객체 내에 포함되는 각 데이터 값에는 이름이 있는 반면 배열의 각 데이터 값에는 번호, 즉 인덱스(index) 가 있다.

3.6.1 배열 생성

배열은 Array() 생성자 함수로 생성할 수 있는데 Array(n) 생성자에 정수 하나만 넘겨주면 그 숫자는 배열의 크기로 사용된다.

3.6.2 배열 리터럴
배열 리터럴(혹은 배열 초기자)은 대괄호로 둘러싸인 쉽표로 구분된 값들의 목록이다.

var a = [ 1.2, "javascript", true, { x : 1, y : 3}]; 




3.7 null
null은 객체타입의 특수한 값, 어떤 객체도 나타내지 않는 값으로 취급되며 불리언 문맥에서 사용되면 false로 변환되고 숫자 문맥에서는 0으로 문자열 문맥에서는 "null"로 변환된다.



3.8 undefined
undefined는 선언은 되었지만 값이 할당된 적이 없는 변수에 접근하거나 존재하지 않는 객체 프로퍼티에 접근할 경우 반환되는 값이다.

null과 undefined 값은 서로 구별되는 값이지만 동등 연산자 == 는 둘을 같은 것으로 간주한다.



3.9 Date 객체
Date객체는 new 연산자와 Date() 생성자로 생성할 수 있다.



3.10 정규 표현식
자바스크립트의 정규 표현식은 RegExp 객체로 표현되며 RegExp() 생성자로 생성할수 있다.



3.11 Error 객체
자바스크립트 인터프리터는 런타임 에러가 발생하면 클래스들 중 하나에 해당하는 객체를 던진다.



3.13 기본 데이터 타입 래퍼 객체
자바스크립트에는 세 가지 핵심 기본 데이터 타입 각각에  대응되는 클래스가 정의되어 있어 숫자, 문자열, 불리언 데이터 타입을 지원할 뿐 아니라 Number, String, Boolean 클래스도 지원하고 이 클래스들은 기본 데이터 타입을 둘러싼 래퍼들이다.
래퍼는 기본 데이터 타입 값과 동일한 값을 담고 있지만 데이터 조작을 위한 프로퍼티와 메서드도 가지고 있다.



3.14 객체에서 기본 타입으로 변환
null 이 아닌 객체가 불리언 문맥에서 사용되면 true 로 변환한다.
대부분의 객체는 Object 의 기본 value() 메서드를 상속 받으며 객체 그 자체를 반환하는데 기본 데이터 타입 값을 반환하지 않기 때문에 자바스크립트는 다음으로 toString() 메서드를 호출하고 반환되는 문자열을 숫자로 변환하므로써 객체를 숫자로 변환하려고 시도한다.



3.15 값에 의한 vs 참조에 의한
자바스크립트는 데이터 값을 조작할수 있는데 값을 복사하여 새로운 변수에 할당할 수 있고 함수나 메서드의 전달인자로 넘겨줄수 있다. 또한 두 값이 동일한지 알아보기 위해 한 값과 다른 값을 비교할 수 있다.

값에 의해 데이터를 조작할 때 중요한 것은 데이터 값인데 값 할당 시에는 실제 값이 복사되며 복사본은 변수, 객체 프로퍼티, 배열 원소에 저장되어 원본과 완전히 별개로 저장되는 독립적인 값으로 데이터를 값에 의해  함수에 전달하면 데이터 복사본이 전달된다.
참조에 의한 조작은 값에 대한 실제 복사본이 오직 하나만 존재하는 것으로 값이 참조에 의해 조작될 때 변수는 직접 값을 담지 않고 값에 대한 참조를 담을 뿐이다.



3.15.1 기본타입과 참조타입
자바스크립트에서 숫자와 불리언 타입은 정해진 갯수의 작은 바이트로 구성되어 자바스크립트 인터프리터가 저수준 오퍼레이션을 통해 손쉽게 조작이 가능한 기본 타입이다.
반면 객체와 특수한 종류인 배열, 함수는 임의 개수의 프로퍼티나 원소를 포함할 수 있으므로 값에 의해 조작하면 복사나 비교작업에 메모리를 비효율적으로 많이 사용해야하기 때문에 참조타입이다.

 

 

'나홀로스터디 > JS 완벽가이드' 카테고리의 다른 글

문장  (0) 2014.10.16
표현식과 연산자  (0) 2014.10.13
변수  (0) 2014.10.07
어휘구조  (0) 2014.09.24
자바스크립트 소개  (0) 2014.09.23
Copyright © HuckleberryM All Rights Reserved | JB All In One Designed by CMSFactory.NET