오로지 for
- 보통 프로그래밍 언어를 공부하면
while
문을 먼저 배울것이다. while
문은 조건식을 이용해 조건식이 '참'일 경우 while
문 안의 영역을 계속해서 반복하는 간단한 형식의 반복문이다.
- 여기서 파생되는
do~while
문과 같은 문법도 습득하게 된다.
while
문을 다 배우면, while
문의 기능을 간편하게 만든 for
문을 배우게 되는데, for
문은 반복을 구성하기 위해 필요한 모든 것(초기식, 조건식, 증감식)을 한데 묶을 수 있도록 만들어진 반복문이기 때문에 나중에 반복문에 익숙해지면 거의 for
문만 사용하게 된다.
- 물론
while
문이 좀 더 어울리는 코드가 있다.
for
문은 while
문에 비해서 유연한 느낌늘 주지는 못한다.
- 반복의 횟수가 딱 정해진 경우라면 분명
for
문이 최선이다.
- 하지만 반복 횟수가 딱 정해지지 않은 경우라면, 예를 들어 프로그램 사용자가 임의의 값을 입력하기만 기다리는 상황이라면,
for
문 보다는 while
문이 더 자연스러울 수 있다.
- 하지만 Go언어에서는
while
문을 제공하지 않아서 for
문만 사용할 수 있다!!
for
문의 쓰임새를 확장시킴으로써 무한루프와 같은 기능도 for
문으로 간결하게 구현 할 수 있게 만들었기 때문이다!!
- 그래서 Go언어에서 반복문은
for
만 기억하면 된다!
- 하지만
if
문과 같이 코드 작성에 깔끔함을 추구하기 떄문에 for
문 역시 if
문과 같이 블록 시작 브레이스 ({)를 for
문을 선언한 같은 줄에 입력해줘야 한다!
for
문의 형태
for 초기식; 조건식; 조건 변화식 {
반복 수행할 구문
}
코드
package main
import "fmt"
func main() {
sum := 0
for i := 1; i <= 10; i++ { // 초기식; 조건식; 조건 변화식
sum += i
}
fmt.Println("1부터 10까지 정수 합계:", sum)
}
출력
1부터 10까지 정수 합계: 55
조건식만 쓰는 for 루트
- 조건식만 필요한 반복문을 사용한다면
while
문을 서택하게 된다. why? C언어같은 언어에서는 for
문에 조건식만 사용한다면 for(;i<100:){
이런 식으로 사용해 코드가 깔끔하지 못하기 때문에 대부분 while(i<100){
과 같은 형식으로 사용
- 하지만 Go언어에서는 가결하게 표현이 가능!
while
문과 동일하게 사용이 가능
코드
package main
import "fmt"
func main() {
n := 2
for n < 100 {
fmt.Printf("count %d\n", n)
n *= 2
}
}
출력
count 2
count 4
count 8
count 16
count 32
count 64
무한루프
- 다른 언어에서는
while(1)
과 같은 방법을 사용
for{
와 같은 형식으로 입력(모든 식을 생략)하는 것만으로 무한루프가 된다!
- 무한루프에서 빠져나오기 위해서는
ctrl+c
를 입력
코드
package main
import "fmt"
func main() {
for {
fmt.Printf("무한루프입니다.\n")
}
}
출력
무한루프입니다.
무한루프입니다.
무한루프입니다.
무한루프입니다.
무한루프입니다.
.
.
.
for range 문
- 다른 언어의
foreach
와 비슷한 문법
- 컬렉션으로붙 한 요소씩 가져와 차례로
for
문의 블럭의 문장들을 실행!
- 아직 컬렉션을 잘 모르기 때문에 살짝 보고 바로 컬렉션 보구 넘어도록!
- 간단하게 컬렉션은 배열의 개념!
- 배열, 슬라이스(Slice), 맵(Map)이 있다. for문을 보기위해 간단하게 배열만 사용해보자!
var arr [3]int= [3]{1, 2, 3}
와 같은 형식으로 선언!
3개의 정수형 변수를 갖는 배열 arr을 선언!
arr[0]=1
, arr[1]=2
, arr[2]=3
for range
문은 for
인덱스, 요소값 := range 컬렉션이름같이 for루프를 구성!!
- range 키워드 다음의 컬렌션으로부터 하나씩 요소를 리턴해서 그 요소의 위치 인덱스와 값을 for 키워드 다음의 2개의 변수에 각 각 할당한다.
- 즉,
for range
문은 컬렉션의 모든 요소에 접근해 차례로 리턴할 떄 사용!
코드
package main
import "fmt"
func main() {
var arr [2]string = [2]string{"hi", "hello"}
for index, word := range arr {
fmt.Printf("arr[%d]의 값은 %v입니다.\n", index, word)
}
}
출력
arr[0]의 값은 hi입니다.
arr[1]의 값은 hello입니다.
- 굳이 인덱스와 요소값을 모두 받오지 않아도 된다.
- 인덱스와 요소값 둘 중에 하나를 생략해서 사용할 수 있다.
for range
문에 인덱스와 요소값의 순서는 위의 형태와 마찬가지로 인덱스, 요소값 따라서 **인덱스를 생략하기 위해서는 "-, 요소값", 요소값을 생략하기 위해서는 "인덱스"로만 입력
코드
// 인덱스를 생략한 예시
package main
import "fmt"
func main() {
var houes [4]string = [4]string{"원더랜드", "떡잎마을", "부리부리왕국", "집에가고싶다"}
for _, home := range houes {
fmt.Printf("안녕하세요 여기는 %s입니다.\n", home)
}
}
출력
안녕하세요 여기는 원더랜드입니다.
안녕하세요 여기는 떡잎마을입니다.
안녕하세요 여기는 부리부리왕국입니다.
안녕하세요 여기는 집에가고싶다입니다.
코드
// 요소값을 생략한 예시
package main
import "fmt"
func main() {
var houes [4]string = [4]string{"원더랜드", "떡잎마을", "부리부리왕국", "집에가고싶다"}
for index := range houes {
fmt.Printf("여기 집이 %d개 있습니다.\n", index+1)
}
}
출력
여기 집이 1개 있습니다.
여기 집이 2개 있습니다.
여기 집이 3개 있습니다.
여기 집이 4개 있습니다.
- 컬렉션의 맵을 활용하면 인덱스가 꼭 정수가 아니더라도 다양한 형태로 선언 가능!
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)
}
}
출력
grape의 색깔은 purple입니다.
apple의 색깔은 red입니다.
banana의 색깔은 yellow입니다.