Search

[Go 기초] [#6] 제어문

요약
조건과 반복을 위한 제어문 설명
썸네일
https://noticon-static.tammolo.com/dgggcrkxq/image/upload/v1566913552/noticon/xjarxsfmmcouhih40val.png
작성일자
2024/04/12 10:37
수정일자
2024/05/03 12:29
스택
Go
카테고리
기초
태그
제어문
조건문
반복문

제어문 (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

두번째 차이점은 조건식의 결과는 반드시 bool (Boolean) 이어야만 합니다. bool 데이터 타입이 무엇인지 모르겠으면 링크를 참고해주세요.
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 키워드는 다른 언어의 whilefor 키워드의 기능을 모두 수행할 수 있습니다. 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 에서 함수의 사용방법에 대해서 알아보겠습니다.
감사합니다. 다음 강의에서 만나요!
강의 목록

참조