업무에 사용하는 Go 언어 5 – 흐름제어 if, switch, for

Go 언어에서 흐름을 제어하는 법을 익혀봅시다.
보통 흐름제어라고 하면 프로그램(혹은 코드)의 진행 흐름을 제어한다고 이해합니다.
if문이나 switch문으로 코드의 진행을 나누거나, for문을 통해 코드의 진행을 반복할 수 있습니다.

업무에 사용하는 Go 언어 썸네일

흐름제어의 중요성

실제 업무에 있어서 흐름제어는 가장 중요하다고 해도 과언이 아닐 것이다.
흐름제어를 하는 방식은 효율성과 가독성에 분명히 영향을 미친다.
협업의 상황에서 주석이 없어도 동료가 나의 코드를 이해할 수 있어야 한다고 생각한다.

프로젝트 진행

프로젝트에 flow_controls.go 파일을 만들어서 진행합니다.

Go 언어 if

조건문이라고 불리는 if는 참 혹은 거짓으로 코드의 흐름을 나눕니다.
어떤 상황에 어떤 작업을 할 것인가에 집중하면 된다는 의미입니다.
앞에서 우리가 알아보았던 연산자 중 비교 연산자논리 연산자를 사용하여 조건을 만들 수 있습니다.
if 문의 기본 형식은 다음과 같습니다.

Go
if 조건 {
   // 어떠한 작업
}

다음과 같이 if를 사용하여 흐름을 제어해봅시다.

if 예시

두 변수를 비교하여 x가 y보다 큰 값인지 확인하는 if를 작성해보았습니다.
조건을 x < y로 변경하면 어떻게 될까요? 직접 경험해보세요.

변경해보셨다면 실행 결과에 아무것도 출력 되지 않는 것을 확인했을 겁니다.
그렇다면 우리가 작성한 조건에 해당하지 않을 경우에 대하여 처리해주어야 한다는 의미이겠죠?
이럴 때 else를 사용하여 다음과 같이 흐름을 제어해봅시다.

if - else 예시

if의 조건에 해당하지 않기 때문에 else에 해당하는 작업이 진행되어 x가 y보다 크다고 출력 되었습니다.
if else 문을 사용할 때 주의해야 할 점이 있습니다.
아래와 같이 사용하면 오류가 발생하므로 꼭 else를 사용할 때에는 줄바꿈을 하지 않도록 합니다.

Go
if 조건 {
  ...
} // 여기서 에러가 발생합니다.
else {
  ...
}

이제 우리가 작성한 코드에서 x와 y를 같은 값으로 변경해봅시다.
실행 결과를 확인해보면 상당히 잘못됐음을 확인할 수 있습니다.

else 문제점 예시

x와 y의 값이 실제로는 같은데 출력은 x가 y보다 크다는 것으로 나왔습니다.
else if를 사용하여 if와 else의 경계에 존재하는 다른 흐름을 제어해보도록 합시다.

else if 예시

위와 같이 x와 y가 같은 경우에 대해 제어를 할 수 있습니다.
예시의 코드를 다음과 같이 중첩 if문으로 코드를 작성할 수도 있습니다.

example 7

중첩된 if문을 코드와 기존의 코드 중 어떤 코드가 가독성이 좋은지, 어떤 코드가 작업 속도가 더 빠른지 고민해봅시다.

약간의 여담

이번에 예시를 살펴보면서 x와 y가 같은 경우에 대해 오류를 발견할 수 있었다.
이런 문제를 경계값 문제 혹은 이런 문제를 찾는 방법을 경계값 분석이라고 한다.
예시의 경우 워낙 간단한 문제이기 때문에 간단하고 쉽게 느껴질 수 있지만,
생각보다 실무에서 이러한 문제는 많이 발생한다.
보통 문제는 간단하다고 생각하면 발생하는 것 같다.

웹 서버로 간단하게 예를 들면 계정이 관리자인 경우와 일반 회원인 경우의 흐름으로 나누었을 때,
계정이 일반 회원도 아니고 관리자도 아니면 오류가 발생할 것이다.

Go 언어 switch

if 문은 참 혹은 거짓으로 코드 블럭을 실행할 것이냐 아니냐를 결정했다면,
switch 문은 여러 코드 블럭 중 실행할 코드 블럭을 선택하게 되는 것입니다.

switch 문의 기본 문법은 다음과 같습니다.

Go
switch expression {
case x:
   // code block
case y:
   // code block
case z:
...
default:
   // code block
}

expression의 값에 의하여 어떤 case의 코드 블럭을 실행할 것이냐는 의미입니다.
만약, 어떠한 case에도 해당하지 않는다면 default에 해당하는 코드 블럭을 실행하게 됩니다.
주의할 점 case의 값은 모두 같은 타입을 가져야 합니다.

코드 예시

switch case default 예시

약간의 여담

필자의 경우 switch case를 정말 확실하게 case가 많이 나누어지지 않는 이상 잘 사용하지 않는다.
하나의 값에 의해 흐름이 많이 나누어지지 않는다면 if 문으로 간단하게 코드를 적는 것이 좋다고 생각한다.

만약, 여러 case에 대해 같은 작업을 하게 된다면 다음과 같이 작성해도 됩니다.

Go
switch expression {
case x,y:
   // code block if expression is evaluated to x or y
case v,w:
   // code block if expression is evaluated to v or w
case z:
...
default:
   // code block if expression is not found in any cases
}

Go 언어 for

for 문은 코드를 특정 횟수 동안 반복하기 위해 사용합니다.
Go 언어에는 반복을 위해 사용할 수 있는 키워드는 for만 존재합니다.

for 문의 기본 문법과 의미는 다음과 같습니다.

Go
for statement1; statement2; statement3 {
   // code to be executed for each iteration
}
  • statement1
    • 카운터 값을 초기화하는 구문입니다.
  • statement2
    • 각 반복을 수행할 것인지 결정하는 조건문입니다.
  • statement3
    • 카운터 값을 증가(혹은 감소)시키는 구문입니다.

다른 언어처럼 continue, break 키워드 또한 지원합니다.

for 문 통합 예시

i가 0부터 시작하여 5보다 작은 동안 계속 반복하여 출력하는 반복문입니다.
continue와 break 문을 통해 여러 상황을 구현할 수 있습니다.
직접 코딩해보면서 경험해보도록 합시다.

for range

파이썬처럼 다음과 같이 range를 통해 array, slice, map의 요소를 쉽게 반복하며 사용할 수 있습니다.

Go
for index, value := range array|slice|map {
   // code to be executed for each iteration
}

아직 array, slice, map에 대해 잘 모르겠다면 넘어가도 좋습니다.
아래의 코드를 복사하여 직접 실행해보세요.

Go
package main
import ("fmt")

func main() {
  fruits := [3]string{"apple", "orange", "banana"}
  for idx, val := range fruits {
     fmt.Printf("%v\t%v\n", idx, val)
  }
}
for range 예시

이번 글에서 Go 언어를 코드의 흐름을 제어하는 방법을 다루었습니다.
앞으로의 내용에서는 반복 가능한 데이터인 array, slice, map에 대해 다루도록 하겠습니다.