제어문 (Control Flow Statements)
제어문이란 프로그램의 흐름을 제어하는 경우에 사용하는 실행문입니다. 프로그래밍에 익숙한 분들이나 지식이 있는 분들은 바로 알 수 있는 if for 와 같은 키워드가 바로 제어문입니다.
오늘은 Go 언어에서 지원하는 조건문과 반복문에 대해 알아보겠습니다.
조건문
if Keyword
if 문은 바로 뒤에 나오는 조건이 true 일 경우 중괄호로 묶은 블럭 안의 내용을 실행합니다.
package main
import (
"fmt"
)
func main() {
a := 1
b := 2
fmt.Println("a :", a)
fmt.Println("b :", b)
// if 문은 기본적으로 이런 형태로 사용합니다.
if a > b {
// if 뒤에 나온 조건이 true 이면 이 코드를 실행
// a > b == false 이므로 실행되지 않습니다.
fmt.Println("a 값이 b 값보다 더 큽니다.")
}
// if 문은 else-if, else 와 함께 사용할 수 있습니다.
if a < b {
// if 뒤에 나온 조건이 true 이면 이 코드를 실행
// a < b == true 이므로 이 코드가 실행됩니다.
fmt.Println("a 값이 b 값보다 더 작습니다.")
} else if a == b {
// if 조건이 false 이고 else-if 뒤에 나온 조건이 true 이면 이 코드를 실행
fmt.Println("a, b 값이 서로 같습니다.")
} else {
// if, else-if 조건들이 모두 false 이면 이 코드를 실행
fmt.Println("a 값이 b 값보다 더 작지도, 서로 같지도 않습니다.")
}
}
// 실행 결과
// a : 1
// b : 2
// a 값이 b 값보다 더 작습니다.
Go
복사
Go 에서 사용하는 if 문은 다른 개발 언어와 대부분 비슷하지만 몇가지 차이점이 존재합니다.
첫번째 차이점 - Code Convention
첫번째 차이점은 반드시 if 문이 있는 라인과 같은 라인에 조건 블럭 시작 괄호({)를 위치시켜야 합니다.
package main
import (
"fmt"
)
func main() {
a := 1
b := 2
fmt.Println("a :", a)
fmt.Println("b :", b)
// Go 에서는 이렇 블록 시작 괄호가 조건식의 다음줄에 들어오는 것을 허용하지 않습니다.
// 이 경우엔 컴파일 단계에서 에러가 발생합니다.
if a < b
{
fmt.Println("a 값이 b 값보다 더 작습니다.")
}
}
// 실행 결과
// unexpected newline, expecting { after if clause
Go
복사
두번째 차이점 - Boolean Expression
package main
import (
"fmt"
)
func main() {
a := 1
fmt.Println("a :", a)
// Go 에서는 이렇게 boolean 이 아닌 값이 조건식으로 올 수 없습니다.
// 이 경우엔 컴파일 단계에서 에러가 발생합니다.
if a {
fmt.Println("a 값이 b 값보다 더 작습니다.")
}
}
// 실행 결과
// non-boolean condition in if statement
Go
복사
switch Keyword
switch 문은 여러개의 값을 비교할 때 유용하게 사용할 수 있습니다.
하나의 값이나 식을 먼저 지정하고 그 값과 비교할 결과들을 case 문과 나열하는 것으로 여러개의 값과 비교하고 그에 맞는 코드를 실행할 수 있습니다.
package main
import (
"fmt"
)
func main() {
a := 1
fmt.Println("a :", a)
// switch 문은 기본적으로 이런 형태로 사용합니다.
switch a {
// 이런식으로 case 바로 뒤에 a 와 비교할 값을 넣습니다.
case 1:
// a == 1 이면 이 코드를 실행
// 따라서 현재는 이 코드가 실행됩니다.
fmt.Println("a 값은 1 입니다.")
// case는 이런식으로 여러개의 값과 비교할 수 도 있습니다.
case 2, 3, 4:
// a == 2 혹은 a == 3 혹은 a == 4 이면 이 코드를 실행
fmt.Println("a 값은 2 혹은 3 혹은 4 입니다.")
// a 의 값이 case 문에 정의되지 않았다면 이 default 코드 블럭을 실행합니다.
default:
fmt.Println("a 값은 1, 2, 3, 4 가 아닙니다.")
}
}
// 실행 결과
// a : 1
// a 값은 1 입니다.
Go
복사
package main
import (
"fmt"
)
func main() {
a := 1
fmt.Println("a :", a)
// Go 에서는 이렇게 switch 뒤에 계산식을 포함시킬 수 있습니다.
switch x := a * 10; x {
case 1:
fmt.Println("x 값은 1 입니다.")
case 2, 3, 4:
fmt.Println("x 값은 2 혹은 3 혹은 4 입니다.")
default:
// switch 조건식의 결과 값 x가 10이기 때문에 이 코드 블럭이 실행됩니다.
fmt.Println("x 값은 1, 2, 3, 4 가 아닙니다.")
fmt.Println("x :", x)
}
}
// 실행 결과
// a : 1
// x 값은 1, 2, 3, 4 가 아닙니다.
// x : 10
Go
복사
if 문과 마찬가지로 switch 문도 다른 언어와 비교했을때 몇 가지의 차이점이 존재합니다.
첫번째 차이점 - No switch expression
첫번째 차이점은 switch 문 뒤에 변수나 계산식이 존재하지 않더라도 Go는 문법적으로 허용합니다.
package main
import "fmt"
func main() {
a := 1
fmt.Println("a :", a)
// switch 문 뒤에 변수나 계산식이 없습니다.
switch {
case a < 2:
fmt.Println("a 값은 2 보다 작습니다.")
case a == 2:
fmt.Println("a 값은 2 입니다.")
default:
fmt.Println("a 값은 2 보다 큽니다.")
}
}
// 실행 결과
// a : 1
// a 값은 2 보다 작습니다.
Go
복사
두번째 차이점 - case expression
두번째 차이점은 case 문 뒤에 계산식을 사용할 수 있습니다.
package main
import "fmt"
func main() {
a := 1
fmt.Println("a :", a)
// case 문 뒤에 계산식을 사용합니다.
switch {
case a < 2:
fmt.Println("a 값은 2 보다 작습니다.")
case 2*a == 2:
fmt.Println("a 값은 1 입니다.")
default:
fmt.Println("a 값은 1이 아닙니다.")
}
}
// 실행 결과
// a : 1
// a 값은 2 보다 작습니다.
// a 값은 1 입니다.
Go
복사
세번째 차이점 - No default fall through
case 문의 코드 블럭이 종료되고 다음 case 문의 코드 블럭이 실행되지 않습니다.
다른 개발 언어에서는 case 문이 끝난 후에 별도로 명시하지 않으면 다음 case 문이 실행될 수 있지만 Go 에서는 조건에 맞는 case 문이 실행된 후에 즉시 switch 코드 블럭을 탈출합니다.
package main
import (
"fmt"
)
func main() {
a := 1
fmt.Println("a :", a)
switch a {
case 1:
fmt.Println("a 값은 1 입니다.")
default:
fmt.Println("이 코드는 실행되지 않습니다.")
}
fmt.Println("switch 문에서 탈출했습니다.")
}
// 실행 결과
// a : 1
// a 값은 1 입니다.
// switch 문에서 탈출했습니다.
Go
복사
네번째 차이점 - Type switch
변수의 데이터 타입에 따라서 case 문으로 코드를 분기할 수 있습니다.
package main
import (
"fmt"
)
func main() {
var i interface{} = "hello"
switch v := i.(type) {
case int:
fmt.Println("i의 두 배는", v*2)
case string:
fmt.Println(v + " world!")
default:
fmt.Printf("타입 %T 에 대해선 모르겠습니다!\n", v)
}
}
// 실행 결과
// hello world!
Go
복사
반복문
반복문은 프로그램에서 동일한 코드 블럭을 여러 번 실행하려고 할 때 사용합니다.
for Keyword
Go 언어에서는 for 키워드를 사용하여 반복문을 생성합니다.
for 키워드는 다른 언어의 while 및 for 키워드의 기능을 모두 수행할 수 있습니다. range 키워드를 함께 사용하면, 배열, 슬라이스, 문자열, 맵, 채널 등의 데이터 구조를 순회할 수 있습니다.
package main
import (
"fmt"
)
func main() {
// for 문은 기본적으로 이런 형태로 사용합니다.
for i := 1; i <= 5; i++ {
fmt.Printf("%d번째 반복입니다.\n", i)
}
// while 문의 기능도 수행할 수 있습니다.
i := 1
for i <= 5 {
fmt.Printf("%d번째 반복입니다.\n", i)
i++
}
// 무한 루프도 가능합니다.
// 다음 코드는 주석처리해두었습니다.
// 실행시키면 무한 반복입니다.를 멈추지 않고 출력합니다.
/*
for {
fmt.Println("무한 반복입니다.")
}
*/
}
// 실행 결과
// 1번째 반복입니다.
// 2번째 반복입니다.
// 3번째 반복입니다.
// 4번째 반복입니다.
// 5번째 반복입니다.
// 1번째 반복입니다.
// 2번째 반복입니다.
// 3번째 반복입니다.
// 4번째 반복입니다.
// 5번째 반복입니다.
Go
복사
Go 언어에서는 range 키워드를 사용하여 다양한 데이터 구조를 순회할 수 있습니다.
아래는 slice map 데이터 구조에 대한 range 사용 예제입니다.
package main
import (
"fmt"
)
func main() {
// range 키워드를 사용하여 슬라이스를 순회할 수 있습니다.
nums := []int{1, 2, 3, 4, 5}
for idx, num := range nums {
fmt.Printf("인덱스: %d, 값: %d\n", idx, num)
}
// map 데이터 구조를 생성합니다.
myMap := map[string]int{"apple": 1, "banana": 2, "cherry": 3}
// range 키워드를 사용하여 map을 순회합니다.
for key, value := range myMap {
fmt.Printf("키: %s, 값: %d\n", key, value)
}
}
// 실행 결과
// 인덱스: 0, 값: 1
// 인덱스: 1, 값: 2
// 인덱스: 2, 값: 3
// 인덱스: 3, 값: 4
// 인덱스: 4, 값: 5
// 키: apple, 값: 1
// 키: banana, 값: 2
// 키: cherry, 값: 3
Go
복사
break, continue, goto Keyword
break, continue, goto는 Go 언어에서 반복문의 흐름을 제어하는데 사용되는 키워드입니다.
•
break 키워드는 현재 반복문을 중단하고, 반복문 바로 다음의 코드를 실행하기 시작합니다.
•
continue 키워드는 반복문의 나머지 부분을 건너뛰고, 다음 반복을 시작합니다.
•
goto 키워드는 코드의 특정 라벨로 제어 흐름을 이동시킵니다.
package main
import (
"fmt"
)
func main() {
// break, continue, goto 키워드를 사용합니다.
for i := 1; i <= 10; i++ {
if i == 5 {
continue // i가 5일 때는 아래 코드를 실행하지 않고 다음 반복으로 넘어갑니다.
}
if i == 8 {
break // i가 8일 때는 for 문을 빠져나갑니다.
}
fmt.Printf("%d번째 반복입니다.\n", i)
}
// goto 키워드를 사용하여 특정 라벨로 이동할 수 있습니다.
i := 0
START:
if i < 5 {
fmt.Printf("%d번째 반복입니다.\n", i)
i++
goto START
}
}
// 실행 결과
// 1번째 반복입니다.
// 2번째 반복입니다.
// 3번째 반복입니다.
// 4번째 반복입니다.
// 6번째 반복입니다.
// 7번째 반복입니다.
// 0번째 반복입니다.
// 1번째 반복입니다.
// 2번째 반복입니다.
// 3번째 반복입니다.
// 4번째 반복입니다.
Go
복사
끝마치며
이번 강의에서는 Go에서 사용할 수 있는 조건문과 반복문에 대해서 알아봤습니다.
다음 강의에서는 Go 에서 함수의 사용방법에 대해서 알아보겠습니다.
감사합니다. 다음 강의에서 만나요!
강의 목록