여름의 서재

[Go 기초] 조건문 & 반복문 본문

Skill/Golang

[Go 기초] 조건문 & 반복문

엉아_ 2022. 4. 13. 11:09
728x90
if 문

Go의 if 조건문은 아래 예제에서 보듯이 조건식을 괄호( )로 둘러 싸지 않아도 된다.

그리고 한가지 주목할 점은 if 문의 조건식은 반드시 Boolean 식으로 표현되어야 한다는 것이다.

이점은 C/C++ 같은 다른 언어들이 조건식에 1, 0 과 같은 숫자를 쓸 수 있는 것과 대조적이다.

if k == 1 {
    println("One")
} else if k == 2 {  //같은 라인
    println("Two")
} else {   //같은 라인
    println("Other")
}

if 문에서 조건식을 사용하기 이전에 간단한 문장(Optional Statement)을 함께 실행할 수 있다.

즉, 아래 예제처럼 val := i*2 라는 문장을 조건식 이전에 실행할 수 있는데, 여기서 주의할 점은 이때 정의된 변수 val는 if문 블럭 (혹은 if-else 블럭 scope) 안에서만 사용할 수 있다는 것이다.

이러한 Optional Statement 표현은 아래의 switch문, for문 등 Go의 여러 문법에서 사용할 수 있다.

if val := i * 2; val < max {
    println(val)
}
 
// 아래 처럼 사용하면 Scope 벗어나 에러
val++

 

Switch 문

Go의 단순한 switch문 용법은 C++, C#, Java 등의 다른 언어와 비슷하지만, 다음과 같은 것들은 다른 언어와 다른 Go만의 특별한 용법들이다.

 

1. switch 뒤에 expression이 없을 수 있음

: 다른 언어는 switch 키워드 뒤에 변수나 expression 반드시 두지만, Go는 이를 쓰지 않아도 된다. 이 경우 Go는 switch expression을 true로 생각하고 첫번째 case문으로 이동하여 검사한다.

func grade(score int) {
    switch {
    case score >= 90:
        println("A")
    case score >= 80:
        println("B")
    case score >= 70:
        println("C")
    case score >= 60:
        println("D")
    default:
        println("No Hope")
    }
}

 

2. No default fall through

: 다른 언어의 case문은 break를 쓰지 않는 한 다음 case로 이동하지만, Go는 다음 case로 가지 않는다.

Go에서 만약 이러한 디폴트 break 문을 사용하지 않고, C나 C#처럼 계속 밑의 문장들을 실행하게 하려면, fallthrough 문을 명시해 주면 된다.

package main
 
import "fmt"
 
func main() {
    check(2)
}
 
func check(val int) {
    switch val {
    case 1:
        fmt.Println("1 이하")
        fallthrough
    case 2:
        fmt.Println("2 이하")
        fallthrough
    case 3:
        fmt.Println("3 이하")
        fallthrough
    default:
        fmt.Println("default 도달")
    }
}

 

3. Type switch

: 다른 언어의 switch는 일반적으로 변수의 값을 기준으로 case로 분기하지만, Go는 그 변수의 Type에 따라 case로 분기할 수 있다.

switch v.(type) {
case int:
    println("int")
case bool:
    println("bool")
case string:
    println("string")
default:
    println("unknown")
}

 

for 문

Go 프로그래밍 언어에서 반복문은 for 루프를 이용한다. Go는 반복문에 for 하나 밖에 없다.

for 루프는 다른 언어와 비슷하게 "for 초기값; 조건식; 증감 { ... }" 의 형식을 따른다.

물론 초기값, 조건식, 증감식 등은 경우에 따라 생략할 수 있다.

다만, "초기값; 조건식; 증감"을 둘러싸는 괄호 ( )를 생략하는데, 괄호를 쓰면 에러가 난다.

아래 예제는 1부터 100까지 더하는 for 루프문 예이다.

package main
 
func main() {
    sum := 0
    for i := 1; i <= 100; i++ {
        sum += i
    }
    println(sum)
}

 

 

for문 - 조건식만 쓰는 for 루프 (while)

Go에서 for 루프는 초기값과 증감식을 생략하고 조건식만을 사용할 수 있는데, 이는 마치 for 루프가 다른 언어의 while 루프와 같이 쓰이도록 한다.

아래 예제에서 for 루프는 n이 100을 넘는지를 체크하는 조건식만을 사용하고 있다.

package main
 
func main() {
    n := 1
    for n < 100 {
        n *= 2      
        //if n > 90 {
        //   break 
        //}     
    }
    println(n)
}

 

for 문 - 무한루프

for 루프로 무한루프를 만들려면 "초기값; 조건식; 증감" 모두를 생략하면 된다.

아래 예제는 무한루프를 만든 예이다. 무한루프를 빠져나오기 위해 Ctrl+C 를 누른다.

package main
 
func main() {
    for {
        println("Infinite loop")        
    }
}

 

for range 문

for range 문은 "for 인덱스,요소값 := range 컬렉션" 같이 for 루프를 구성하는데, range 키워드 다음의 컬렉션으로부터 하나씩 요소를 리턴해서 그 요소의 위치인덱스와 값을 for 키워드 다음의 2개의 변수에 각각 할당한다.

아래 예제는 3명의 이름을 갖는 문자열 배열에서 문자열 인덱스(0, 1, 2)와 해당 이름을 차례로 가져와 프린트하는 코드이다.

names := []string{"홍길동", "이순신", "강감찬"}
 
for index, name := range names {
    println(index, name)
}

 

break, continue, goto 문

기타 임의의 문장으로 이동하기 위해 goto 문을 사용할 수 있다. goto문은 for 루프와 관련없이 사용될 수 있다.

break문은 for 루프 이외에 switch문이나 select문에서도 사용할 수 있다. 하지만, continue문은 for 루프와 연관되어 사용된다.

package main
func main() {
    var a = 1
    for a < 15 {
        if a == 5 {
            a += a
            continue // for루프 시작으로
        }
        a++
        if a > 10 {
            break  //루프 빠져나옴
        }
    }
    if a == 11 {
        goto END //goto 사용예
    }
    println(a)
 
END:
    println("End")
}

 

break문은 보통 단독으로 사용되지만, 경우에 따라 "break 레이블"과 같이 사용하여 지정된 레이블로 이동할 수도 있다. break의 "레이블"은 보통 현재의 for 루프의 바로 위에 적게 되는데, 이러한 "break 레이블"은 현재의 루프를 빠져나와 지정된 레이블로 이동하고, break문의 직속 for 루프 전체의 다음 문장을 실행하게 한다.

아래의 코드는 OK를 출력하고 프로그램을 정상 종료한다. 이는 "break L1" 문이 for 루프를 빠져나와 L1 레이블로 이동한 후, break가 있는 현재 for 루프를 건너뛰고 다음 문장인 println() 으로 이동하기 때문이다.

package main
 
func main() {
    i := 0
 
L1:
    for {
     
        if i == 0 {
            break L1
        }
    }
 
    println("OK")
}

 

출처: http://golang.site/Go/Basics

'Skill > Golang' 카테고리의 다른 글

[Go 기초] 슬라이스 (Slice)  (0) 2022.04.13
[Go 기초] 배열 (Array)  (0) 2022.04.13
[Go 기초] 클로저  (0) 2022.04.13
[Go 기초] 함수  (0) 2022.04.13
[Go 기초] 변수와 상수 & 데이터 타입  (0) 2022.04.13
Comments