ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [UiPath] DataTable 변수 사용시 유의사항(값 형식과 참조 형식의 이해)
    UiPath RPA/Tips 2020. 3. 8. 18:00
    반응형

    아래 첨부된 파일은 프로젝트폴더 내 read.csv를 읽어 Tbl_A 테이블변수에 출력한 뒤, Tbl_B 변수에 대입시켜 로그로 결과를 출력하는 간단한 예제입니다.

    Tip_값형식_참조형식_(기본상태).zip
    0.01MB
    예제 프로세스 전체 내용

    이제 해당 예제에 딱 한 가지 작업만 해보겠습니다. Assign 과 For Each Row 사이에 Add Data Row 액티비티를 추가하고 속성을 아래와 같이 설정해주세요.

    Tbl_A 변수에 row 추가

    ArrayRow 에는 {"3", "UiPath"}, 추가할 위치는 Tbl_A로 설정하였습니다.

    그리고 결과를 실행하시면,

    출력된 결과

    추가한 결과가 잘 나옵니다.

     

    ...

     

    혹시 이상한 점 눈치채셨나요? 로그결과를 출력하는 For Each Row 액티비티를 자세히 봐주시기 바랍니다.

    Tbl_B로 돌리는 반복문

    분명 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개의 항목만 로그로 출력하게됩니다.

    이상으로 값 형식과 참조 형식에 대해 알아보았습니다. 🤗

    반응형

    댓글

Designed by Tistory.