[Tucker의 Go 언어 프로그래밍] 11장 for문

Coen·2023년 10월 10일
1

tucker-go

목록 보기
8/18
post-thumbnail

이 글은 골든래빗 《Tucker의 Go 언어 프로그래밍》의 11장 써머리입니다.

11장 for문

11.1 for 문 동작 원리

  • 기본 형태
for 초기문; 조건문; 후처리 {
	//logic
}
  • for문의 실행 순서는 다음과 같습니다.
    1. 초기문
    1. 조건문
    2. 2가 true일 경우 logic 실행 false일 경우 종료
    3. 후처리
    4. 1~4 반복

11.1.1 초기문 생략

  • 초기문을 생략해도 ;를 붙여줘야 한다.
for ; 조건문; 후처리 {
	//logic
}

11.1.2 후처리 생략

  • 후처리을 생략해도 ;를 붙여줘야 한다.
for 초기문; 조건문; {
	//logic
}

11.1.3 조건문만 있는 경우

  • 초기문과 후처리를 모두 생략하면 다음과 같이 쓸 수 있다.
for ; 조건문; {
	//logic
}
  • ;도 생략 가능
for 조건문 {
	//logic
}

11.1.4 무한 루프

  • 조건문이 true이면 무한루프
for true {
	//logic
}
  • switch문에서 처럼 조건문을 생략하면 true이다.
for {
	//logic
}

11.2 continue와 break

  • continue와 break는 반복문을 제어하는 키워드
for i := 0; i < 10; i++ {
	for i == 3 {
    	continue // 후처리로 건너뛴다?????
    }
    if i == 6 {
    	break // for문 종료
    }
    fmt.Printf("6 * %v = %v", i, 6 * i) 
}

11.3 중첩 for문

  • for문을 중첩해서 사용할 수 있다.
for i := 2; i < 10; i++ { // 2~9 순회
	for j := 1; j < 10; j++ { // 1~9 순회
		fmt.Printf("%v * %v = %v\n", i, j, i*j)
	}
}
  • 중첩 for문에 break와 continue를 사용하면 아래와 같다.
for i := 0; ; i++ {
	if i == 10 {
		break
	}
	if i < 2 {
		i++
		continue
	}
	for j := 0; ; j++ {
		if j == 10 {
			break
		}
		if j < 1 || j > 9 {
			j++
			continue
		}
		fmt.Printf("%v * %v = %v\n", i, j, i*j)
	}
}

11.4 중첩 for문과 break, label

  • 중첩 For문에서 break를 사용하면 break가 속한 for문에서만 빠져나온다. 모든 for문을 빠져나가려면 boolean 변수를 사용한다.
for {
	if flag {
		fmt.Printf("%v * %v = %v\n", a, b, a*b)
		break
	}
	a++
	for {
		b++
		if a*b == 45 {
			flag = true
			break
		}
		fmt.Printf("%v * %v = %v\n", a, b, a*b)
		if b == 9 {
			b = 0
			break
		}
	}
}
  • 내부 for문에서 두 수의 곱이 45가 되는 경우를 찾았다면 flag 변수값을 true 로 바꾼다.

  • 외부 for문에서 flag값을 확인하고 true인 경우 for문을 종료한다.

  • flag변수 이외에 label을 사용할 수 있는데 아래와 같다.(동작은 위와 같음)

Gugudan:
	for {
		a++
		for {
			b++
			if a*b == 45 {
				fmt.Printf("%v * %v = %v\n", a, b, a*b)
				break Gugudan
			}
			fmt.Printf("%v * %v = %v\n", a, b, a*b)
			if b == 9 {
				b = 0
				break
			}
		}
	}
  • label은 레이블 이름을 적고 :을 적어 정의한다.

  • break할 때 레이블 이름을 적어주면 그 레이블에서 먼저 포함된 for문까지 종료하게 된다.

  • label과 for문 사이에 다른것은 올 수 없다(변수, struct 등 )

  • label 보다는 플래그를 사용하자(플래그도 최소화 하라고 한다)

  • 아래와 같이 함수를 사용해 중첩반복 및 레이블이 없는 깔끔한 코드로 사용하자!

func find45(a int) (int, bool) {
	for b := 1; b <= 9; b++ {
		if a*b == 45 {
			return b, true
		}
	}
	return 0, false
}

func Test_bestPractice(t *testing.T) {
	a := 1
	b := 0

	for ; a <= 9; a++ {
		var found bool
		if b, found = find45(a); found {
			break
		}
	}
	fmt.Printf("%v * %v = %v\n", a, b, a*b)
}
profile
백엔드 프로그래머

0개의 댓글