May 30th, 2011 By admin Categories: Programming

클로저는 자신의 범위(Scope) 밖에 있는 변수들에 접근할 수 있는 함수를 의미합니다. 보통 자바스크립트내에서는 함수의 생명주기는 끝이났지만 함수내의 변수를 내부함수가 참조하고 있기 때문에 유지되어 접근할수 있는 함수를 클로저라고 합니다. 말이 매우 어렵습니다. 코드로 보도록 하겠습니다.

function testFn(){
	var closureStr/*String*/ = 'is Closure';
	var privateStr/*String*/ = 'this';
	return function( privateStr ){
		alert( privateStr + ' ' + closurStr );
	}
}

var fn/*function*/ = testFn();
fn( 'function' );
//output : function is Closure

testFn은 함수 입니다. 함수내의 closureStr, privateStr은 함수가 실행될때만 사용되는 변수 입니다. 즉, 함수 scope에서만 참조되는 변수이지만 경우에 따라 클로저( Closure )에 의해서 참조가 가능해집니다.

함수가 실행되면 함수내의 closureStr은 메모리에 넣고 참조하게 되며 함수가 종료되면 참조가 없어지면 자동으로 GC( 가비지컬렉션)가 메모리에서 지우게 됩니다. 하지만 closureStr를 어디선가 참조하고 있다면 GC가 해지를 할수가 없습니다. 다른곳에서 참조가 발생할때 바로 클로저가 생성되면서 클로저를 통해서 해당 변수를 참조하게 됩니다. 위 함수는 클러져가 발생했고 GC로는 해지 되지 않습니다. 그래서 강제로 해지 시켜줘야 합니다. 방법은 이렇습니다.

var fn = outerFn();
fn( 'do something');
fn = null;

null를 통해서 클로저를 통한 참조를 해지 시키면 GC에 의해서 메모리에서 반환되게 됩니다.
클로저 그런데 어디에 사용되는지는….. 실무에 사용하게 되면 바로 올리도록 하겠씁니다.

VN:F [1.9.8_1114]
Rating: 1.0/5 (1 vote cast)
VN:F [1.9.8_1114]
Rating: 0 (from 0 votes)
May 23rd, 2011 By admin Categories: Programming

ISO와 OSI
ISO(International Organization for Standardization)
- 1947년에 설립된 국제 표준을 제정하는 다국적 기관
- 컴퓨터간의 통신기능을 7계층으로 구분하여 각 계층마다 표준화된 서비스와 프로토콜을 규정

OSI(Open System Interconnection)
- 컴퓨터 간의 통신 시 네트워크 구조에 상관없이 통신을 할 수 있도록 국제 표준인 OSI(개방 시스템 상호연결) 모델을 제안
- OSI 모델의 목적은 기본적인 하드웨어와 소프트웨어의 논리적인 변경 없이 시스템간의 통신을 개방하는 것
- 각각 특정 기능을 수행하는 7개의 서로 다른 계층으로 물리(1계층), 데이터 링크(2계층), 네트워크(3계층), 전송(4계층), 세션(5계층), 표현(6계층), 응용(7계층)으로 구성

계층의 구성
헤더
- 각 계층의 헤더에는 각 계층의 기능과 관련된 정보가 포함됨
- 송신측은 헤더를 생성하여 추가하고, 수신측의 해당 계층이 헤더 사용

데이터 단위
- 데이터를 전송하기 위해서 데이터에 헤더와 트레일러를 붙여 전송하는 데이터를 전송하는 기본 단위
- 상위 계층에서 전송을 원하는 데이터인 SDU(Service Data Unit)에 제어 정보인 PCI(Protocol Control Information)을 추가한 것
- 제어 정보에는 흐름 제어 정보, 에러 제어 정보, 주소 정보 등이 포함
- 서비스 데이터 단위(SDU) : 상위 계층 혹은 하위 계층 사이에 주고받는 것
- 프로토콜 데이터 단위(PDU) : 같은 계층 사이에서 주고받는 것

VN:F [1.9.8_1114]
Rating: 0.0/5 (0 votes cast)
VN:F [1.9.8_1114]
Rating: 0 (from 0 votes)
May 23rd, 2011 By admin Categories: Programming

Dollar 객체같이 객체를 값처럼 쓸 수 있는데 이런것을 값 객체 패턴( value object pattern ) 이라고 합니다. 값 객체는 하나의 인스턴스 변수가 생성자를 통해서 설정이 된 후에는 변하지 않는다. 보통 하나의 객체의 값을 설정하고 다른 객체에 값을 설정했을때 기존의 값이 변경되는 경우가 있는데 값객체를 사용하게 되면 이런 문제를 걱정할 필요가 없습니다. 10이라는 값이 있다면 그값은 영원히 10을 보장 받습니다. 다른 값을 원한다면 새로운 객체를 만들어야 됩니다. 값객체는 equals() 를 구현해야 합니다.

public function equals( $obj: Object ): Boolean{
	var result: Boolean;
	var dollar: Dollar = Dollar( Object );
	if( _amount == dollar._amount ){
		result = true;
	}else{
		result = false;
	}
	return result;
}

Dollar와 Dollar를 직접 비교 할 수 있게 되었습니다. 사실 책을 읽으면서 이해가 조금 안되는 부분이 있습니다. 액션스크립트로는 이런 경우(?) 해보지 않았기 때문에 몇번을 읽어봤는데도 정리가 잘 되지 않네요. 뒷부분을 읽어가면서 정리가 되면 다시 올리겠습니다. 각 장별로 포스팅을 하도록 하겠습니다.

VN:F [1.9.8_1114]
Rating: 0.0/5 (0 votes cast)
VN:F [1.9.8_1114]
Rating: 0 (from 0 votes)
May 16th, 2011 By admin Categories: Programming

타락한 객체(?) 부분입니다. 1에서는 이 부분까지 진행했습니다.

package{
	public class Dollar{
		public var _amount: int;
		public function Dollar( $amount: int ){
			_amount = $amount;
		}
		public function times( $multiplier: int ): void{
			//_amount = _amount*$multiplier;
			_amount *= $multiplier;
		}
	}
}
// main TestCode
var five: Dollar = new Dollar(5);
five.times(2);
if( 10 === five._amount ) trace( 'success' );

메인 테스트 코드에서는 통과합니다. 하지만 하나를 더 추가해봅시다.

var five: Dollar = new Dollar(5);
five.times(2);
if( 10 === five._amount ) trace( 'success' );
five.times(3);
if( 15 === five._amount ) trace( 'success' );

추가한 테스트는 통과하지 못합니다. 다 아시겠지만 _amount가 5가 아니기 때문이죠. 그래서 30으로 됩니다.
빠르게 통과하는 코드를 작성해야 합니다. 어찌하면 될가요?

_amount를 5로 유지하기 위해서 이렇게 한번 해봅시다.

var five: Dollar = new Dollar(5);
var product: Dollar = five.times(2);
if( 10 === product._amount ) trace( 'success' );
product = five.times(3);
if( 15 === product._amount ) trace( 'success' );

이렇게 하면 5달러객체는 변함없이 5입니다. times로 인하여 새로운 Dollar값을 받게 하면 됩니다. 이젠 클래스를 수정하여 봅시다. 가장 빨리 메인 코드가 에러나지 않으려면 바로 이렇게 합니다.

public function times( $multiplier: int ): Dollar{
	_amount *= $multiplier;
	return null;
}

황당하신가요? 기억합시다. 가장 빨리 녹색을 보는게 목표입니다. 이젠 제대로 된 코드로 바꿉시다. 처음에 5를 입력해준 Dollar를 multiplier를 곱해서 times에서 새로운 객체를 반환해주면 됩니다. 다음과 같이 됩니다.

public function times( $multiplier: int ): Dollar{
	return new Dollar( _amount *  $multiplier );
}

최대한 빨리 성공을 얻기 위해서 켄트 벡은 두 가지 전략이 있다고 합니다.

1. 가짜로 구현하기 : 상수를 반환하게 만들고 진짜 코드를 얻을 때까지 단계적으로 상수를 변수로 바꾸어 간다.
2. 명백한 구현 사용하기 : 실제 구현을 입력한다.

실제 TDD는 두가지 방법을 번갈아 가며 합니다. 다음은 3장에 나온 내용을 해보겠습니다.

VN:F [1.9.8_1114]
Rating: 0.0/5 (0 votes cast)
VN:F [1.9.8_1114]
Rating: 0 (from 0 votes)
May 16th, 2011 By admin Categories: ActionScript3.0

“[3,[4,5[6,7]]]” 이런 형태의 문자열이 있습니다. 이 문자열을 배열로 변환 하는 일을 하려고 합니다. 나름 문자열에 대한 이해는 있다고 생각 하고 바로 다음과 같은 함수를 하나 만들었습니다. 콤마 단위로 분리한후 문자열 처음에 ‘['이라면 새 배열을 만들 아니면 현재 배열에 넣고 하는 방식으로 만들었습니다. 쓰다보니 오류가 바로 나오네요. 동일레벨, 앞에 공백은 통과 못하겠네요. 왜 만들면서는 생각을 못했는지..

function parser( $str ){
	var i, j, result, arr, temp;
	arr = $str.split( ',' );

	for( i = 0, j = arr.length ; i < j ; ++i ){
		if( arr[i].indexOf( ‘[' ) === -1 ){
			if( result[ result.length - 1 ] ){
				result[ result.length ] = arr[i];
			}else{
				result[ result.length ][result[ result.length ].length] = arr[i];
			}
		}else{
			if( result ){
				temp = [];
				temp[temp.length] = arr[i].replace( ‘[', '' );
				result[ result.length ] = temp;

			}else{
				result = [];
				result[ result.length ] = arr[i].replace( ‘[', '' );
			}
		}
	}

	return result;
}

배열로 반환하는데 성공 했습니다. 하지만 "[3,4,['[]‘,5],6]” 이런식의 문자열은 바른 배열로 반환하지 못합니다. 실제 값을 보고 기본을 무시하고 코딩한 결과입니다. 몇 시간동안 다른 케이스를 만들어 통과 시키고 하다가 결국 완성하지 못했습니다. 10번을 넘게 함수를 고쳐보기도 하고 다시 곰곰히 생각해봐도 결국 기본을 무시하면 해결이 안되더군요. ‘,’ 기준으로 분리하여 문자열의 처음값이 ‘['이면 배열을 선언하고 아니면 선언된 배열에 값을 넣는것은 틀리지 않았지만 동등 레벨일 경우, 문자열 값일때'[]‘ 에 대한 처리를 못한것이 였습니다. 하나의 문제를 해결하면 계속 해서 다른 문제가 나오고 해서 계속해서 if문이 늘어나고 아니다 싶어서 다시 …. 이 일이 반복…..
결국 해결하지 못하고 도움을 받았습니다. 기본적인 사용될 값에 대한 유효성 검사부터 시작해서, 세션 개념으로 처리된 코딩을 보고 나니 바로 해결할수 있었습니다.

function toArray( $str ){
	var i, j, k, l, str, arr, prevArr, currArr, checkStr;

	str = $str.substring( 1, $str.length - 1 );
	arr = str.split( ',' );
	prevArr = [];
	currArr = [];

	for( i = 0, j = arr.length ; i < j ; ++i ){
		k = 0;
		checkStr = trim( arr[i] );

		if( checkStr ){
			while( checkStr.charAt(0) === '[' ){
				checkStr = checkStr.substr( 1 );
				currArr[currArr.length] = [];
				prevArr[prevArr.length] = currArr;
				currArr = currArr[currArr.length - 1];
			}
			while( checkStr.substring( checkStr.length - 1 ) === ']' ){
				checkStr = trim( checkStr.substr( 0, checkStr.length - 1 ) );
				++k;
			}
		}
		currArr[currArr.length] = checkStr;

		for( l = 0 ; l < k ; ++l ){
			if( prevArr.length ){
				currArr = prevArr.pop();
			}
		}
	}
	return currArr;
}

코드에 대한 해석은 하지 않겠습니다. 자바스크립트로 코딩한것이긴 하지만 플래시로 테스트 하실수 있습니다. trim함수는 문자열의 앞뒤 공백을 제거하는 것입니다. 유효한 데이터인지 확인후 그 데이터를 가지고 알고리즘에 적용한다는 원칙은 잊지 말아야겠습니다.

VN:F [1.9.8_1114]
Rating: 0.0/5 (0 votes cast)
VN:F [1.9.8_1114]
Rating: 0 (from 0 votes)