『Tucker의 Go 언어 프로그래밍』 스터디 요약 노트 : 11강 for문
2021. 5. 27. 14:14ㆍ개발/Golang
728x90
반응형
for문은 반복된 일을 수행할 때 유용한 구문입니다. 다른언어와 다르게 Go는 while문이 없고 for문만 있습니다. 이번에는 for문을 정리해보도록 하겠습니다.
1. for문 동작 원리
for 초기문; 조건문; 후처리 {
코드블록 // 조건문이 true인 경우 수행됩니다.
}
- for문이 실행될 때 초기문이 먼저 실행됩니다. 그리고 조건문을 검사합니다. 만약 조건문의 결과가 true이면 for문 {}안쪽 코드 블록을 수행합니다. 그리고 후처리 구문을 실행한후 다시 조건문을 검사합니다.
- 만약 조건문이 false면 for문을 종료합니다.
< 순서도 >

package main
import "fmt"
func main() {
for i := 0; i<10; i++ { // 초기문; 조건문; 후처리;
fmt.Print(i,",")
}
// fmt.Println(i)----> error가생긴다 i가 사라졌기때문
}

- i 변수를 선언하고 0으로 초기화 합니다. i를 10과 비교합니다. i값은 10보다 작기때문에 조건문이 true가 됩니다.
- {} 코드 블록이 실행ㅊ되고 나서 후처리 i++가 실행됩니다. i++는 i값을 1 증가시키기 때문에 i값이 1이 됩니다.
- for 문이 반복되다가 i가 10이되고 10<10이므로 false가되서 for문은 종료가 됩니다.
- 초기문 생략
for ; 조건문; 후처리 {
코드블록
}
- 후처리 생략
for 초기문;조건문; {
코드블록
}
- 조건문만 있는 경우
for ; 조건문; {
코드블록
}
// 또는
for 조건문 { // ;를 모두 없앨수 있음
코드블록
}
- 조건문만 있는경우 ; 생략이 가능합니다.
- 무한 루프
for true {
코드블록
}
// true인경우 조건문도 생략가능
for {
코드블록
}
- for문에서 true인경우 조건문 생략이 가능합니다.
- 무한루프는 프로그램이 강제 종료되거나 break를 사용해 for문을 종료하지 않으면 계속 반복되니 사용에 주의를 기울여야 합니다.
package main
import(
"fmt"
"time"
)
func main() {
i:=1
for {
time.Sleep(time.Second)
fmt.Println(i)
i++
}
}

계속 종료되지 않고 숫자를 출력합니다.
2. contiune와 break
contiune와 break는 반복문을 제어하는 키워드입니다. continue는 이후 코드 블록을 수행하지 않고 곧바로 후처리 하고 조건문 검사부터 다시 하고, break는 for문에서 곧바로 빠져나옵니다.
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문이 종료되었습니다.")
}
입력받은 수가 짝수일 때까지 계속 입력을 받아서 출력하는 예제입니다.
3. 중첩 for문
package main
import "fmt"
func main() {
for i:=0; i<3;i++ { // 3번반복합니다.
for j:=0;j<5;j++{ // 5번반복합니다.
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문을 이용해서 아래의 출력물을 만들어보는 것도 좋을거 같습니다.


4. 중첩for문과 break, 레이블
for문에서 break를 사용하면 break가 속한 for문에서만 빠져나옵니다. 모든 for문을 빠져나가고싶을때는 불리언변수를 사용하면 가능합니다.
< 불리언을 사용한 for문나오기 >
package main
import "fmt"
func main() {
a := 1
b := 1
found := false
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가 되는 수를 찾습니다.
- 두수의 곱 45가 되는 경우를 찾았으면, found의 변숫값을 true로 바꾸고 break를해서 안쪽 for문이 종료됩니다.
- 바깥 쪽 for문은 종료가 되지 않은 상태이기에 found를 통하여 바깥쪽 for문도 검사해줘야 합니다.
< 레이블을 통한 for문나오기 >
package main
import "fmt"
func main() {
a:=1
b:=1
OuterFor: // 레이블을 정의
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)
}

- 레이블 OuterFor를 정의했습니다. 레이블은 이름을적고 콜론 :을 적어서 정의합니다.
- break를 할때 이름을 적어주면 그 레이블에서 가장 먼저 포함된 for문까지 종료하게 됩니다.
※ 레이블을 쓰는 방법이 편할 수 있으나 혼동을 불러일으킬 수 있고 자칫 잘못 사용하면 예기치 못한 버그가 발생할 수 있습니다. 그래서 왠만하면 플래그를 사용하고 레이블은 꼭 사용할 경우에만 사용하는걸 권장합니다.
728x90
반응형
'개발 > Golang' 카테고리의 다른 글
| 『Tucker의 Go 언어 프로그래밍』 스터디 요약 노트 : 13강 구조체 (0) | 2021.05.28 |
|---|---|
| 『Tucker의 Go 언어 프로그래밍』 스터디 요약 노트 : 12강 배열 (0) | 2021.05.27 |
| 『Tucker의 Go 언어 프로그래밍』 스터디 요약 노트 : 10강 switch문 (0) | 2021.05.26 |
| 『Tucker의 Go 언어 프로그래밍』 스터디 요약 노트 : 9강 if문 (0) | 2021.05.24 |
| 『Tucker의 Go 언어 프로그래밍』 스터디 요약 노트 : 8강 상수 (0) | 2021.05.23 |