프로그래밍

👨‍💻 [Go] Go 에서 채널(Channel) 이란 무엇이며, 어떻게 활용할 수 있나요?

밝음의기둥 2025. 1. 2. 15:12
반응형

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


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

Go 에서 채널(Channel) 이란 무엇이며, 어떻게 활용할 수 있는지 간략히 알아보았습니다.


질문 >

Go 에서 채널(Channel) 이란 무엇이며, 어떻게 활용할 수 있나요?

답변 >

Go에서 채널(Channel)은 고루틴(Goroutine) 간에 데이터를 안전하게 교환하기 위한 메커니즘입니다. 채널은 파이프처럼 동작하여 한쪽에서 데이터를 전송하면 다른 쪽에서 이를 수신할 수 있습니다.

채널의 주요 특징

  1. 타입 지정: 채널은 특정 타입의 데이터를 전송합니다. 예를 들어, chan int는 정수형 데이터를 전송하는 채널입니다.
  2. 동기화 제공: 채널은 기본적으로 블로킹 모드로 동작하여 전송자가 데이터를 보낼 때 수신자가 준비될 때까지 대기합니다. 이는 동기화를 간단하게 만듭니다.
  3. 양방향 또는 단방향: 기본적으로 채널은 양방향으로 데이터를 주고받을 수 있지만, 특정 고루틴에서 단방향으로 제한할 수도 있습니다.

채널 생성

채널은 make 함수를 사용하여 생성합니다.

ch := make(chan int) // 정수형 채널 생성


채널 기본 사용법

1. 데이터 전송과 수신

package main

import "fmt"

func main() {
	ch := make(chan int) // 정수형 채널 생성

	// 데이터 전송
	go func() {
		ch <- 42 // 채널에 데이터 전송
	}()

	// 데이터 수신
	value := <-ch // 채널에서 데이터 수신
	fmt.Println(value) // 출력: 42
}

2. 고루틴 간 통신

package main

import (
	"fmt"
	"time"
)

func worker(id int, ch chan string) {
	time.Sleep(2 * time.Second)
	ch <- fmt.Sprintf("Worker %d completed", id) // 작업 완료 메시지 전송
}

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

	for i := 1; i <= 3; i++ {
		go worker(i, ch) // 고루틴 실행
	}

	for i := 1; i <= 3; i++ {
		fmt.Println(<-ch) // 채널에서 메시지 수신
	}
}


채널 유형

1. 버퍼 없는 채널

버퍼 없는 채널은 전송자와 수신자가 동시에 준비되어 있어야 합니다.

ch := make(chan int) // 버퍼 없는 채널 생성

2. 버퍼가 있는 채널

버퍼 크기를 지정하여 전송자가 수신자를 기다리지 않고 데이터를 전송할 수 있습니다.

ch := make(chan int, 3) // 버퍼 크기 3인 채널 생성

package main

import "fmt"

func main() {
	ch := make(chan int, 2) // 버퍼 크기 2

	ch <- 1
	ch <- 2
	fmt.Println(<-ch) // 출력: 1
	fmt.Println(<-ch) // 출력: 2
}


채널 닫기

채널을 닫으면 더 이상 데이터를 전송할 수 없습니다. 하지만 수신자는 남은 데이터를 계속 읽을 수 있습니다.

package main

import "fmt"

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

	ch <- 1
	ch <- 2
	close(ch) // 채널 닫기

	for value := range ch { // 채널에서 데이터 읽기
		fmt.Println(value)
	}
}


단방향 채널

단방향 채널은 특정 고루틴에서만 데이터를 전송하거나 수신하도록 제한할 수 있습니다.

func send(ch chan<- int) { // 전송 전용 채널
	ch <- 42
}

func receive(ch <-chan int) { // 수신 전용 채널
	fmt.Println(<-ch)
}

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

	go send(ch)
	go receive(ch)

	// 메인 함수가 종료되지 않도록 대기
	time.Sleep(1 * time.Second)
}


채널 활용 사례

  1. 작업 분산: 여러 고루틴에 작업을 분배하고 결과를 수집.
  2. 동기화: 고루틴 간 작업 순서를 보장.
  3. 데이터 스트림: 지속적으로 데이터를 생성 및 소비하는 시스템.

주의 사항

  1. 채널 닫기: 수신자가 있는 경우에만 닫아야 하며, 닫힌 채널에 데이터를 전송하면 패닉이 발생합니다.
  2. 고루틴 누수: 채널이 데이터 전송/수신 대기 상태에서 블로킹되면 고루틴 누수가 발생할 수 있으므로 적절히 관리해야 합니다.
  3. 경쟁 조건: 채널과 고루틴이 동시에 데이터를 처리할 때는 동기화 문제를 조심해야 합니다.

채널은 고루틴 간의 통신과 동기화를 간단하고 효율적으로 처리할 수 있는 강력한 도구입니다.



🎬 유튜브 채널 🎬

 

위로그@WiLog

📢 안녕하세요, 위로그@WiLog 시청자 여러분, 저는 윌리(Willee) 입니다. 📢 위로그@WiLog 는 자기계발을 목적으로 하는 채널 입니다. 📢 오늘도 즐겁게~ 자신을 위한 계발을 함께 해보아요~ d^_^b 📌

www.youtube.com

🎬 치지직 채널 🎬

 

위로그 채널 - CHZZK

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

chzzk.naver.com


반응형