데이터 플로 제어
학습 목표
이 유닛을 완료하면 다음을 수행할 수 있습니다.
- 비교 연산자의 용도를 나열합니다.
- Switch 문 및 if-else 문 간의 차이점을 이해합니다.
일상에서 결정을 내려야 하는 순간은 언제든지 옵니다. 옷을 어떻게 입을까? 무엇을 먹을까? 왼쪽으로 가야 할까, 오른쪽으로 가야 할까? 코드를 작성할 때도 마찬가지입니다. 유닛 1의 2단계에서 다루었던 Teatime 의사 코드를 다시 생각해 보세요.
Boil water in a Tea Kettle Fill Kettle with Water Switch Kettle On Wait for Water to Boil
모든 것이 꽤 정확해 보입니다. 물을 끓이기 위해 주전자에 물을 채우고, 주전자를 올린 다음, 물이 끓기를 기다리는 겁니다. 하지만 주전자에 이미 물이 있었다면 어떨까요? 주전자가 꽉 찬 상태라면요? 물을 얼마나 오래 끓여야 할까요?
표현식 및 표현식 연산자
우리는 어떤 결정을 내리기 전에 비교를 하곤 합니다. 이게 저것보다 더 큰지, 동등한지 등을 생각합니다. 개발자들은 애플리케이션에서 결정을 내리기 전에 값을 비교합니다. 코드에서는 두 표현식 사이에 표현식 연산자를 배치하여 표현식을 비교합니다.
표현식은 계산 시 단일 값의 결과가 반환되는 코드조각입니다. 이 모듈의 목적을 위해 표현식은 리터럴 값(예: 12), 변수(예: numberOfTeaCups) 또는 수학 연산(예: 7 x 4)이 될 수 있습니다.
표현식 연산자는 두 값이 같은지 비교하거나 표시합니다. 비교문은 표현식 연산자로 구분된 두 개의 표현식으로 구성되며 true 또는 false의 부울 값을 생성합니다.
비교 연산자
연산자 | 설명 | 구문 | 결과 |
---|---|---|---|
< |
다음 값보다 작음 |
1 < 2 |
TRUE |
<= |
다음 값보다 작거나 같음 |
1 <= 2 3 <= 3 |
TRUE |
== |
다음 값과 같음 |
10 == 10 |
TRUE |
!= <> |
다음 값과 같지 않음 |
10 != 0 10 <> 11 |
TRUE |
> |
다음 값보다 큼 |
11 > 10 |
TRUE |
>= |
다음 값보다 크거나 같음 |
40 >=10 40 >= 40 |
TRUE |
다음 값과 같음 연산자에는 왜 두 개의 등호가 있을까요? 다음 문에서 하나의 등호를 사용한 것을 떠올려 보세요.
하나의 등호( =
)는 할당 연산자로, 값을 할당합니다. 두 개의 등호( ==
)는 비교 연산자로, 두 값을 비교하여 같은지(true) 또는 같지 않은지(false)를 결정합니다.
연산자는 알려진 값을 변수와 비교하거나 서로 다른 두 변수의 값을 비교할 때 특히 유용합니다.
Integer numberOfTeaCups = 2; numberOfTeaCups == 3; //false numberOfTeaCups == 2; //true
정수 변수와 문자열 변수의 예시를 보았는데, 비교 결과를 보유하는 부울 변수를 만들 수도 있습니다. 다음을 확인해 보세요.
Integer numberOfTeaCups = 2; Boolean result = numberOfTeaCups > 3; // 2 > 3 = false
줄 1에서는 numberOfTeaCups 변수를 2로 설정합니다.
줄 2에서는 result
라는 부울 유형의 변수를 만들고, numberOfTeaCups 변수 값을 숫자 3과 비교한 다음, 비교 결과(false)를 result
변수에 할당합니다.
비교는 특정 항목이 다른 항목과 어떻게 연관되는지를 확인하는 데 도움이 되지만, 무엇보다 조건문 내에서 결정을 내리는 데 큰 도움이 됩니다.
조건문
개발자는 조건문 내의 표현식을 사용하여 프로그램에서 평가하거나 테스트할 하나 이상의 조건을 지정하는 의사 결정 구조를 만듭니다. 내용이 다소 복잡하므로 세부적으로 살펴보겠습니다.
조건문은 두 개 이상의 옵션을 설정합니다. Flow Builder에서 기준을 만들어 본 적이 있다면 조건문을 사용해 본 것입니다. 예를 들어 "주가 캘리포니아와 같을 경우 목록 보기에 레코드를 표시한다"는 조건문입니다. "주가 캘리포니아와 같다"가 조건이고, "목록 보기에 레코드를 표시한다"는 조건이 참일 경우에만 프로그램이 수행하는 작업입니다. 이 예시에는 레코드 표시(명시) 및 레코드 비표시(암시)의 두 가지 옵션이 있습니다.
If-Else 문
Apex에서 일반적으로 사용되는 조건문은 if-else
문입니다. 이 조건문은 다음과 같이 표시됩니다.
if(condition is true) { //do this } else { //do this }
줄 1에서는 조건을 괄호 안에 정의합니다.
줄 2에서는 줄 1의 조건이 참일 경우 실행할 코드를 입력합니다.
줄 3에서는 두 번째 else 옵션을 제시합니다.
줄 4에서는 줄 1의 조건이 거짓일 경우 실행할 코드를 입력합니다.
Apex에서는 조건문을 중괄호({ }
)에 포함합니다. 각 여는 중괄호({
)는 닫는 중괄호(}
)와 함께 사용되어야 합니다. 코드 블록에 여는 중괄호만 있고 닫는 중괄호가 없을 경우 오류가 발생합니다.
Teatime 의사 코드에서 조건문을 사용하여 찻주전자의 물 높이를 확인하고 이를 기준으로 다음에 수행할 작업을 판단해 보겠습니다.
- Developer Console에서 Debug(디버그) | Open Execute Anonymous Window(익명 실행 창 열기)를 클릭합니다.
- 이 코드를 복사하여 Enter Apex Code(Apex 코드 입력) 창에 붙여 넣습니다.
String waterLevel = 'full'; /*This variable keeps track of the water level status: full or empty*/ if(waterLevel == 'empty') { System.debug('Fill the tea kettle'); waterLevel = 'full'; /*Once the tea kettle is filled the variable is changed to full*/ } else { System.debug('The tea kettle is full'); }
- Open log(로그 열기) 확인란을 선택하고 Execute(실행)를 클릭합니다. 그러면 Execution Log(실행 로그)가 열리며 코드 실행 결과가 표시됩니다.
- 창 아래에 있는 Debug Only(디버그만) 확인란을 선택합니다.
줄 1에서는 waterLevel 변수를 full
로 초기화했습니다. 일반적으로 코드의 변수 값은 코드 자체에서 지정되지 않고 사용자가 입력하거나 다른 데이터에서 파생됩니다. Teatime 예시에서는 주전자의 센서에서 물리적 데이터를 가져와 물 높이를 결정합니다. 하지만 이러한 데이터를 사용할 수 없는 경우, 개발자는 코드를 실행하고 테스트할 수 있도록 코드에서 직접(임시로) 값을 설정합니다. 이렇게 코드에 값을 설정하는 것을 하드 코딩이라고 합니다. 여기서는 테스트 목적으로 waterLevel 변수 값을 full
로 하드 코딩했습니다. 값이 이미 설정되었으므로 첫 if
문(줄 3)은 실행되지 않습니다. waterLevel이 empty
에서 시작하지 않기 때문입니다.
코드에서는 waterLevel 변수가 empty
와 동일한지 확인합니다. waterLevel을 full
로 하드코딩했기 때문에 if
문 조건은 false입니다. if
조건이 false인 경우 else
코드 블록이 실행됩니다.
현재 코드는 두 개의 옵션으로 물 높이가 full
인 경우와 물 높이가 empty
인 경우를 처리합니다. 하지만 이러한 옵션은 단지 가능성일 뿐이며, 주전자가 어느 정도만 채워져 있을 수도 있습니다. 3개 이상의 가능성을 처리하려면 어떻게 해야 할까요?
If-Else If 문
3개 이상의 가능성을 처리하려면 if-else if 문을 사용해 볼 수 있습니다. if-else if 문은 마지막 else 조건 앞에 또 다른 if 조건을 추가합니다. 실제 사용 사례를 살펴보겠습니다.
- Developer Console에서 Debug(디버그) | Open Execute Anonymous Window(익명 실행 창 열기)를 클릭합니다.
- 이 코드를 복사하여 Enter Apex Code(Apex 코드 입력) 창에 붙여 넣습니다.
String waterLevel = 'half'; if(waterLevel == 'empty') { System.debug('Fill the tea kettle'); waterLevel = 'full'; } else if(waterLevel == 'half') { System.debug('Fill the tea kettle'); waterLevel = 'full'; } else { /*This statement only runs if line 3 and line 6 result in false.*/ System.debug('The tea kettle is full'); }
- Open log(로그 열기) 확인란을 선택하고 Execute(실행)를 클릭합니다. 그러면 Execution Log(실행 로그)가 열리며 코드 실행 결과가 표시됩니다.
- 창 아래에 있는 Debug Only(디버그만) 확인란을 선택합니다.
코드를 테스트할 때 줄 1에 있는 waterLevel
변수의 값을 변경합니다. 이러한 변경 사항은 디버그 로그의 출력에 반영됩니다. half
, full
, empty
의 세 가지 값을 모두 사용해 보세요.
첫 번째 조건이 가장 일반적인 조건이 되도록 조건문을 정렬하세요. 이렇게 정렬하면 코드 블록이 실행될 때마다 실행되는 코드의 양을 줄일 수 있습니다. Teatime 예시에서 주전자는 비어 있을 가능성이 가장 높으므로 해당 조건을 먼저 설정합니다. 찻주전자가 가득 차 있을 가능성은 낮으므로 마지막으로 해당 상태를 확인합니다.
Switch 문
if-else 문의 가장 효과적인 대안은 switch 문입니다. switch 문은 값 집합을 지정하고 표현식을 테스트하여 해당 값 중 하나와 일치하는지 확인합니다. 이 조건문은 다음과 같이 표시됩니다.
switch on expression { when value1 { //code block 1 } when value2 { //code block 2 } when else { //if none of the previous values apply //code block 3 } }
switch 문에서 when
예약어 뒤에 하나 이상의 값을 배치할 수 있습니다.
switch on expression { when value1 { //single value //code block 1 } when value2, value3 { //multiple values //code block 2 } }
Teatime 의사 코드에 switch 문을 적용해 보겠습니다.
- Developer Console에서 Debug(디버그) | Open Execute Anonymous Window(익명 실행 창 열기)를 클릭합니다.
- 이 코드를 복사하여 Enter Apex Code(Apex 코드 입력) 창에 붙여 넣습니다.
String waterLevel = 'empty'; //option 1 using a single value switch on waterLevel { when 'empty' { System.debug('Fill the tea kettle'); } when 'half' { System.debug('Fill the tea kettle'); } when 'full' { System.debug('The tea kettle is full'); } when else { System.debug('Error!'); } } //option 2 using multiple values switch on waterLevel { when 'empty', 'half' { //when waterLevel is either empty or half System.debug('Fill the tea kettle'); } when 'full' { System.debug('The tea kettle is full'); } when else { System.debug('Error!'); } }
- Open log(로그 열기) 확인란을 선택하고 Execute(실행)를 클릭합니다. 그러면 Execution Log(실행 로그)가 열리며 코드 실행 결과가 표시됩니다.
- 창 아래에 있는 Debug Only(디버그만) 확인란을 선택합니다.
논리 연산자
두 개 이상의 조건을 어떻게 처리하는지 알아보았습니다. 이제 단일 조건이 둘 이상의 값으로 충족될 수 있는 경우 어떻게 해야 할까요?
논리 연산자
연산자 | OR | AND |
연산 기호 | || | && |
의사 코드 | If X or Y, do this. Otherwise, do that. |
If X and Y, do this. Otherwise, do that. |
Apex 코드 |
if(X || Y) { |
if(X && Y) { |
논리 연산자 and
및 or
를 사용하면 조건이 참인지 거짓인지를 결정하기 위해 둘 이상의 값을 확인하는 코드를 작성할 수 있습니다. and
연산자를 사용하려면 조건을 충족하기 위해 모든 값이 참이어야 합니다. or
연산자를 사용하려면 조건을 충족하기 위해 최소 하나 이상의 값이 참이어야 합니다.
논리 연산자 평가
논리 연산자 | 구문 | 설명 |
---|---|---|
&& (AND) |
X && Y |
X 및 Y는 부울 값입니다. X 및 Y가 모두 참이라면 표현식도 참입니다. 그렇지 않은 경우 표현식은 거짓입니다. |
|| (OR) |
X || Y |
X 및 Y는 부울 값입니다. X 및 Y가 모두 거짓이라면 표현식도 거짓입니다. 그렇지 않은 경우 표현식은 참입니다. |
논리 연산자를 사용해 보겠습니다. 다음은 if-else if 문으로 작성된 코드입니다.
String waterLevel = 'half'; if(waterLevel == 'empty') { System.debug('Fill the tea kettle'); waterLevel = 'full'; } else if(waterLevel == 'half') { System.debug('Fill the tea kettle'); waterLevel = 'full'; } else { //This statement only runs if line 3 and line 6 result in false. System.debug('The tea kettle is full'); }
줄 4~5와 줄 7~8을 보면 동일합니다. 이를 중복 코드라고 합니다. 이중화를 제거하면 코드가 더 읽기 쉬워지며 이해, 디버그 및 유지 관리도 쉬워지므로 이는 모범 사례입니다. 코드는 waterLevel이 empty
든 half
이든 관계없이 동일한 작업을 수행합니다. empty
및 half
를 하나의 조건에 함께 사용하여 이 코드를 단순화할 수 있습니다. or
연산자를 사용하여 empty
또는 half
값이 참일 경우 조건을 충족하도록 할 수 있습니다.
- Developer Console에서 Debug(디버그) | Open Execute Anonymous Window(익명 실행 창 열기)를 클릭합니다.
- 이 코드를 복사하여 Enter Apex Code(Apex 코드 입력) 창에 붙여 넣습니다.
String waterLevel = 'half'; if(waterLevel == 'empty' || waterLevel == 'half') { System.debug('Fill the tea kettle'); waterLevel = 'full'; } else { //This statement only runs if line 3 false. System.debug('The tea kettle is full'); }
- Open log(로그 열기) 확인란을 선택하고 Execute(실행)를 클릭합니다. 그러면 Execution Log(실행 로그)가 열리며 코드 실행 결과가 표시됩니다.
- 창 아래에 있는 Debug Only(디버그만) 확인란을 선택합니다.
한번 보세요. 코드의 이중화를 제거했습니다. 논리 연산자(&&
및 ||
)를 사용하면 효과적으로 코드의 이중화를 없애고 가독성을 개선할 수 있습니다.
코드를 깔끔하게 만들기
프로그래밍에서는 특정 작업을 수행하는 방법이 두 가지 이상인 경우가 많습니다. 예를 들어 switch 문 또는 if-else 문을 사용하여 동일한 결과를 얻을 수 있습니다. 사용할 문의 유형을 선택할 때 고려해야 할 중요한 사항은 각 문이 코드의 가독성에 미치는 영향입니다. 코드 작업을 계속하다 보면 코드를 깔끔하게 유지하는 방법을 더 많이 배울 수 있습니다. 지금은 코드를 읽고 이해하기 쉽게 만드는 데 집중하세요.