안녕하세요
답변 감사드립니다.
말씀하신대로 전역 플래그를 빼고 실행시켜보니 무한루프에 빠지는 걸 확인했습니다.
감사합니다.
정규 표현식의 결과에 대해서는 아직도 의문이 많아 추가 질문드리고자 합니다.
1. 정규 표현식 결과의 input이나 index같은 property는 어디서 나오는지 의문입니다. 그 속성들은 배열과는 상관없는 속성 아닌지요?
2. 해당 예제를 테스트해보면 length가 늘 1입니다. length가 1인 배열을 반환할거라면 배열을 반환하는 이유를 이해하기 어렵습니다.
3. exec 메소드의 결과물이 aaa라면 aaa[0], aaa[1] 이런 식으로 접근해야 배열의 값을 가져올수 있다고 저는 생각하는데 그냥 aaa를 찍어도 aaa[0]의 값과 동일한 결과를 보여줍니다.
제가 자바스크립트의 배열을 잘못 알고 있어서 그런 건지는 모르지만 참 이해하기 어렵습니다. 그래서 정규표현식의 결과물은 배열이 아니라 특정한 객체가 아닌가 하는 의문이 드는 겁니다.
자꾸 번거롭게 해서 죄송합니다.
제가 테스트한 소스입니다.
function aaa() {
var searchString = "Now is the time and this is the time and that is the time";
var pattern = /t\w*e/g;
var matchArray;
var str = "";
while( (matchArray = pattern.exec(searchString)) != null)
{
alert(typeof matchArray);
alert(matchArray.input);
alert(matchArray.length);
alert(matchArray[0]);
alert(matchArray[1]); // undefined
alert(matchArray);
str += "at " + matchArray.index + " we found " + matchArray + ".
";
}
alert(str);
}
window.onload = aaa();
역자의 답변입니다.
----------------------------------------------
안녕하세요, 자바스크립트 쿡북 번역자 김태곤입니다.
우선 질문하신 내용을 두 가지로 이해했습니다.
1. RegExp.exec에서 배열을 반환한다는 내용이 이상하다.
2. while문을 사용할 것이라면 어째서 "전역 플래그"를 사용했나?
먼저 1번 질문에 대해서 답변을 드리면, exec 메소드에서 반환하는 값은 책에 나와있는대로 항상 배열(또는 null)이 맞습니다.
일반적으로 정규표현식에서 0번은 "패턴과 일치하는 부분 전체"가 되고, 1번 이후는 서브 패턴(subpattern, 책에서는 "부분 문자열"라는 용어도 비슷하게 사용했습니다)으로 묶은 부분에 해당합니다. 예를 들어, 정규표현식 패턴을 /t(\w*)e/g로 바꾸면 이 정규표현식을 실행(exec)한 결과는 항상 크기가 2인 배열이 될 것이고 반환된 배열의 두 번째 원소는 t와 e 사이의 문자열이 될 것입니다.
두 번째 질문의 내용은 올려주신 코드를 다시 한 번 실행해보시라는 대답부터 드리고 싶습니다.
정규표현식이 스펙대로 작동했다면 분명 무한루프에 빠져야 하는 것이 맞습니다. 정규표현식에 전역 플래그를 설정하지 않으면 exec 메소드는 "항상 처음부터" 일치하는 부분을 찾기 때문입니다. 반면, 전역 플래그를 설정해두면 대상 문자열에서 주어진 패턴을 더 이상 찾을 수 없을 때까지는 항상 "일치했던 문자열 끝"에서 시작합니다. 실제로 저 역시 올려주신 코드를 실행한 후 무한루프를 경험할 수 있었습니다.
제가 질문을 잘 이해하고 적절한 답변을 드렸는지 모르겠습니다.
혹 부족한 부분이 있다면 말씀해주세요. 보충 설명을 해드리도록 하겠습니다.
감사합니다.
질문할 공간이 없어서
리뷰란에 질문을 올립니다.
죄송합니다.
p.64의 exec 메소드가 배열을 반환한다는 내용이 이상합니다.
배열을 반환한다면서
예제 소소에서 matchArray[0]으로 각 값을 가져온다는 게 이상합니다.
exec 결과의 length는 늘 1입니다.
배열이라면 length 1의 배열을 반환하는 겁니다.
그리고 while문을 돌릴거라면 "전역" 플래그가 왜 필요한지도 의문입니다.
while문에서 매번 새로운 1개 짜리 배열을 반환하는 메소드라니..
이해하기가 어렵네요.
제가 전역 플래그 제외하고 문자열 취급해서 while문으로 배열에 넣어봤습니다.
책의 소스와 결과는 동일합니다.
function aaa() {
var searchString = "Now is the time and this is the time and that is the time";
var pattern = /t\w*e/;
var matchArray = new Array();
var matchStr = "";
while( (matchStr = pattern.exec(searchString)) != null)
{
matchArray.push(matchStr);
}
for(var i=0 ; i {
document.getElementById("results").innerHTML += "at " + matchArray[i].index + " we found [" + matchArray[i] + "]
";
}
}
window.onload = aaa();
exec가 배열을 반환한다는 책의 설명과 소스는 서로 어긋나는 설명 아닌가요?
저로서는 이해하기가 어렵네요.
번역자님의 답변을 들을 수 있다면 감사하겠습니다.
답변을 해주신 후에
이 글을 삭제하면 감사하겠습니다.
독자 리뷰에 이런 글 올려 죄송합니다.
처음으로 접해본 오라일리의 쿡북 시리즈 였습니다.
가장 먼저 보게 되는 목차를 보면 사용자가 필요에 의해 책을 펼쳤을 때 어느 부분을 봐야 할 지 쉽게 찾을 수 있도록 잘 인덱싱되어 있다고 생각합니다.
실제 파트에 들어가면 내용은 매우 간결하게 설명되어 있습니다. 질답형식으로 간단한 문제가 있고 그것에 대한 해결. 그리고 어떻게 동작하는 지에 대해 설명해 줍니다.
개인적으로 자바스크립트에 대한 실제 경험이 없지만 책을 보는데 있어 어려움은 없었습니다. 그만큼 초보자가 보기 편하게 쓰여 졌다고 말할 수 있을 것 같습니다.
초보자가 이 책을 통해 접근한다고 했을 때 가장 맘에 드는 부분은 10장 디버깅에 대한 부분이었던 것 같습니다. 내가 어떻게 이것을 시작할 수 있을지 문제에 부딛혔을 때 어떻게 해결할 수 있는지에 대해 알게 될 수 있어 맘에 들었습니다.
처음 목차를 볼 때 부터 의문이 들었던 1장과 2장은 굳이 "장"을 따로 나눌 필요가 있었나 싶습니다.
자바스크립트에 대한 개념이 전혀 없는데 갑자기 개발에 투입되게 된다면 가이드가 될 수 있는 책인 것 같습니다. 어떻게 시작해야 하는 지와 문제해결을 어떻게 해야 하는 지에 도움을 얻을 수 있는 책이었습니다.
요즘은 "구글이 대신 코딩해준다"는 말을 할 정도로 인터넷에는 유용한 프로그래밍 정보들이 가득합니다. 프로그래밍 중에 난관에 봉착하면 책보다는 인터넷에서 먼저 그 해답을 찾아보게 되고 대부분 인터넷에서 적합한 답을 찾는 경우가 많습니다.
그래서 이런 쿡북류의 책을 요즘엔 선뜻 구입하기가 망설여집니다. 인터넷에서 잘 검색하면 얻을 수 있는 내용이고, 책을 뒤적이는 것보다 검색어만 잘 입력하면 뚝딱 바로 알 수 있습니다. 게다가 공짜입니다.
그런데 자바스크립트 쿡북을 읽으면서 쿡북에 대해서 다시금 생각하게 되었습니다. 레시피를 찾아가며 읽을 수도 있지만, 원하는 레시피를 찾아보다 앞뒤로 읽게 되는 관련 레시피들과 유기적으로 구성된 챕터들을 따라가다 보면 깊이 있는 자바스크립트의 기술들을 발견하게 됩니다. 가끔 인터넷 검색으로 해결책을 찾을 때 왠지 모를 공허함을 느낄 때가 많았는데, 이것이 책과 인터넷의 차이점이 아닌가 하는 생각이 드네요.
이 책을 읽기 전에 제가 알고 싶었던 것은 자바스크립트로 객체지향 프로그래밍을 하는 올바른 방법과 HTML5 활용법이었는데요. 이 책을 통해서 약간의 깨달음(?)을 얻었던 것 같습니다. 그리고 어느 정도는 jQuery 같은 자바스크립트 라이브러리도 볼 수 있겠단 생각이 듭니다. 책 중간에 인상깊었던 구절이 있었습니다.
"사실 Dojo, Ample SDK, Prototype, jQuery와 같은 프레임워크를 사옹하면 되는데 왜 그냥 자바스크립트를 다루는 책을 봐야 하는지 의문이 들 수도 있습니다... 이 물음에 대한 대답으로는 "jQuery 같은 프레임워크 라이브러리의 능력을 최고로 이끌어내려면 그 안에서 무슨 일이 일어나는지 이해할 필요가 있기 때문"이라고 하겠습니다."
자바스크립트의 경우 특히 필요에 의해서 해답을 찾고 동작하기만 하면 이해할 필요없이 그대로 써버리는 때가 많았는데요. 이 책은 그런 동작 원리를 볼 수 있는 배경 지식을 제공해줍니다.
자바스크립트에 어느 정도 익숙한 독자를 대상으로 하고 있기 때문에 개인적으로 "자바스크립트 핵심 가이드(한빛미디어)"를 먼저 읽으시면 도움이 될 것 같습니다. 그리고 UI쪽에 관심이 있으시다면 "에릭 마이어의 CSS 노하우(인사이트)"와 같이 읽으시는 것도 좋을 것 같습니다.
번역도 매끄럽고 편집도 깔끔합니다. 자바스크립트 내공을 레벨업하고 싶은 분께 추천합니다. ^^
자바스크립트를 배우기 원하는 개발자가 있다면 추천하고 싶은 책입니다. 기초부터 실무에서 응용 가능한 내용까지 모두 다루고 있으며,자바스크립트를 사용하면서 발생할 수 있는 다양한 문제 사례와 그 헤결방법을 제시하는 구성은 학습 효과를 높이는데 도움을 줄 수 있다고 생각하기 때문입니다.
하지만 웹 프로그래밍 경험이나 지식이 부족한 상태에서 보기에는 이 책의 내용이 다소 어렵게 느껴질 만한 부분도 있는 것 같습니다. 따라서 그런 분들에게는 이 책을 추천하기가 어려울 것 같기도 합니다.
전체적으로 산만하지 않게 차분하고 깔끔한 디자인과 본문 구성이 마음에 듭니다. O"RELLIY 시리즈 책의 특징인것 같습니다.
이 책에서 설명하고 있는 내용을 잘 이해하고, 활용할 수 있다면 실무에서도 꽤 유용하게 자바스크립트를 활용할 수 있을 것이라고 믿습니다.
이 책은 자바스크립트를 이용해 개발할 때 발생하는 다양한 문제점 들에 대한 해결책들을 모아논 레시피 책입니다. (그래서 책 제목이 자바스크립트 쿡북인가요? ^^;). 그래서 자바스크립트 바이블이라기 보다는 각종 레시피(문제해결 코드)를 모아 놓은 레퍼런스 북에 가깝습니다.
이책의 장점은 다양한 팁에 대해 개요부터 제세한 설명을 따라해보며, 실제 예제를 간단하게 만들어 볼 수가 있다는 것 입니다. 덧붙여 기본적인 객체 핸들링 부터 개발 중 쉽게 접할 수 있는 문자열, RegExp, 이벤트, 폼, DOM, media, 통신, 디버깅 등 다양한 부분을 커버하고 있어 개발 도중 옆에두고 참고하기에 유용할 것 같습니다. 다만, 차근차근 지식을 쌓는 용도로는 적합해 보이지 않습니다.
마지막으로 책자체는 편집도 잘 되어 있고, 번역도 거부감 없이 무난하여 보기좋습니다. 요새 한빛에서 나오는 번역서들은 옛날과 비교해 볼때 종이 재질도 좋고, 원서 못지 않은 퀄리티를 보여주는것 같아 참 만족스럽습니다.
자바스크립트 쿡북... 왜 쿡북이라고 했을까요? 저자는 책을 주제별로 각 챕터로 구성하고 챕터는 문제와 해결방법을 나열하는 식으로 본문을 구성하였습니다. 실제로 본문 곳곳에 레시피라는 용어가 등장합니다. 레시피 2.1에서 어떤 내용을 다루고 있다 식으로 말입니다. 참고로 레시피 x.y 의 의미를 직접적으로 설명하고 있지는 않습니다만, x 챕터의 y번째 문제라는 뜻으로 해석하셔서 원하는 레시피를 찾으시면 될듯 합니다.
일반적인 요리(음식) 레시피는 사진과 지시사항만 간략하게 기술되어 있습니다. 정해진 재료를 가지고 그대로 따라하면 될 것 같지만, 원하는 요리는 쉽게 되지 않습니다. 여러가지 시도를 해보면서 사진과 동일한 결과를 내기 위해 진땀을 빼야할 것입니다. 요리 레시피를 다룬 책과 이 자바스크립트를 다룬 쿡북(!) 책의 주된 차이점은 다음과 같습니다. 이 책에는 원리에 기반한 정말 자세하고 친절한 설명이 있다는 점이 가장 큰 특징입니다.
웹프로그래밍을 하면서 접할 수 있는 다양한 상황을 문제로 정리하여 풀이하고 있습니다. 문제를 선정함에 있어서 특정 상황을 콕콕 찝어서 정리한것 같네요. 본문 곳곳에 눈에띄는 참조에서는 한 레시피에서 사용된 문법적인 요소나 메소드들에 대한 설명이 어느 레시피에 존재하는지, 같은 결과를 내더라도 다른 방법으로 해결한 어느 레시피가 있는지 언급해줍니다.
ECMAScript5에는 유용한 메소드들이 많이 추가되었습니다. 그러나 다양한 버전의 전체 웹브라우저 중에서 일부만이 이들을 완벽하게 지원합니다. 저자는 이를 위해 해당 메소드를 다른 방식으로 구현하여 지원하지 않는 다른 브라우저에서도 동일한 기능을 제공할 수 있도록 방법을 제시합니다. 공백제거나 날짜형식의 변환 등이 그 예입니다. 개인적인 경험이지만 trim 메소드는 직접 만들어서 사용한 경험도 있어서 정말 공감한 부분입니다.
개발자에게 꼭 필요한 디버깅 툴인 웹브라우저의 종류에 따른 자바스크립트의 디버깅 방법도 제시합니다. 파이어폭스의 파이어버그, IE8의 개발자 도구, 오페라의 드래곤플라이, 사파리의 개발자 도구, 구글 크롬의 개발자도구와 콘솔모드에 대하여 알려줍니다.
자바스크립트를 사용한 웹프로그래밍을 막 시작한 초급자분들에게도 적극 추천해드리고 싶습니다. 인터넷 검색 못지않은 방대한 사례가 담겨있습니다. ^^