흐름 제어(control flow)를 알기 전에 워크플로우에 대해 간략히 알고 가자.
UIPath에서 제공하는 workflow는 Sequence, Flowchart, State Machine, Global Exception 타입이 있다.
이 중 이번에는 Sequence와 Flowchart를 중점으로 생각해보자.
흐름 제어문이 수행하는 주요한 동작은 조건 제시, 반복, 병렬처리이다.
if문은 아래와 같이 동작한다.
if문의 개념을 사용한 액티비티는 두 가지가 있다. If
와 Flow Decision
이다. If
는 Sequnece 워크플로우에서 데이터의 값으로 조건과 비교하고, Flow Decision
은 Flowchrat 워크플로우에서 프로세스 자체를 조건과 비교한다.(사용되는 워크플로우가 다름)
If
액티비티와 더불어 Else If
액티비티도 있다. 조건에 부합하지 않을 떄(False일 떄) 수행할 동작을 여러 개 명시하기 위해서이다. (Else If
하나로 세 개 이상의 분기처리 가능, 아래 이미지 참고)
분기처리를 하는 또 다른 방법은 VB 문법을 사용하는 것이다.
if(조건, True일 때 값, False일 때 값)
'여러 조건 제시
if(조건1, True일 떄 값, if(조건2, 조건1 Fase & 조건2 True일 떄 값, 조건1 Fase & 조건2 False일 떄 값))
반복문은 코딩을 배울 때 분기문과 더불어 중요하게 배우는 것이다. UIPath에서는 아래와 같이 반복문을 구현해 놓은 액티비티가 있다.
Do While과 While의 차이점은 첫 번째 실행 시 조건을 비교하냐 마냐 차이이다. Do While은 첫 번쨰 반복에는 조건 비교 없이 동작한다.
반복도 중요하지만 원하는 때에 반복을 중단하는 것도 중요하다. 반복을 중단하는 방법은 아래와 같다.
1. (Do) While : 조건에 부합하지 않으면 반복 중단
2. For Each : collection 안에 있는 모든 인자를 다 꺼냈을 때 반복 중단
3. Break 액티비티 : 위에 명시한 세 가지 반복문에서 Break
액티비티를 사용해서 중단 조건을 줄 수 있음
Do while을 실습해보자. 사용자에게 년도를 입력받아 그 년도가 윤년인지 아닌지 판단하는 문제에이다.
위에서 보면 Do While
의 조건을 "not IsLeapYear로 줬다. 왜냐하면 Do While
은 조건에 부합하는 한 계속 반복되는데, 만약 사용자가 윤년이 아닌 값을 넣으면 계속 실행해야 하기 때문에 not이 붙은 것이다.
어떤 값을 기준으로 분기처리가 필요할 때 사용하는 제어문이다. 기본 컨셉은 if문이 세 개 이상 결합된 형태이다. 예를 들면 아래와 같다.
[ switch 예시 ]
사용자에게 입력을 받는데, 그 입력값이 "A", "B", "C", "D"일 때 각각 처리하는 동작을 달리 하라
SQL의 CASE문과 같다.
if문과 다른 점은 조건으로 받는 표현식이 Boolean 타입이 아니라 String이나 Numeric 값을 받는다. UIPath에서는 예외적으로 String을 받을 떄 쌍따옴표(")를 쓰지 않고 변수처럼 써준다.
Parallel
액티비티는 지정한 하위 동작(=child activities)들을 동시에 처리할 수 있게 해준다. Parallel 하위에 지정된 동작들이 모두 완료 되거나 '완료 조건'이 True일 때 동작을 중지한다.
하위 동작들을 동시에 수행하기 때문에 효율적이다.
병렬처리를 하는 또 다른 액티비티로는 Pick이 있다. Pick에 대한 설명은 아래 링크를 참고하자.
https://jnaul.tistory.com/269
parallel 아래에는 child activity가 하나의 레벨 밖에 지정할 수 없다.(액티비티를 여러 개 쌓을 수 없고 한 개만 들어갈 수 있음) 그래서 여러 개의 액티비티를 넣어야 할 때에는 아래와 같이 sequence를 넣고 액티비티를 쌓을 수 있다.
이번 실습 과제에서 수행할 내용은 아래와 같다.
- 각 엘리먼트가 Int32로 된 array를 하나 선언한다.
- for each를 돌면서 최대값, 최소값을 찾아 출력한다.
이번 실습 과제에서 수행할 내용은 아래와 같다.
- 문자열 array 선언 {"Ax001","Ax002","Ax003","Ax004","Ax005","Bx001","Bx002","Bx003","Cx001","Cx002","Cx003","Cx004"}
- 각 원소 별로 앞에 두 글자 분리 → "Ax", "Bx", "Cx"
- 각 분리한 글자를 각각 array에 저장
for each
for each를 돌며 각 엘리먼트에 접근한다.
switch
for each문 하위에 swtich가 위치하는데 아래와 같다.
조건은 엘리먼트에서 인덱싱하는 String.Substring 함수를 썼다.
Case문에는 저장할 값을 Array.Concat 함수를 썼는데, 이 때 인자를 넣는 방법이 신기하다. 대괄호({ })를 써주는 것이다. 왜냐하면 concat하려면 array 형태가 되어야 하기 때문이다.
출력
결과 출력을 위해서 String.Join 함수를 썼다.(파이썬의 join과 동일한 동작)
선언한 변수는 아래와 같다. AxArray, BxArray, CxArray의 초기값을 각각 "Ax", "Bx", "Cx"로 선언했는데, concat할 때 원소가 없으면 에러가 발생하기 때문이다.