2015년 1월 28일 수요일

[JavaScript] 자바스크립트 String(문자열) 자료형

자바스크립트 String 데이터 타입

16bit 유니코드 문자들로 이루어지는 String(문자열) 데이터 타입 이다. 이 또한 다른 프로그래밍 언어에서도 볼 수 있는 흔한 타입이다. 자바스크립트(ECMA 스크립트)에서 String 타입은 쌍따옴표(")와 단따옴표(') 로 문자열을 감쌈으로써 선언이 가능하다. 단 문자열을 감싸는 따옴표가 같은 따옴표여야 한다.


var stringVar1 = "StringTest1";
var stringVar2 = 'StringTest2';
var stringVar3 = "StringTest2';//에러가 나게된다.


String 데이터 타입의 메모리 관리


사실 String(문자열) 타입은 따로 특별히 다룰게 없는데, String 데이터 타입의 메모리 매니지먼트는 알아두는게 좋다. Number, Boolean 등 다른 Primitive Data Type(원시 자료형)들이 변수 값의 수정시 추가적인 메모리 할당을 하지 않는 것에 반해, String 자료형은 변수값이 변경될 때마다 새로운 메모리를 할당해줘야한다. 물론 이건 자바스크립트 엔진이 할 일이니 코딩시 개발자들이 따로 특별한 코드를 부가해야하는 것은 아니다. 이런 일들이 벌어지게되는 이유는 바로 String(문자열) 데이터 타입이 이름에서도 잘 알 수 있듯 "문자들의 열"로 이루어져있기 때문이다. 16bit 유니코드 문자들의 열로 이루어진 ECMAScript 의 String 자료형은 문자 1개당 2바이트의 메모리를 소모하게 되다. 그렇다면 한번 생각해보자.

ABCDEFGH 라는 스트링을 저장해야한다고 할 때

[A][B][C][D][E][F][G][H]
처럼 16 바이트의 연속되는 메모리를 할당하는게 좋을까?

아니면

[A][ ][ ][ ][ ][ ]
[ ][B][C][D][ ][ ]
[ ][ ][F][G][ ][E]
[ ][ ][ ][H][ ][ ]
처럼 각기 떨어져있는 메모리들을 할당하는게 좋을까?

물론 당연히 전자의 경우가 훨씬 효과적일 것이다. 전자의 경우에는 메모리가 서로 연속되있어, RAM에 엑세스할시에 후자에 비해 훨씬 빠른속도로 전체 엑세스가 가능하다. 하지만 후자의 경우에는 각기 떨어져있는 메모리에 엑세스하느라 전자에 비해서는 느리게 읽게될것이다. 물론 이는 매우 미세한 차이지만, 메모리 관리의 효율성 관점으로 보았을 때, 후자의 경우대로 관리해서는 절대로 안될 것이다.

어쨋든 이게 String 값이 변경될 때 새로운 메모리를 할당해야된다는 것과 무슨 관련이 있나면,
스트링 변수에 주어진 메모리 바로 옆에 새로운 값이 할당되는것과 같은 아래의 경우와 같은 일이 발생할 수도 있다는건데

[A][B][C][D][E][F][G][H][0][N][E][W][V][A][L][U][E]

만약 이 경우에 새로운 메모리블록을 할당하지 않고 ABCDEFGH라는 스트링 값에 IJK를 추가해야 한다면, 아마 [0][N][E][W]가 저장된 메모리와 그 뒤의 메모리들이 순차적으로 뒤로 밀려나거나(매우 비효율적인 방법), [0][N][E][W]라는 메모리를 그냥 무시하고 [I][J][K][0]로 그냥 덮어 씌울 수도 있겠다. 하지만 이 경우에는 결국 NEWVALUE라는 값이 저장된 변수를 훼손하게 된다. 이런 이유 때문에 스트링값의 변경이 있을시에 새로운 메모리 블락을 할당해주고, 그 전 블락을 풀어주게 되는건데, 코드로 보자.


var stringVar1 = "ABCDEFGH";//[A][B][C][D][E][F][G][H]
var stringVar2 = 'NEWVALUE';//[A][B][C][D][E][F][G][H][0][N][E][W][V][A][L][U][E]
var stringVar1 = stringVar1 + "IJK";


위의 코드가 실행되면 메모리 할당은 아래와같이 바뀌게 된다

[ ][ ][ ][ ][ ][ ][ ][ ][ ][N][E][W][V][A][L][U][E]
[ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ]
[A][B][C][D][E][F][G][H][I][J][K][ ][ ][ ][ ][ ][ ]

이 모든게 개발자들이 보는 모니터 뒤에서 일어나는 일이기는 하지만, 이 때문에 자바스크립트 엔진 String 데이터 타입 관리에 따라서, String Concatenation(문자열 연결) 작업에 걸리는 시간이 좌지우지 되고, 나아가선 자바스크립트 엔진의 성능차이가 발생하는 원인이 되기도 한다.

String(문자열) 타입의 자동 타입 변환


타 자료형의 String 타입으로의 변환은 toString() 함수나, String() 함수로 손 쉽게 가능하다.
그리고 코드 작성시 보게되는 텍스트를 그대로 스트링타입으로 변환하니, 변환 불가능한 값이 없다고 말할 수 있다


var boolTrue = true;
var stringVar1 = boolTrue.toString(); //"true"

//toString()함수는 파라미터로 radix를 넣어서 2, 8, 10, 16진수로 변환 할 수도 있다.
var var1 = 33;
var stringVar1 = var1.toString(2); //"100001"
var stringVar2 = var1.toString(8); //"41"
var stringVar3 = var1.toString(16); //"21"

//단 null 이나 undefined 값은 toString() 함수로 변환하기가 불가능하다. 
//그렇기 때문에 필요한 경우에는 될 수 있으면 String() 함수를 이용해주자

var stringVar4 = String(null); //"null"
var stringVar5 = String(undefined); //"undefined"
var stringVar6 = String(2); //"2"

//또 따옴표를 이용할 수도 있다
var stringVar7 = '\"' + var1 + '\"'; //"33"

댓글 없음:

댓글 쓰기