[Javascript] 반복문과 Array.pop() , shift() 시 주의점

Javascript로 만드는 간단한 프로그램 작성중에 당혹스럽게 만들었던 부분이 있어 공유합니다.

Java에서 사용할때는 전혀 생각지도 않았던 것이 문제가 발생되네요..

지금 생각해보면 Java에서는 ConcurrentModificationException이 발생되었었네요.

일단 아래의 코드를 보겠습니다.

    function test() {
        var array = ["1", "2", "3", "4", "5"];
        console.log("===========Index를 활용한 반복문==========")
        for(var i=0; i<array.length; i++) {
            console.log(array[i]);
        }


        console.log("===========Array.pop() 을 사용한 반복분============");
        array = ["1", "2", "3", "4", "5"];
        for(var i=0; i<array.length; i++) {
            console.log(array.pop());
        }

        console.log("==========선언부분에 길이 설정=============");
        array = ["1", "2", "3", "4", "5"];
        for(var i= 0, len=array.length; i<len; i++) {
            console.log(array.pop());
        }


        console.log("===========Enhanced For 반복문에 Array.pop() 사용=============");
        array = ["1", "2", "3", "4", "5"];
        for(var i in array) {
            console.log(array.pop());
        }
        console.log("==========================================")
    }

코드는 설명 부분이 필요 없을 정도로 간단합니다.

단지 차이가 있다면 선언부에 길이를 설정하는가 아니면 Java에서 말하는 Enhanced for를 사용해서 처리하느냐의 문제 입니다.

위의 코드를 실행하면 아래와 같은 결과를 얻습니다.

"===========Index를 활용한 반복문=========="
"1"
"2"
"3"
"4"
"5"
"===========Array.pop() 을 사용한 반복분============"
"5"
"4"
"3"
"==========선언부분에 길이 설정============="
"5"
"4"
"3"
"2"
"1"
"===========Enhanced For 반복문에 Array.pop() 사용============="
"5"
"4"
"3"
"=========================================="

정리하면 pop() 이나 shift() 를 사용하게 되면 배열에서 해당 정보가 빠지기 때문에 원하는 만큼 반복문이 실행되지 않습니다.

[Chrome App] TCP 소켓 연결 블럭

HTML5 기반의 Chrome APP 을 만들려고 하는데 실시간으로 데이터를 주고 받아야 하는 이슈가 있어
Chrome API 에 나와 있는 Network Communication 내용과 Chrome App Sample 의 Telnet 예제를 보고 테스트중…

TcpClient.prototype._onCreate = function(createInfo) {
	this.socketId = createInfo.socketId;
	if (this.socketId > 0) {
		socket.connect(this.socketId, this.host, this.port, this._onConnectComplete.bind(this));
		this.isConnected = true;
	} else {
		error('Unable to create socket');
	}

};

위의 내용중 socket.connect 함수 부분에 BLOCK이 되고 더 이상 진행이 안되는 문제가 발생됨.

예제 소스

var host = document.getElementById('host').value;
var port = parseInt(document.getElementById('port').value, 10);
connect(host, port);

테스트 소스

var host = document.getElementById('host').value;
var port = document.getElementById('port').value;
connect(host, realPort);

소스의 차이는 보면 알 수 있지만 connect 라는 함수의 인자는 Host(String), Port(Integer) 를 넘겨줘야 하는데
테스트 소스는 Port(String) 타입으로 전달해서 문제가 발생된 내용이다.
Javascript의 type 이 없는 부분에 대한 어려움을 이번에 깨달음.