변수와 스코프, 메모리

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
Copyright © HuckleberryM All Rights Reserved | JB All In One Designed by CMSFactory.NET