언어 및 도구들 공부/Go
Go) for 와 range
Dr.Mlem
2025. 4. 7. 08:48
Q1.
for i := range "어떤 집합" 이렇게 하면 해당 반복문은 어떤 집합의 길이만큼 하는 것이고,
for i := range "어떤 집합" 이렇게 하면 해당 반복문은 어떤 집합의 길이만큼 하는 것이고,
거기서 i는 반복문의 횟수를 의미하는거지?
A1.
정확해! 💯
너 지금 Go의 for i := range 어떤집합 문법을 정확하게 이해하고 있어.
그 내용을 한 번 깔끔하게 정리해줄게 👇
✅ for i := range 어떤집합 의 의미
for i := range 어떤집합 {
fmt.Println(i)
}
이 문법은:
해당 집합의 길이만큼 반복하면서, 인덱스(또는 키)만 꺼내는 반복문이야!
- i는 반복 횟수를 의미한다기보다는,
**"해당 집합의 인덱스 또는 키"**를 의미해 - 배열(slice), 맵(map), 문자열(string) 등 다양한 집합 타입에서 사용할 수 있어
📌 예제: 슬라이스일 경우
arr := []string{"a", "b", "c"}
for i := range arr {
fmt.Println(i)
}
📌 출력:
0
1
2
- 여기서 range arr는 배열의 길이(3)만큼 반복함
- i는 인덱스이므로 0, 1, 2가 출력됨
📌 예제: 맵일 경우
m := map[string]int{"apple": 1, "banana": 2}
for k := range m {
fmt.Println(k)
}
📌 출력 (순서는 랜덤):
apple
banana
- 맵에서는 range map의 첫 번째 값은 key
- 이때는 길이만큼 반복하지만, 키 기준으로 반복함
📌 예제: 문자열일 경우
s := "dog"
for i := range s {
fmt.Println(i)
}
📌 출력:
0
1
2
- 문자열도 인덱스로 반복됨 (바이트 기준)
✅ 요약
구문 | 의미 |
for i := range 슬라이스 | 인덱스 i만 반복 (값은 안 씀) |
for i := range 맵 | 키 i만 반복 |
for i := range 문자열 | 인덱스 i만 반복 |
반복 횟수 | 해당 집합의 길이 (len(집합)) 만큼 |
🔔 정리 한 줄
for i := range 어떤집합은
해당 집합의 길이만큼 반복하며, i는 인덱스나 키를 의미하는 변수야.
더 나아가서, for _, v := range로 값만 꺼내는 방식이나
for i, v := range로 인덱스 + 값 모두 꺼내는 방식도 다 함께 기억해두면 좋아! 😊
계속 궁금한 거 있으면 얼마든지 물어봐!
Q2.
마지막에 네가 말해준 두 내용에 대해서 추가적으로 설명해줘
A2.
좋아! 😎
아까 마지막에 언급한 두 가지 range 패턴:
- for _, v := range 집합
- for i, v := range 집합
이 두 가지는 Go의 for-range 문법에서 가장 많이 쓰이는 실전 패턴이야.
각각이 언제, 왜 쓰이는지 아주 깔끔하게 설명해줄게!
✅ 1. for _, v := range 집합
값만 필요할 때 사용하는 패턴
names := []string{"alice", "bob", "carol"}
for _, name := range names {
fmt.Println(name)
}
📌 출력:
alice
bob
carol
🔍 설명:
- _는 인덱스를 무시하겠다는 뜻
- v는 요소의 값 (여기선 "alice", "bob" 등)
- 이 패턴은:
- 값만 사용할 때 깔끔하고 불필요한 인덱스 변수를 생략할 수 있어서 코드가 더 간결함
✅ 2. for i, v := range 집합
인덱스(또는 키)와 값 둘 다 필요한 경우 사용
nums := []int{10, 20, 30}
for i, v := range nums {
fmt.Printf("index: %d, value: %d\n", i, v)
}
📌 출력:
index: 0, value: 10
index: 1, value: 20
index: 2, value: 30
🔍 설명:
- i는 인덱스
- v는 값
- 이 패턴은:
- 위치와 값이 동시에 필요할 때 (예: 출력 번호 붙일 때, 값 정렬하거나 조건 비교할 때 등)
- 또는 디버깅용으로도 많이 쓰임
✅ 예시 비교
패턴 | 언제 쓰나? | 예시 |
for _, v := range list | 값만 필요할 때 | 프린트, 합계 계산 |
for i, v := range list | 인덱스와 값 모두 필요할 때 | 인덱스 조건 분기, 위치 추적 등 |
❗️참고: _는 진짜 값을 버리는 자리야
for i, _ := range list {
fmt.Println(i) // 값은 필요 없고, 인덱스만 쓸 때
}
- 여기서도 _는 값 무시 역할
✅ 최종 정리
문법 | 설명 |
for _, v := range list | 인덱스 무시, 값만 사용 |
for i, v := range list | 인덱스와 값 둘 다 사용 |
for i := range list | 인덱스만 사용 |
_ | Go에서 "무시할 값"을 받는 자리 (버리는 용도) |
Go는 반복문을 단순하고 명확하게 만들기 위해 이런 패턴을 아주 잘 정리해놨어.
실무에서도 for _, v := range는 정말 자주 쓰여!
원한다면 map, 문자열, 채널에서 각각 이 패턴들이 어떻게 적용되는지도 보여줄게 😊
계속 물어봐도 돼!