Web/Go Lang

[Go언어] 반복문

JuniorEinstein 2018. 4. 27. 12:41
728x90


안녕하세요! 오늘은 Go언어의 반복문에 대해서 알아보려고 합니다.


Go언어의 반복문은 다른 언어들과는 다르게 while 문이 없습니다. 대신 for 문을 다양하게 활용할 수 있게 만들어 while문처럼 사용할 수 있게 만들었습니다.


반복문은 반복적으로 같은 코드를 실행시킬 때 사용합니다.


정말 간단하게 예를 들어서 "안녕하세요"라는 문장을 10번 출력할 때


1
2
3
4
5
6
7
8
9
10
fmt.Println("안녕하세요")
fmt.Println("안녕하세요")
fmt.Println("안녕하세요")
fmt.Println("안녕하세요")
fmt.Println("안녕하세요")
fmt.Println("안녕하세요")
fmt.Println("안녕하세요")
fmt.Println("안녕하세요")
fmt.Println("안녕하세요")
fmt.Println("안녕하세요")
cs


이렇게 같은 코드를 10번 쳐주는게 아니라


1
2
3
for i := 0; i<10; i++ {
    fmt.Println("안녕하세요")
}
cs


와 같은 방식으로 작성하는 것이죠.


이렇게 작성하게 되면 반복적인 동작을 쉽게 수행할 수 있을 뿐만 아니라, 코드를 훨씬 더 짧고 간결하게 작성할 수 있습니다.


시작하죠!


for문

Go언어에는 while문이 없습니다. 그 대신 for문이 거의 모든 반복문을 수행한다고 생각하시면 됩니다.


다른 언어의 for문에 대해서 살펴보죠.


C언어의 for문은 (초기화 구문, 조건 구문, 증감식)으로 구성되어 있습니다.


for ( init-expression ; cond-expression ; loop-expression )   
    statement;  


1
2
3
4
5
6
7
8
9
#include <stdio.h>
 
int main() {
    int sum = 0;
    for(int i=1; i<=10; i++) {
        sum += i;
    }
    printf("%d", sum);
}
cs


위의 코드는 정수형으로 선언된 변수 i의 값을 1부터 10까지 변화시키면서 sum이라는 값에 누적해주는 코드입니다.


쉽게 말하면 1부터 10까지 숫자의 합을 구하는 코드죠.


코드를 읽어 보면 이렇습니다. 변수 i를 1로 초기화 하고 i가 10을 넘어가기 전까지 i를 1씩 증가시키면서 sum에 i값을 계속 더합니다.


뭔가 말이 되게 꼬인거 같은데, 천천히 살펴봅시다.


  • 초기화 구문(init-expression) : 초기화 구문은 한번만 실행됩니다. 반복문에 사용되는 변수의 초기화를 위해 사용됩니다.
  • 조건 구문(cond-expression) : 조건 구문은 for문은 언제 종료해야 하는지 알려줍니다.
  • 증감식(loop-expression) : 증감식은 for문 내부의 코드 실행이 끝나고 실행됩니다. 보통은 인덱싱에 사용하는 값을 증감시킵니다.
for문의 실행 순서는 다음과 같습니다.
  1. 초기화 구문이 실행된다.
  2. 조건 구문이 '참(true)'이면 for문 내부의 코드를 실행시킵니다.
  3. for문 내부 코드의 실행이 끝나면 증감식을 실행합니다.
  4. 2~3을 반복합니다. 만약 조건 구문이 '거짓(false)'이면 for문을 종료합니다.
Go언어의 for문도 마찬가지의 방법으로 실행됩니다.

그러면 Go언어로 1부터 10까지의 숫자를 더하는 반복을 작성해 봅시다.

1
2
3
4
5
6
7
8
9
10
11
12
package main
 
import "fmt"
 
func main() {
    var sum int = 0
    for i := 1; i <= 10; i++ {
        sum += i
    }
 
    fmt.Println(sum)
}
cs

위의 코드와 같이 작성이 되겠군요!


while문

앞에서 언급했듯이, Go언어는 while문이 없습니다. 그렇기 때문에 for문을 사용해서 while문처럼 작동하는 코드를 만들 수 있습니다.


위의 1부터 10까지 더하는 코드를 while문으로 작성하면, 다음과 같습니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
package main
 
import "fmt"
 
func main() {
    var i, sum int = 10
    for i <= 10 {
        sum += i
        i++
    }
 
    fmt.Println(sum)
}
cs


다른 언어들의 while문과 비슷하게 동작하죠?


Go언어는 이렇듯 문법 체계가 단순화 되어 있어서 배우기 쉬운게 아닌가 싶습니다!


무한 루프

Go언어로 무한 루프를 만들 때는 다음과 같이 사용할 수 있습니다.


1
2
3
4
5
6
7
8
9
package main
 
import "fmt"
 
func main() {
    for {
        fmt.Println("무한루프ㅡㅡㅡㅡㅡㅡ!!!")
    }
}
cs


(for문이 만능이죠??)


foreach문

Go언어는 foreach문이 없습니다. 마찬가지로 for문을 이용해 foreach문을 사용할 수 있습니다.


(이전 강좌에서 배열과 슬라이스를 다루지 않아서 이해할 수 없을수도 있습니다. ㅠㅠㅠ 다음 강좌에서 다루도록 하겠습니다.)


배열이라는 친구가 있습니다.


간단하게 말하면 어떤 숫자나, 문자들이 나열된 것을 의미합니다.


Go언어에서 배열은 다음과 같이 선언합니다.


1
2
3
4
5
6
7
package main
 
import "fmt"
 
func main() {
    var num []int
}
cs


선언과 동시에 초기화 해야 하는 경우는 다음과 같이 사용합니다.


1
2
3
4
5
6
7
8
package main
 
import "fmt"
 
func main() {
    num := []int{123}
    fmt.Println(num)
}
cs


Go언어의 배열은 선언 이후에 초기화 할 수 없습니다.


이게 무슨 뜻인가 하면 다음과 같은 경우를 의미합니다.


1
2
3
4
5
6
7
8
package main
 
import "fmt"
 
func main() {
    var num []int
    num = {123// 이렇게 사용할 수 없습니다!
}
cs


이런 상황에는 "non-declaration statement outside function body" 에러를 리턴합니다.

선언이 아닌 명령이 함수 밖에서 실행되었다는 뜻입닌다.


그러면 배열에 관한 얘기는 이정도만 해두고!  (다음 강좌에서 자세히 다루겠습니다.)


Go언어에서 사용되는 range라는 친구에 대해서 알아보겠습니다.


1
2
3
4
5
6
7
8
9
10
package main
 
import "fmt"
 
func main() {
    num := []int{123}
    for v := range num {
        fmt.Println(v);
    }
}
cs


range는 배열이나 슬라이스 안의 값들을 하나씩 꺼내옵니다.


꺼내온 값들을 for문이 반복됨에 따라 v라는 변수에 넣고, 출력하게 되는 것입니다.


1
2
3
4
5
6
7
8
9
10
package main
 
import "fmt"
 
func main() {
    num := []int{123}
    for i, v := range num {
        fmt.Println(i, " : ", v)
    }
}
cs


foreach문에서의 인덱싱은 다음과 같이 i의 위치에 변수를 추가함으로써 할 수 있습니다.


실행결과는 다음과 같습니다.


1
2
3
4
>go run main.go
0  :  1
1  :  2
2  :  3
cs


num에 있는 값들을 for문을 통해 하나씩 꺼내옴에 따라 i의 값은 0부터 시작해서 1씩 증가합니다.

이를 통해서 foreach문의 인덱싱을 사용할 수 있습니다.


결론

오늘은 Go언어의 반복문들에 대해서 알아봤습니다! 아직 배열과 슬라이드, 맵 등이 개념을 설명하지 않은 상태라서 더 많은 이야기를 할 순 없었지만! 차차 알아가보도록 하겠습니다.


배열과 슬라이스 강좌에서 다시 봅시다!


728x90