반응형
"이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다."
👨💻 안녕하세요, 윌리 프로젝트의 윌리 입니다.
Go 에서 채널(Channel) 이란 무엇이며, 어떻게 활용할 수 있는지 간략히 알아보았습니다.
질문 >
Go 에서 채널(Channel) 이란 무엇이며, 어떻게 활용할 수 있나요?
답변 >
Go에서 채널(Channel)은 고루틴(Goroutine) 간에 데이터를 안전하게 교환하기 위한 메커니즘입니다. 채널은 파이프처럼 동작하여 한쪽에서 데이터를 전송하면 다른 쪽에서 이를 수신할 수 있습니다.
채널의 주요 특징
- 타입 지정: 채널은 특정 타입의 데이터를 전송합니다. 예를 들어, chan int는 정수형 데이터를 전송하는 채널입니다.
- 동기화 제공: 채널은 기본적으로 블로킹 모드로 동작하여 전송자가 데이터를 보낼 때 수신자가 준비될 때까지 대기합니다. 이는 동기화를 간단하게 만듭니다.
- 양방향 또는 단방향: 기본적으로 채널은 양방향으로 데이터를 주고받을 수 있지만, 특정 고루틴에서 단방향으로 제한할 수도 있습니다.
채널 생성
채널은 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)
}
채널 활용 사례
- 작업 분산: 여러 고루틴에 작업을 분배하고 결과를 수집.
- 동기화: 고루틴 간 작업 순서를 보장.
- 데이터 스트림: 지속적으로 데이터를 생성 및 소비하는 시스템.
주의 사항
- 채널 닫기: 수신자가 있는 경우에만 닫아야 하며, 닫힌 채널에 데이터를 전송하면 패닉이 발생합니다.
- 고루틴 누수: 채널이 데이터 전송/수신 대기 상태에서 블로킹되면 고루틴 누수가 발생할 수 있으므로 적절히 관리해야 합니다.
- 경쟁 조건: 채널과 고루틴이 동시에 데이터를 처리할 때는 동기화 문제를 조심해야 합니다.
채널은 고루틴 간의 통신과 동기화를 간단하고 효율적으로 처리할 수 있는 강력한 도구입니다.
🎬 유튜브 채널 🎬
위로그@WiLog
📢 안녕하세요, 위로그@WiLog 시청자 여러분, 저는 윌리(Willee) 입니다. 📢 위로그@WiLog 는 자기계발을 목적으로 하는 채널 입니다. 📢 오늘도 즐겁게~ 자신을 위한 계발을 함께 해보아요~ d^_^b 📌
www.youtube.com
🎬 치지직 채널 🎬
위로그 채널 - CHZZK
지금, 스트리밍이 시작됩니다. 치지직-
chzzk.naver.com
반응형
'프로그래밍' 카테고리의 다른 글
👨💻 [Unreal] 언리얼 엔진에서 Progress Bar 란 무엇이며, 어떻게 활용할 수 있나요? (1) | 2025.01.03 |
---|---|
👨💻 [Unreal] 언리얼 엔진에서 Widget 이란 무엇이며, 어떻게 활용할 수 있나요? (1) | 2025.01.03 |
👨💻 [Go] Go 에서 고루틴(Goroutine) 이란 무엇이며, 어떻게 활용할 수 있나요? (4) | 2025.01.02 |
👨💻 [Unreal] 언리얼 엔진에서 Anchor Medallion 이란 무엇이며, 어떻게 활용할 수 있나요? (3) | 2025.01.02 |
👨💻 [Unreal] 언리얼 엔진에서 앵커 (Anchor) 란 무엇이며, 어떻게 활용할 수 있나요? (3) | 2025.01.02 |