반복문
반복문인 for에 대해 알아보자.
for
보통 처음 프로그래밍 언어를 공부한 개발자들은 반복문을 처음 배울 때 while문
을 먼저 배웠을 것입니다. 왜냐하면 for문
은 while문
에 비해서 유연한 느낌을 주지 못합니다. while문을 다 배우면, while문의 기능을 간편하게 만든 for문을 배웁니다.
하지만 중요한 것은 Go언어에서는 while문
을 제공하지 않아 for문
만 사용할 수 있습니다.
for 초기식; 조건식; 조건 변화식 {
반복 수행할 구문
}
if문과 같이 코드 작성에 깔끔함을 추구하기 때문에 for문 역시 if문
과 같이 블록 시작 브레이스({)
를 for문을 선언한 같은 줄에 입력해야합니다.
package main
import "fmt"
func main() {
sum := 0
for i := 1; i <= 10; i++ {
sum += i
}
fmt.Println("1부터 10까지 정수 합계:", sum)
}
조건식만 쓰는 for(while)
대부분 다른 언어에서 조건식만 필요한 반복문을 사용한다면 while문
을 선택할 것입니다. 왜냐하면 while(i<100)
과 같은 형식이 for(;i<100;)
이런 식보다 코드가 깔끔하기 때문입니다.
하지만 Go언어에서는 간결하게 표현이 가능해 while문과 동일하게 사용이 가능합니다.
package main
import "fmt"
func main() {
n := 2
for n < 100 {
fmt.Printf("count %d\n", n)
n *= 2
}
}
무한루프
무한루프를 만들 때 다른 언어에서는 while(true)과 for(;;)
같은 방법을 대부분 사용했을 것입니다. Go언어에서는 for {
와 같은 형식으로 입력(모든 식을 생략)하는 것만으로 무한루프가 됩니다. (무한루프를 빠져나오기 위해서는 맥과 윈도우 동일하게 ctrl+c 를 입력하면 됩니다.)
package main
import "fmt"
func main() {
for {
fmt.Printf("무한루프입니다.\n")
}
}
for range
이 문법은 다른 언어의 foreach
와 비슷한 문법입니다. 컬렉션
으로부터 한 요소씩 가져와 차례로 for문의 블럭의 문장들을 실행한다는 뜻입니다.
Go언어에서 컬렉션
은 배열, 슬라이스(Slice), 맵(Map)
이 있지만 이번에는 배열의 개념만 다루겠습니다. Go언어에서는 배열
을 var arr [3]int = [3]int{1, 2, 3}
와 같은 형식으로 선언합니다.
for range문은 "for 인덱스, 요소값 := range 컬렉션이름"
같이 for 루프를 구성합니다.
package main
import "fmt"
func main() {
var arr [6]int = [6]int{1, 2, 3, 4, 5, 6}
for index, num := range arr {
fmt.Printf("arr[%d]의 값은 %d입니다.\n", index, num)
}
}
또한 인덱스와 요소값 둘 중에 하나를 생략해서 사용할 수 있습니다. 인덱스를 생략하기 위해서는 "_, 요소값", 요소값을 생략하기 위해서는 "인덱스"
로만 입력하면 됩니다.
package main
import "fmt"
func main() {
var actors [4]string = [4]string{"정우성", "류준열", "박보검", "이정재"}
for _, actor := range actors {
fmt.Printf("제가 좋아하는 배우는 %s입니다.\n", actor)
}
for index := range actors {
fmt.Printf("배우가 %d명 입장했습니다.\n", index+1)
}
}
컬랙션의 맵을 활용하면 인덱스가 꼭 정수가 아니더라도
다양한 형태로 선언할 수 있기 때문에 for range문을 다양한 형태로 활용할 수 있습니다.
package main
import "fmt"
func main() {
var fruits map[string]string = map[string]string{
"apple": "red",
"banana": "yellow",
"grape": "purple",
}
for fruit, color := range fruits {
fmt.Printf("%s의 색깔은 %s입니다.\n", fruit, color)
}
}