-
[UiPath] DataTable 변수 사용시 유의사항(값 형식과 참조 형식의 이해)UiPath RPA/Tips 2020. 3. 8. 18:00반응형
아래 첨부된 파일은 프로젝트폴더 내 read.csv를 읽어 Tbl_A 테이블변수에 출력한 뒤, Tbl_B 변수에 대입시켜 로그로 결과를 출력하는 간단한 예제입니다.
이제 해당 예제에 딱 한 가지 작업만 해보겠습니다. Assign 과 For Each Row 사이에 Add Data Row 액티비티를 추가하고 속성을 아래와 같이 설정해주세요.
ArrayRow 에는 {"3", "UiPath"}, 추가할 위치는 Tbl_A로 설정하였습니다.
그리고 결과를 실행하시면,
추가한 결과가 잘 나옵니다.
...
혹시 이상한 점 눈치채셨나요? 로그결과를 출력하는 For Each Row 액티비티를 자세히 봐주시기 바랍니다.
분명 Add Data Row로 값을 추가하는 변수는 Tbl_A 였습니다. 그런데 Tbl_B에도 추가가 되었습니다. 어떻게 이런일이 생긴걸까요? 버그일까요?
애석(?)하게도 이는 버그도, UiPath가 여러분들을 엿(?)먹이려고 하는것도 아닌 .NET의 특성입니다. .NET에선 Assign 액티비티와 같은 대입 연산을 수행할때 변수의 '값'를 복사하는 '값 복사(=깊은복사, deepcopy)'와 변수의 '주소'를 복사하는 '참조복사(=얕은 복사, shallow copy)'라는 두 가지 개념이 존재합니다. 깊은복사와 얕은복사 설명만으론 이 둘의 개념이 어려우니 예시를 들어보겠습니다.
'서울특별시 도봉구 쌍문동 산240-5'에 2층집을 보유한 고길동씨의 집을 변수라고 가정해보겠습니다. 이 집을 복사(?)한다고 했을 때, 값 형식이라면 '서울 도봉구 시루봉로1길 6' 이란 주소를 가진 2층집이 한 개 더 생기게 됩니다. (개꿀?!)
그런데 참조 복사를 한다고하면, '서울특별시 도봉구 쌍문동 산240-5'이란 주소외 '서울 도봉구 시루봉로1길 6' 이란 주소가 한 개 더 생길 뿐입니다. 즉, 집은 1개 지만, 집주소가 2개가 되는 것입니다.
예시의 Tbl_A, Tbl_B 변수명이 집주소이고, 실체하는 집은 저장된 컴퓨터 메모리 어딘가에 저장된 값입니다.
이 처럼 대입시 값 자체가 복사되는 변수를 값 형식 변수, 값은 1개지만 여러 주소가 생기는 변수를 참조 형식 변수라고 합니다. 값 형식과 참조 형식은 사용자가 따로 설정하는것이 아닌 .NET을 개발한 Microsoft에서 아래와 같이 지정해놓았습니다.
값 형식 단일형식이 주로 값 형식입니다. 정수형(byte, short, int, long) 및 실수형(float, double, decimal), bool, char 등이 여기 포함됩니다. 참조 형식 배열이나 복합적인 형식이 주로 참조 형식입니다. string(char의 배열), ArrayList, DataTable, List 등 DataTable 도 참조형식이므로, Assign 액티비티가 수행한 Tbl_B = Tbl_A 대입연산은 실제 Tbl_A가 가진 테이블 값을 Tbl_B에 복사한게 아니라, Tbl_A가 가진 값이 Tbl_B라는 주소도 가질 수 있도록 설정한 것일 뿐입니다. 따라서 Tbl_A 변수와 Tbl_B 변수는 1개의 값을 가리키고 있으며, 1개의 Table 값에 row를 추가한 것이기 때문에 영향이 없을 것 같은 Tbl_B 변수도 row가 1개 더 추가된 것처럼 보이게 된 것입니다.
이와 같은 이슈는 인수(Arguments)로 전달하거나 받을때도 발생할 수 있으므로, 대입연산시 주의가 필요합니다.
다행스럽게도, DataTable 변수는 위와 같은 문제를 해결할 수 있는 함수가 존재합니다. Assign 액티비티를 아래와 같이 수정하세요.
실행하면 Tbl_B는 다시 2개의 항목만 로그로 출력하게됩니다.
이상으로 값 형식과 참조 형식에 대해 알아보았습니다. 🤗
반응형'UiPath RPA > Tips' 카테고리의 다른 글
[UiPath] 관리자 권한(Administrator)이 필요한 프로그램을 조작할때 해야할 사항 (0) 2021.01.01 [UiPath] Email 본문에 Image를 추가하기 (Base64방식) (0) 2020.04.18 [UiPath] Invoke Code, 'A'에 대한 참조가 없거나, 'A'어셈블리에 'B'형식이 없습니다. 오류시 시도할 방법 (0) 2020.02.15 [UiPath] 몇 번째 주차인지 구하기 (n주차 구하기) (2) 2020.02.03 [UiPath] 한글 문서 aahook.dll 오류 원인 및 대체 해결방안 (0) 2020.01.18