Lua Table 복사에 대한 처리

Lua에서 테이블을 다른 변수에 대입(=)하게 되면 기본적으로는 참조 값 변경이 발생합니다.
즉, 참조 값이 생성되는 것이기 때문에 한 테이블에서의 변경이 다른 테이블의 값에 영향을 끼치게 됩니다.
TestTable = {
	t1 = {
		a = 10,
		b = 20,
	}
}
TestTable 을 변수에 할당하는 경우 변수의 참조값이 테이블로 지정되기 때문에 값이 변경되면
테이블 자체의 값이 변경되기 때문에 같은 참조값을 가지는 모든 객체들이 영향을 받습니다.
test1 = TestTable
test2 = TestTable

print("Source A:" .. TestTable.t1.a)

test1.t1.a = 20

print("Test1 A:" .. test1.t1.a)
print("Test2 A:" .. test2.t1.a)
Source A:10
Test1 A:20
Test2 A:20

참조 테이블의 값이 변경되었기 때문에 해당 테이블을 참조하고 있는 test2의 값도 변경되었습니다.

원하는 것은 테이블의 값복사.
Lua에서 기본적으로 제공되는 다른 방법이 있는지는 모르겠지만..
일단 쉽게 검색하고 적용시킨것은 정말로 테이블을 복사하는 방법.
직접 찾은건 아니고, stackoverflow 검색에서 나온 방법을 조금 변경한것입니다
function TableCopy(t)
  local t2 = {}
  for k,v in pairs(t) do
	if type(v) == "table" then
		t2[k] = TableCopy(v)
	else
		t2[k] = v
	end
  end
  return t2
end
함수 이름은 어찌되었든.. 내부적으로 테이블을 생성해서 값을 복사하여 새로 생성한 테이블을 반환합니다
값이 table인 경우에 대한 처리도 있으니 테이블이 깊이가 있는 경우도 처리하고 있습니다.
test1 = TableCopy(TestTable)
test2 = TableCopy(TestTable)

print("Source A:" .. TestTable.t1.a)

test1.t1.a = 20

print("Test1 A:" .. test1.t1.a)
print("Test2 A:" .. test2.t1.a)
같은 로직을 TableCopy를 이용해서 작성하면 test2에 영향없이 test1의 값에만 변경이 있음을 확인할 수 있습니다.
Source A:10
Test1 A:20
Test2 A:10

stackoverflow의 문서에는 여러가지 방법이 나와있고, 그중 하나의 방법을 적용해서
간단한게 원하는 결과가 나오는지를 테스트한 거라 의도치 않게 문제가 있는 로직일 수있습니다.
혹시 문제가 있는 부분에 대해서는 언제든 의견을 남겨주세요. 

'프로그래밍' 카테고리의 다른 글

Office Add-in 만들기.  (0) 2012.02.08
Lua 테이블 내용 출력하기  (0) 2012.01.28
Cafe24 가상 호스팅 - 1(선택)  (0) 2011.12.02
Lua의 주석처리  (0) 2011.11.27
[ERROR] Could not find Git Path  (0) 2011.04.18