본문 바로가기
Language/Golang

Golang (Go언어) for문 (반복문)

by HeeWorld 2024. 10. 31.

Tucker의 Go 언어 프로그래밍 책과 유튜브를 통해 학습 중입니다.

 

Golang 마스코트 Gopher(고퍼)

 

for문

- for문이 실행될 때 초기문이 먼저 실행되고 그 다음에 조건문을 검사함

- 만약 조건문 결과가 true이면, for문 {} 안쪽 코드 블록을 수행하고, 후처리 구문을 실행함.

- 그리고 조건문 검사를하여 true이면 '조건문 결과 → {} 코드 블록 수행 → 후처리' 순서대로 반복 함.

- 만약 조건문이 false이면 후처리 없이 for문을 종료함

- 따라서, false가 되지 않으면 무한 반복을하게 됨.

for문 동작

package main

import "fmt"

func main() {

	for i := 0; i < 10; i++ {
		fmt.Print(i, ", ")
	}
}

// 출력

0, 1, 2, 3, 4, 5, 6, 7, 8, 9,

 

초기문 생략

- 초기문을 생략해도 ;를 붙여서 조건문 자리를 표시해줘야함

for ; 조건문; 후처리 {
  코드블록
}

 

후처리 생략

- 후처리를 생략해도 조건문 뒤에 ;를 붙여줘야함

for 초기문; 조건문; { // 후처리 생략
  코드 블록
}

 

package main

import "fmt"

func main() {

	for i := 0; i < 10; {
		fmt.Print(i, ", ")
	}
}

// 결과

무한 루프

 

→ 후처리가 되지 않아, i는 계속 0이기 때문에 무한루프에 빠지게 됨.

→ fmt.Print(i, ", ") 아래 i++ 를 사용하면 무한루프에 빠지지 않고 기본문과 동일한 결과를 출력함.

 

조건문만 있는 경우

- 초기문과 후처리를 모두 생략할 수 있음

for ; 조건문; {
  코드 블록
}

// 더 단순하게 ;를 모두 없앨 수도 있음

for 조건문 {
  코드 블록
}

 

무한루프 (infinite loop)

- 조건문이 true이면 코드 블록이 무한히 반복되는 무한 루프(loop)가 됨

for true {
  코드 블록
}

// switch문에서 조건문을 생략하면 true가 되듯, for문에서도 true 생략 가능

for {
  코드 블록
}

 

package main

import (
	"fmt"
	"time"
)

func main() {
	i := 1
	for {
		time.Sleep(time.Second)
		fmt.Println(i)
		i++
	}
}

 

→ 해당 예제는 프로그램을 강제 종료하지 않으면 종료되지 않고 계속 숫자를 출력하기 때문에 Ctrl+c를 통해 종료하면 됨.

종료전까지 계속 무한 루프

 

Continue와 brake

- continue와 break는 반복문을 제어하는 키워드

- continue는 이후 코드 블록을 수행하지 않고 곧 바로 후처리를 하고 조건문 검사부터 다시함

- break는 for문에서 곧 바로 빠져 나옴

package main

import "fmt"

func main() {

	for i := 0; i < 10; i++ {
		if i == 3 {
			continue
		}
		if i == 6 {
			break
		}
		fmt.Println("6 *", i, "=", 6*i)
	}
}

// 결과

6 * 0 = 0
6 * 1 = 6
6 * 2 = 12
6 * 4 = 24
6 * 5 = 30

실행 구조

package main

import (
	"bufio"
	"fmt"
	"os"
)

func main() {
	stdin := bufio.NewReader(os.Stdin)
	for {
		fmt.Println("입력하세요.")
		var number int
		_, err := fmt.Scanln(&number) // _을 사용하면 빈칸 지시자로 첫 번째 리턴 값을 사용하지 않겠다는 의미
		if err != nil {
			fmt.Println("숫자를 입력하세요.")

			stdin.ReadString('\n') // 키보드 버퍼를 지움
			continue
		}
		fmt.Printf("입력하신 숫자는 %d입니다.\n", number)
		if number%2 == 0 {
			break
		}
	}
	fmt.Println("for문이 종료됐습니다.")
}

// 결과

입력하세요.
gg
숫자를 입력하세요.
입력하세요.
21
입력하신 숫자는 21입니다.
입력하세요.
22
입력하신 숫자는 22입니다.
for문이 종료됐습니다.

 

 

중첩 for문

- 한 번 이상 중첩해 사용한 for문을 중첩 for문이라고 함

package main

import "fmt"

func main() {

	for i := 0; i < 3; i++ {
		for j := 0; j < 5; j++ {
			fmt.Print("*")
		}
		fmt.Println()
	}
}

// 결과

*****
*****
*****

 

package main

import "fmt"

func main() {

	for i := 0; i < 5; i++ {
		for j := 0; j < i+1; j++ {
			fmt.Print("*")
		}
		fmt.Println()
	}
}

// 결과

*
**
***
****
*****

 

 

중첩 for문과 break, 레이블

- 특정 조건일 때 for문을 종료하고 싶을 때

 

1. 플래그(flag) 변수 활용

package main

import "fmt"

func main() {
	a := 1
	b := 1
	found := false  // flag변수
	for ; a <= 9; a++ {
		for b = 1; b <= 9; b++ {
			if a*b == 45 {
				found = true  // 찾았음을 표시하고 break
				break
			}
		}
		if found {   // 바깥쪽 for문에서 찾았는지 검사해서 break
			break
		}
	}
	fmt.Printf("%d * %d = %d\n", a, b, a*b)
}

 

- 조건: 1 ~ 9 사이의 두 수를 곱했을 때 45가 되는 수를 찾음

실행 경로

 

→ 안쪽(1️⃣) for 문에서 두 수의 곱이 45가 되는 경우를 찾으면, found 변숫값을 true로 바꾸고 break하여 안쪽 for문을 종료함.

→ 바깥쪽(2️⃣) for문은 종료되지 않은 상태이기 때문에 found가 true인지 검사해서 true가 확인되면 for문 종료함.

 

✓ flag 변수를 사용하지 않는다고 한다면, 안쪽(1️⃣) for문만 종료하게 되고, a값을 다시 검사하게 되고 빠져나갈 방법이 없게 됨.

✓ 조건을 만족할 때 이중 for문 전체를 빠져나가기 위해 flag 변수를 사용하는 것

 

2. 레이블(Label) 변수 활용

 

package main

import "fmt"

func main() {
	a := 1
	b := 1

OuterFor:   // 레이블(Label) 정의
	for ; a <= 9; a++ {
		for b = 1; b <= 9; b++ {
			if a*b == 45 {
				break OuterFor   // 레이블에 가장 먼저 포함된 for문까지 종료
			}

		}
	}
	fmt.Printf("%d * %d = %d\n", a, b, a*b)
}

실제 경로

 

→ a * b = 45가 되었을 때, OuterFor 시작점부터 break OuterFor 사이에 만난 첫 번째 for문까지 break 하는 것 (=for문 탈출)

 

✓ C, C++ 은 label을 지원하지만, 다른 언어에서는 지원하지 않음

✓ label을 사용하는 방법이 편리할 수 있으나, 혼동을 불러일으킬 수 있고 잘못사용하면 예기치 못한 버그가 발생할 수 있어서 되도록 사용하지 않는 것을 권장함.

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

Golang (Go언어) 구조체(Structure)  (9) 2024.11.05
Golang (Go언어) 배열(Array)  (0) 2024.11.02
Golang (Go언어) Switch문 (조건문)  (4) 2024.10.31
Golang (Go언어) IF문 (조건문)  (4) 2024.10.30
Golang (Go언어) 상수(Constant)  (0) 2024.10.30