개발/GO

[Golang] 조건문과 반복문

피클s 2022. 3. 23. 10:55

이 글은 https://golangbyexample.com/understand-if-else-statement-golang/, https://golangbyexample.com/switch-statement-golang/, https://golangbyexample.com/for-loop-in-golang/ 을 번역 및 재가공하여 작성하였습니다.

 

 

 

목차

     

    1. 조건문

    1-1. 기본문법

    package main
    
    import "fmt"
    
    func main() {
        age := 29
        if age < 18 {
            fmt.Println("청소년")
        } else if age >= 18 && age < 40 {
            fmt.Println("청년")
        } else {
            fmt.Println("노년")
        }
    }

    다른 언어를 경험했던 분들에게 Go의 if문은 특별할 것이 별로 없습니다.

    조건문에 괄호가 없고, boolean으로 치환되는 연산자만 사용할 수 있습니다.

    JS의 경우 0, 빈문자열 등이 조건문에서 boolean로 판정이 됩니다.

    이는 편리할 때도 있지만 예상치 못한 버그를 일으킬 때도 있었습니다.

    이미 JS식 조건문에 익숙한 사용자에게는 불편할 수도 있을 것 같습니다.

     

    1-2. 변수 선언과 동시에 사용하는 조건문

    package main
    
    import "fmt"
    
    func main() {
        if a := 1; a > 5 {
            fmt.Println(a) // 1
            fmt.Println("a는 5보다 크다")
        } else {
            fmt.Println(a) // 1
            fmt.Println("a는 5보다 작다")
        }
        
            fmt.Println(a) // ERROR!!
    }

    조건문에서 변수를 선언할 수 있습니다.

    이 변수는 if/else구문 내부에서 참조할 수 있는 변수입니다.

     

    1-3. 삼항연산자

     Go 언어는 문법을 단순화하기 위해 삼항연산자를 넣지 않았습니다.

    확실히 코드를 이해하기 힘들게 하는 원인 중에 삼항연산자가 있는 것은 사실입니다.

    다른 언어에서 삼항연산자를 쓰면 코드를 짧게 만들 수 있어서 즐겨썼던지라 저에게 Go 언어는 장황하게 느껴집니다.

    같은 로직이라도 스크롤이 길어지니 오히려 알아보기 힘들다는 인상을 받았습니다.

     

     

    2. Switch

    2-1. 기본문법

    package main
    
    import "fmt"
    
    func main() {
        // switch 문장; 표현식 {
    	// ...
        // }
        
        switch ch := "b"; ch {
        case "a":
            fmt.Println("a")
        case "b", "c":
            fmt.Println("b or c")    
        default:
            fmt.Println("No matching character")    
        }
        
        //fmt.Println(ch)
    
    }

     

    • 문장은 짧은 선언, 함수 호출과 같은 모든 문이 올 수 있습니다.
    • if문과 마찬가지로 ch는 switch문 안에서만 사용할 수 있습니다.
    • 여러 case를 가질 수 있습니다.
    • case는 여러 표현식을 가질 수 있습니다.
    • 두 case는 같은 값을 가질 수 없습니다.
    • break를 사용하지 않아도 정지하지만 작성해도 상관없습니다.
    • 표현식이 없는 경우 case의 값은 boolean이 됩니다.
    • fallthrough키워드로 다음 case문이 연속하여 실행됩니다.

     

    2-2. switch문에 문장만 있는 경우(세미콜론 필수)

    package main
    
    import "fmt"
    
    func main() {
        switch age := 45; {
        case age < 18:
            fmt.Println("Kid")
        case age >= 18 && age < 40:
            fmt.Println("Young")
        default:
            fmt.Println("Old")
        }
    }

     

    2-3. switch문에 표현식만 있는 경우

    package main
    
    import "fmt"
    
    func main() {
        gender := "man"
        switch gender {
        case "man":
            fmt.Println("man")
        case "woman":
            fmt.Println("woman")
        default:
            fmt.Println("etc")
        }
    }

     

    2-4. switch문에 문장과 표현식 모두 없는 경우

    
    package main
    
    import "fmt"
    
    func main() {
        age := 45
        switch {
        case age < 18:
            fmt.Println("Kid")
        case age >= 18 && age < 40:
            fmt.Println("Young")
        default:
            fmt.Println("Old")
        }
    }

     

    2-5. ​fallthrough 키워드

    package main
    
    import "fmt"
    
    func main() {
        i := 45
        switch {
        case i < 10:
            fmt.Println("i is less than 10")
            fallthrough
        case i < 50:
            fmt.Println("i is less than 50")
            fallthrough
        case i < 100:
            fmt.Println("i is less than 100")
        }
    }
    i is less than 50
    i is less than 100

     

    2-6. type switch

    package main
    
    import "fmt"
    
    func main() {
        printType("test_string")
        printType(2)
    }
    
    func printType(t interface{}) {
        switch v := t.(type) {
        case string:
            fmt.Println("Type: string")
        case int:
            fmt.Println("Type: int")
        default:
            fmt.Printf("Unknown Type %T", v)
        }
    }
    Type: string
    Type: int

    변수.(type)을 표현식에 넣는 것으로 타입별 분기를 넣을 수 있습니다.

     

    3. 반복문

    3-1. for문 기본형식

    package main
    
    import "fmt"
    
    func main() {
        for i := 0; i < 5; i++ {
            fmt.Println(i)
        }
    }

    고전적인 for문 입니다.

     

    3-2. range

    package main
    
    import "fmt"
    
    func main() {
        letters := []string{"a", "b", "c"}
    
        fmt.Println("인덱스와 값이 있는 경우")
        for i, letter := range letters {
            fmt.Printf("Index: %d Value:%s\n", i, letter)
        }
    
        fmt.Println("\n값만 있는 경우")
        for _, letter := range letters {
            fmt.Printf("Value: %s\n", letter)
        }
    
        fmt.Println("\n인덱스만 있는 경우")
        for i := range letters {
            fmt.Printf("Index: %d\n", i)
        }
    
        // 인덱스와 값이 없으면 letters의 size만큼 실행됨.
        fmt.Println("\n인덱스와 값이 없는 경우")
        i := 0
        for range letters {
            fmt.Printf("Index: %d Value: %s\n", i, letters[i])
            i++
        }
    }

    현대적?인 for문입니다.

    배열의 인덱스와 값을 바로 가져올 수 있습니다.

    인덱스를 사용하지 않는 경우 언더바(_)를 적어주어야 합니다.

     

    3-3. while

    func main() {
        i := 0
        for i < 5 {
            fmt.Println(i)
            i++
        }
    }

     

    사실 Go언어에서는 while문이 없습니다. 

    대신 조건문만 넣어서 같은 동작을 할 수 있습니다.

     

    3-4. 무한 루프

    package main
    
    import (
        "fmt"
    )
    
    func main() {
        i := 0
        for {
            i++
            if i % 2 == 0 {
                continue
            }
            
            fmt.Println(i)
            
            if i >= 5 {
                break
            }
        }
    }
    1
    3
    5

    표현식을 아무것도 넣지 않으면 무한루프가 됩니다.

    break로 빠져나올 수 있습니다.

    continue로 다음 반복으로 뛰어넘습니다.

     

    3-5. init 함수

    package main
    
    import "fmt"
    
    func main() {
        i := 1
        //Function call in the init part in for loop
        for test(); i < 3; i++ {
            fmt.Println(i)
        }
    }
    func test() {
        fmt.Println("In test function")
    }
    In test function
    1
    2

    for 조건 첫 번째 구문에 함수를 넣어 최초 한 번만 실행할 수 있습니다.