본문 바로가기
프로그래밍

👨‍💻 [Go] Go 에서 range 은 무엇이며, 어떻게 사용할 수 있나요?

by 밝음의기둥 2024. 11. 15.
반응형

👨‍💻 안녕하세요, 윌리 프로젝트의 윌리 입니다.

Go 에서 range 은 무엇이며, 어떻게 사용할 수 있는지 간략히 알아보았습니다.


질문 >

Go 에서 range 은 무엇이며, 어떻게 사용할 수 있나요?

답변 >

Go에서 range는 반복문(for)과 함께 사용되는 키워드로, 슬라이스(slice), 배열(array), 맵(map), 채널(channel) 등의 자료 구조를 순회(iterate)할 때 사용됩니다. range를 사용하면 자료 구조 내의 요소들을 편리하게 접근할 수 있으며, 반복을 통해 인덱스나 키, 그리고 값에 접근할 수 있도록 도와줍니다.

다음은 Go에서 range를 사용하는 방법과 각 자료 구조에 대한 예시입니다.

1. 배열과 슬라이스에서 range 사용

배열이나 슬라이스를 순회할 때 range는 두 가지 값을 반환합니다:

  • 인덱스: 현재 요소의 위치
  • : 현재 요소의 값

예시 코드

package main

import "fmt"

func main() {
    nums := []int{2, 4, 6, 8}

    // 배열 또는 슬라이스 순회
    for i, v := range nums {
        fmt.Printf("Index: %d, Value: %d\\n", i, v)
    }

    // 인덱스만 필요할 경우
    for i := range nums {
        fmt.Printf("Index: %d\\n", i)
    }

    // 값만 필요할 경우 (인덱스 무시)
    for _, v := range nums {
        fmt.Printf("Value: %d\\n", v)
    }
}

  • i, v := range nums: i는 인덱스, v는 현재 인덱스의 값을 나타냅니다.
  • _: 인덱스나 값을 무시하고 싶을 때 사용합니다.

2. 맵(map)에서 range 사용

맵을 순회할 때 range는 두 가지 값을 반환합니다:

  • : 현재 요소의 키
  • : 현재 키에 해당하는 값

예시 코드

package main

import "fmt"

func main() {
    scores := map[string]int{"Alice": 95, "Bob": 80, "Charlie": 85}

    // 맵 순회
    for key, value := range scores {
        fmt.Printf("Key: %s, Value: %d\\n", key, value)
    }

    // 키만 필요할 경우
    for key := range scores {
        fmt.Printf("Key: %s\\n", key)
    }

    // 값만 필요할 경우 (키 무시)
    for _, value := range scores {
        fmt.Printf("Value: %d\\n", value)
    }
}

  • 맵을 순회할 때 range는 요소의 순서를 보장하지 않습니다. 매번 실행 시 순회 순서가 달라질 수 있습니다.

3. 문자열(string)에서 range 사용

문자열을 순회할 때 range는 유니코드 코드 포인트(rune)를 기반으로 각 문자를 순회합니다.

  • 인덱스: 현재 문자의 바이트 위치
  • rune 값: 현재 문자의 유니코드 코드 포인트 값

예시 코드

package main

import "fmt"

func main() {
    text := "hello"

    for i, r := range text {
        fmt.Printf("Index: %d, Rune: %c\\n", i, r)
    }
}

  • 문자열에서 range를 사용하면 유니코드 문자를 기준으로 순회하므로, 멀티바이트 문자가 포함된 문자열도 정상적으로 순회할 수 있습니다.

4. 채널(channel)에서 range 사용

채널을 순회할 때 range는 채널이 닫힐 때까지 값을 순회합니다. 이는 주로 고루틴(goroutine)과 함께 비동기 작업을 처리할 때 유용하게 사용됩니다.

예시 코드

package main

import "fmt"

func main() {
    ch := make(chan int)

    // 값을 채널에 보냄
    go func() {
        for i := 0; i < 5; i++ {
            ch <- i
        }
        close(ch) // 채널 닫기
    }()

    // 채널 순회
    for v := range ch {
        fmt.Println("Value:", v)
    }
}

  • 채널이 닫히면 range는 자동으로 종료됩니다. 따라서 채널 순회를 마친 후에는 별도로 종료 조건을 작성할 필요가 없습니다.
  • close(ch)로 채널을 닫아야만 range가 끝날 수 있습니다. 닫히지 않은 채널에서 계속 값을 기다리므로 무한 루프에 빠질 수 있습니다.

요약

자료 구조  반환 값  설명
배열/슬라이스 인덱스, 값 요소의 인덱스와 해당 값을 반환
키, 값 요소의 키와 해당 값을 반환
문자열 인덱스, rune 값 문자의 바이트 위치와 유니코드 값 반환
채널 채널이 닫힐 때까지 채널에서 값을 반환

range는 Go의 다양한 자료 구조에서 반복 작업을 간편하게 수행할 수 있게 해주며, 각 자료 구조에 맞는 값을 반환하여 유연하게 사용할 수 있습니다.


"이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다."


🎬 유튜브 채널 🎬

 

위로그@WiLog

📢 안녕하세요, 위로그@WiLog 시청자 여러분, 저는 윌리 입니다. 📢 위로그@WiLog 는 자기주도학습을 목적으로 라이브 스트리밍을 합니다. 📢 1인 게임 개발을 목표로 Unreal과 Blender를 학습 중입니

www.youtube.com

🎬 치지직 채널 🎬

 

위로그 채널 - CHZZK

지금, 스트리밍이 시작됩니다. 치지직-

chzzk.naver.com


반응형