이번에도 간단한 예제 프로그램으로 go의 가장 큰 장점 중의 하나인 channel에 대해서 이해를 해봅시다.


우선 소스를 먼저 보겠습니다.


package main

import "fmt"
import "time"

var air chan Ball
var left chan Ball
var right chan Ball

type Ball struct {
	color string
}

func throwBall(ball Ball) {
	fmt.Println(ball.color + " 공을 공중으로 던진다.");

	air <- ball
}

func catchBallLeft() {
	for ;; {
		ball := <- left
		fmt.Println(ball.color + " 공을 왼손으로 잡는다.");
		time.Sleep(1 * time.Second)

		right <- ball
		fmt.Println("왼손이 " + ball.color + " 공을 오른손으로 전달한다.");
		time.Sleep(1 * time.Second)
	}
}

func catchBallRight() {
	for ;; {
		ball := <- right
		fmt.Println(ball.color + " 공을 오른손으로 잡는다.");
		time.Sleep(1 * time.Second)

		air <- ball
		fmt.Println(ball.color + " 공을 오른손으로 공중으로 던진다.");
		time.Sleep(1 * time.Second)
	}
}

func main() {
	air = make(chan Ball, 999)
	left = make(chan Ball, 1)
	right = make(chan Ball, 1)

	throwBall(Ball{"노란색"})
	throwBall(Ball{"빨간색"})
	throwBall(Ball{"검정색"})
	throwBall(Ball{"하늘색"})
	throwBall(Ball{"하얀색"})

	go catchBallLeft()
	go catchBallRight()


	for ;; {
		ball := <- air
		fmt.Println(ball.color + " 공이 떨어진다.");

		left <- ball
		time.Sleep(2 * time.Second)
	}
}


저글링을 하는 것을 코드로 표현해보았습니다.

1. 공중에는 무한대의 공이 있을 수 있습니다. (999개로 설정했습니다.)

2. 왼손과 오른손은 하나의 공만 잡을 수 있습니다.


이것을 표현한 것이 아래의 코드가 됩니다.


air = make(chan Ball, 999)
	left = make(chan Ball, 1)
	right = make(chan Ball, 1)


채널에 값을 넣을 때는


채널 <- 값


채널에서 값을 가져올 때는 


값 = <- 채널


이렇게 사용을 합니다.


일종의 큐(queue)로 생각하실 수도 있습니다.



위의 소스에서는 프로그램이 시작할 때 5개의 공을 공중으로 던지고, 떨어지는 공을 왼손으로 잡아서 오른손으로 넘기고 오른손은 다시 공중으로 던지도록 되어있습니다.


실행결과는 다음과 같습니다.

mskim@1698d666ee43:/work/juggling$ go build && ./juggling 
노란색 공을 공중으로 던진다.
빨간색 공을 공중으로 던진다.
검정색 공을 공중으로 던진다.
하늘색 공을 공중으로 던진다.
하얀색 공을 공중으로 던진다.
노란색 공이 떨어진다.
노란색 공을 왼손으로 잡는다.
왼손이 노란색 공을 오른손으로 전달한다.
노란색 공을 오른손으로 잡는다.
빨간색 공이 떨어진다.
빨간색 공을 왼손으로 잡는다.
노란색 공을 오른손으로 공중으로 던진다.
왼손이 빨간색 공을 오른손으로 전달한다.
빨간색 공을 오른손으로 잡는다.
검정색 공이 떨어진다.
검정색 공을 왼손으로 잡는다.
빨간색 공을 오른손으로 공중으로 던진다.
왼손이 검정색 공을 오른손으로 전달한다.
검정색 공을 오른손으로 잡는다.
하늘색 공이 떨어진다.
하늘색 공을 왼손으로 잡는다.
검정색 공을 오른손으로 공중으로 던진다.
왼손이 하늘색 공을 오른손으로 전달한다.
하늘색 공을 오른손으로 잡는다.
하얀색 공이 떨어진다.
하얀색 공을 왼손으로 잡는다.
하늘색 공을 오른손으로 공중으로 던진다.
왼손이 하얀색 공을 오른손으로 전달한다.
하얀색 공을 오른손으로 잡는다.
노란색 공이 떨어진다.
노란색 공을 왼손으로 잡는다.
하얀색 공을 오른손으로 공중으로 던진다.
왼손이 노란색 공을 오른손으로 전달한다.
노란색 공을 오른손으로 잡는다.


손은 잡는데 1초, 다음 동작(오른손으로 전달 혹은 공중으로 던지는 )을 하는데 1초, 총 2초가 소요됩니다.

현재 코드에서는 2초마다 공이 떨어지도록 되어있습니다.



공이 1초마다 떨어진다면 어떻게 될까요?


결과를 예상해보시고 직접 한번 돌려보세요. 다음 글에서 결과를 올리도록 하겠습니다.