이번 장에서 문자열에 관해 논의할 때 문자열 데이터 타입의 한 가지 특징에 관해 언급한 바 있다.
그것은 문자열을 조작할 때 객체 표기법을 사용한다는 점이었다[각주:1].
예를 들어, 다음 코드는 전형적인 문자열 조작 코드를 보여준다.
var s = "These are the Times that try people's souls.";
var last_word = s.substring(s.lastIndexOf(" ")+1, s.length);
이미 알고 있는 사람이 아니라면, 앞의 코드에서 s는 객체처럼 느껴질 것이고
이 객체의 메서드를 호출하려고 프로퍼티 값을 읽는 것처럼 보일 것이다.
무슨 일이 일어나고 있는 것일까? 문자열은 객체일까, 기본 데이터 타입일까?
typeof 연산자는 문자열이 'object' 데이터 타입과는 별개인 'string' 데이터 타입이라고 분명히 말해 준다.
그렇다면 왜 문자열을 조작할 때는 객체 표기법을 사용하는 것일까?
사실, 자바스크립트에는 세가지 핵심 기본 데이터 타입 각각에 대응되는 클래스가 정의되어 있다.
즉, 자바스크립트는 숫자, 문자열, 불리언 데이터 타입을 지원할 뿐만 아니라 Number, String 및 Boolean
클래스도 지원한다. 이 클래스들은 기본 데이터 타입을 둘러싸는 래퍼들이다.
래퍼(wrapper)는 기본 데이터 타입 값과 동일한 값을 담고 있지만 데이터 조작을 위한 프로퍼티와 메서드도 가지고 있다. 자바스크립트는 유동적으로 한 타입의 값을 다른 타입의 값으로 변환한다.
여러분이 문자열을 객체 문맥에 사용하면, 즉 여러분이 문자열의 프로퍼티나 메서드에 접근하려고 시도하면, 자바스크립트는 내부적으로 문자열 값에 대한 String 래퍼 객체를 생성한다. 이 String 객체가 문자열 값 대신에 사용된다. String 객체에는 프로퍼티와 메서드들이 정의되어 있으므로 객체 문맥에서 기본 데이터 타입 값을 사용해도 문제가 없다. 물론 이것은 다른 기본 데이터 타입과 해당 래퍼 객체에 대해서도 동일하게 적용된다. 여러분은 단지 문자열을 객체 문맥에서 사용하는 것만큼 다른 타입의값을 객체 문맥에서 자주 사용하고 있지 않을 뿐이다.
여러분이 객체 문맥에서 문자열을 사용할 때 생성되는 String 객체는 일시적으로 존재하는 것이다.
String 객체의 프로퍼티와 메서드에 대한 접근이 완료되면 이 객체는 더 이상 필요하지 않으므로 시스템이
객체를 회수해 간다. s가 문자열이라고 가정하면, 다음은 문자열의 길이를 알아내는 코드를 보여준다.
var len = s.length;
이 경우 s는 문자열인 채로 남아 있다. 원래 문자열 값은 변하지 않는다. 새로운 임시 String 객체가 생성되고, 여러분은 이 객체를 통해 length 프로퍼티에 접근하고, 그 다음 s의 원래 값에 변화를 주지 않은 채로 String 임시 객체는 버려진다. 이러한 동작 방식이 훌륭해 보이긴 하지만, 동시게 기괴할 정도로 복잡하다고 느낄 수도 있다. 실제로 그렇다. 그러나 일반적으로 자바스크립트 구현에서 이러한 내부 변환이 매우 효율적으로
이루어지므로 그리 걱정할 필요는 없다.
String 객체를 여러분의 프로그램에서 직접 사용하려는 경우에는 시스템에 의해 자동으로 버려지지 않게
임시 객체가 아닌 객체를 생성해야 한다. String 객체는 다른 객체를 생성하듯이 new 연산자로 생성할 수
있다. 예를 들어,
var s = "hello world"; // 기본 문자열 타입 값
var S = new String("Hello World") // String 객체
일단 String 객체 S를 생성하고 나면 이것으로 무엇을 할 수 있을까? 대응되는 기본 문자열 값으로 할 수 없는 것은 String 객체로도 못한다. typeof 연산자를 사용하면 분명 S가 객체이지 문자열 값은 아니라고 말할테지만, 이경우를 제외하고는 보통 문자열 값과 String 객체를 구별하기는 쉽지 않을 것이다.[각주:2] 이미 여러분에게 보여 준 바 있지만, 문자열은 필요할 경우 String 객체로 자동 변환된다. 사실 그 반대도 마찬가지다.
여러분이 String 객체를 문자열 값을 기대하는 곳에서 사용할 경우 자바스크립트는 String 객체를 문자열로
자동 변환한다. 따라서 여러분이 + 연산자와 함께 String 객체를 사용하면 임시 문자열 값이 생성되고
문자열 이어붙이기 연산이 수행된다.
msg = S + '!';
이번 절에서 논의한 문자열 값과 String 객체에 관한 모든 내용은 숫자나 불리언 값, 그리고 대응되는 Number 객체와 Boolean 객체에 대해서도 역시 적용된다는 것을 명심하라. Number와 Boolean 클래스에 대해 더 알고 싶으면 3부의 관련 항목을 참고하라.
마지막으로, 모든 숫자, 문자열, 혹은 불리언 값들은 Object() 함수를 사용하여 대응되는 래퍼 객체로
변환할 수 있다.
var number_wrapper = Object(3);
이번 절에서는 고급 주제를 다룬다. 이 절을 처음 읽는다면 그냥 건너뛰어도 좋다. [본문으로]
그렇지만 eval() 메서드는 문자열 값과 String 객체를 서로 다른 것으로 취급하며, 만약 여러분이 실수로
eval() 메서드에 문자열 값이 아닌 String 객체를 전달할 경우 eval() 메서드는 여러분이 예상했던 대로
동작하지 않을 것이다.
'IT_Programming > JavaScript' 카테고리의 다른 글
자바스크립트 완벽가이드 - 3.15 값에 의한 vs. 참조에 의한 (0) | 2010.07.04 |
---|---|
자바스크립트 완벽가이드 - 3.14 객체에서 기본 타입으로 변환 (0) | 2010.07.04 |
자바스크립트 완벽가이드 - 3.11 Error 객체, 3.12 타입 변환 요약 (0) | 2010.07.04 |
자바스크립트 완벽가이드 - 3.10 정규 표현식 (0) | 2010.07.04 |
자바스크립트 완벽가이드 - 3.9 Date 객체 (0) | 2010.07.04 |