Complete Korean translation

This commit is contained in:
Jongmin Kim 2014-01-08 16:44:30 +09:00
parent c07cb9560c
commit 9b3ce954b1

View File

@ -10,7 +10,7 @@ translators:
lang: ko-kr lang: ko-kr
--- ---
Go는 일을 잘 끝낼 필요에 의해 만들어졌다. Go가 잘 알려진 최신의 Go는 어떤 일을 잘 끝낼 수 있도록 하기위해 만들어졌다. Go가 잘 알려진 최신의
트렌드는 아니지만, 실세계의 문제들을 해결하기 위해서는 가장 트렌드는 아니지만, 실세계의 문제들을 해결하기 위해서는 가장
새롭고 빠른 방법이다. 새롭고 빠른 방법이다.
@ -27,21 +27,21 @@ Go는 정적 타이핑(static typing)의 명령형 언어들(imperative language
/* 여러 줄 /* 여러 줄
주석 */ 주석 */
// 모든 Go 소스 파일은 `package`로 시작한다. // 모든 Go 소스 파일은 package로 시작한다.
// 패키지 이름 중 `main`은 라이브러리가 아닌 실행파일을 선언하는 특별한 이름이다. // 패키지 이름 중 main은 라이브러리가 아닌 실행파일을 선언하는 특별한 이름이다.
package main package main
// `import`는 이 Go 소스 파일 내에서 참조하는 라이브러리 패키지들을 선언한다. // import는 이 Go 소스 파일 내에서 참조하는 라이브러리 패키지들을 선언한다.
import ( import (
"fmt" // Go 표준 라이브러리에 있는 패키지 "fmt" // Go 표준 라이브러리에 있는 패키지
"net/http" // 표준 라이브러리에는 웹 서버 패키지도 있다! (클라이언트도 있음) "net/http" // 표준 라이브러리에는 웹 서버 패키지도 있다! (클라이언트도 있음)
"strconv" // 문자열 변환 패키지 "strconv" // 문자열 변환 패키지
) )
// 함수 선언. `main`은 실행 프로그램에서 시작점이 되는 특별한 함수다. // 함수 선언. main은 실행 프로그램에서 시작점이 되는 특별한 함수다.
// 중괄호를 사용한다. // 중괄호를 사용한다.
func main() { func main() {
// `Println`은 표준 출력으로 개행을 출력한다. // Println은 표준 출력으로 개행을 출력한다.
// fmt 패키지를 통해 이용할 수 있다. // fmt 패키지를 통해 이용할 수 있다.
fmt.Println("Hello world!") fmt.Println("Hello world!")
@ -53,7 +53,7 @@ func main() {
func beyondHello() { func beyondHello() {
var x int // 변수 선언. 변수는 사용하기 전에 선언해야 한다. var x int // 변수 선언. 변수는 사용하기 전에 선언해야 한다.
x = 3 // 변수에 값 할당. x = 3 // 변수에 값 할당.
// 짧은 선언(short declaration)으로 `:=` 를 사용하는데, // 짧은 선언(short declaration)으로 := 를 사용하는데,
// 이렇게 값을 할당하면 값의 타입에 따라 변수의 타입이 결정된다. // 이렇게 값을 할당하면 값의 타입에 따라 변수의 타입이 결정된다.
y := 4 y := 4
sum, prod := learnMultiple(x, y) // 함수는 두 개 이상의 리턴 값을 줄 수 있다. sum, prod := learnMultiple(x, y) // 함수는 두 개 이상의 리턴 값을 줄 수 있다.
@ -117,16 +117,16 @@ func learnTypes() {
// Go는 가비지 컬렉션 기능을 JVM 같은 곳이 아닌 실행파일 런타임에 포함하고 있다. // Go는 가비지 컬렉션 기능을 JVM 같은 곳이 아닌 실행파일 런타임에 포함하고 있다.
// 그리고 포인터는 있지만, 포인터 연산(*p++ 같은)은 없다. // 그리고 포인터는 있지만, 포인터 연산(*p++ 같은)은 없다.
// 그래서 `nil` 포인터 접근같은 것 때문에 실수를 할 수는 있지만 // 그래서 nil 포인터 접근같은 것 때문에 실수를 할 수는 있지만
// 포인터 연산으로 인한 실수는 없게 된다. // 포인터 연산으로 인한 실수는 없게 된다.
func learnMemory() (p, q *int) { func learnMemory() (p, q *int) {
// 지명된 리턴 값(named return value)인 p와 q는 int에 대한 포인터 타입이다. // 지명된 리턴 값(named return value)인 p와 q는 int에 대한 포인터 타입이다.
p = new(int) // 내장함수인 `new`는 메모리를 할당해준다. p = new(int) // 내장함수인 new는 메모리를 할당해준다.
// 메모리 할당된 int는 0으로 초기화 되고, p는 이제 `nil`이 아니다. // 메모리 할당된 int는 0으로 초기화 되고, p는 이제 nil이 아니다.
s := make([]int, 20) // 메모리의 단일 블록으로 20개의 int 공간을 할당한다. s := make([]int, 20) // 메모리의 단일 블록으로 20개의 int 공간을 할당한다.
s[3] = 7 // 그중 하나에 값을 준다. s[3] = 7 // 그중 하나에 값을 준다.
r := -2 // 또다른 로컬 변수를 선언한다. r := -2 // 또다른 로컬 변수를 선언한다.
return &s[3], &r // `&`는 어떤 대상체의 메모리 주소를 가져오게 된다. return &s[3], &r // &는 어떤 대상체의 메모리 주소를 가져오게 된다.
} }
func expensiveComputation() int { func expensiveComputation() int {
@ -134,40 +134,40 @@ func expensiveComputation() int {
} }
func learnFlowControl() { func learnFlowControl() {
// `if`문에 중괄호는 필요하지만, 조건이 들어갈 곳에 소괄호는 쓰지 않는다. // if문에 중괄호는 필요하지만, 조건이 들어갈 곳에 소괄호는 쓰지 않는다.
if true { if true {
fmt.Println("told ya") fmt.Println("told ya")
} }
// 모든 Go 소스의 코드 포맷팅은 `go fmt` 커맨드라인 명령으로 규격을 맞춘다. // 모든 Go 소스의 코드 포맷팅은 "go fmt" 커맨드라인 명령으로 소스코드의 포맷을 맞춘다.
if false { if false {
// pout // pout
} else { } else {
// gloat // gloat
} }
// if-else 체인 형태보다 `switch` 사용이 권장된다. // if-else 체인 형태보다 switch 사용이 권장된다.
x := 1 x := 1
switch x { switch x {
case 0: case 0:
case 1: case 1:
// case 안에서는 `break`가 없어도 자동으로 다음 case로 내려가지 않는다. // case 안에서는 break가 없어도 자동으로 다음 case로 내려가지 않는다.
// 자동으로 내려가게 하려면 `fallthrough` 키워드를 사용한다. // 자동으로 내려가게 하려면 fallthrough 키워드를 사용한다.
case 2: case 2:
// x는 1이므로 여기는 실행되지 않음. // x는 1이므로 여기는 실행되지 않음.
} }
// `if`에서처럼 `for`에서도 양쪽에 소괄호를 쓰지 않는다. // if 에서처럼 for 에서도 양쪽에 소괄호를 쓰지 않는다.
for x := 0; x < 3; x++ { // `++` 실행을 제어하는 하나의 구문(statement)이다. for x := 0; x < 3; x++ { // ++ 실행을 제어하는 하나의 구문(statement)이다.
fmt.Println("iteration", x) fmt.Println("iteration", x)
} }
// 여기서 x는 1이다. 위 for에서 x는 for 안의 블록 범위에 있기 때문. // 여기서 x는 1이다. 위 for에서 x는 for 안의 블록 범위에 있기 때문.
// For is the only loop statement in Go, but it has alternate forms. // For is the only loop statement in Go, but it has alternate forms.
// `for`는 Go에서 유일한 루프 구문이지만 다양한 형태로 조건을 주거나 while // for 는 Go에서 유일한 루프 구문이지만 다양한 형태로 조건을 주거나 while
// 처럼 쓸 수도 있다. // 처럼 쓸 수도 있다.
for { // 무한루프 for { // 무한루프
break // 여기서 곧바로 break를 한 건 단지 break // 여기서 곧바로 break를 한 건 단지
continue // break, continue를 루프 안에서 쓸 수 있다는 것을 보여주기 위함. continue // break, continue를 루프 안에서 쓸 수 있다는 것을 보여주기 위함.
} }
// `for`에서처럼 `if`에서 `:=`를 사용하는 것은 y에 먼저 값을 대입하고, // for 에서처럼 if 에서 := 를 사용하는것은 y에 먼저 값을 대입하고,
// 그리고 y > x를 검사한다는 의미. // 그리고 y > x를 검사한다는 의미.
if y := expensiveComputation(); y > x { if y := expensiveComputation(); y > x {
x = y x = y
@ -177,7 +177,7 @@ func learnFlowControl() {
return x > 100 // 위 switch 문 바로 위에 있는 x를 참조한다. return x > 100 // 위 switch 문 바로 위에 있는 x를 참조한다.
} }
fmt.Println("xBig:", xBig()) // true (x에 1e6를 대입했었다.) fmt.Println("xBig:", xBig()) // true (x에 1e6를 대입했었다.)
x /= 1e5 // x는 10이 된다. x /= 1e5 // x는 10이 된다.
fmt.Println("xBig:", xBig()) // 이제 xBig()의 결과는 false가 된다. fmt.Println("xBig:", xBig()) // 이제 xBig()의 결과는 false가 된다.
// `goto`가 필요하다면, 좋아하게 될지도... // `goto`가 필요하다면, 좋아하게 될지도...
@ -197,7 +197,6 @@ type pair struct {
x, y int x, y int
} }
// Define a method on type pair. Pair now implements Stringer.
// pair 타입에 메서드 String을 정의하자. // pair 타입에 메서드 String을 정의하자.
// 이제 pair는 Stringer 인터페이스를 구현(implement)한 것이 되었다. // 이제 pair는 Stringer 인터페이스를 구현(implement)한 것이 되었다.
func (p pair) String() string { // 여기서 p는 리시버(receiver)라고 부른다. func (p pair) String() string { // 여기서 p는 리시버(receiver)라고 부른다.
@ -232,7 +231,6 @@ func learnErrorHandling() {
} else { } else {
fmt.Print(x) // 만일 1이 map에 있었다면 x는 키 1의 값이 들어가게 된다. fmt.Print(x) // 만일 1이 map에 있었다면 x는 키 1의 값이 들어가게 된다.
} }
// An error value communicates not just "ok" but more about the problem.
// Go에서는 함수가 복수 개의 리턴 값을 줄 수 있다는 점을 활용해 함수의 두 번째 리턴 // Go에서는 함수가 복수 개의 리턴 값을 줄 수 있다는 점을 활용해 함수의 두 번째 리턴
// 값으로 error를 리턴해주고 그 error가 nil 인지 아닌지 확인하는 관례가 있다. // 값으로 error를 리턴해주고 그 error가 nil 인지 아닌지 확인하는 관례가 있다.
@ -251,40 +249,40 @@ func inc(i int, c chan int) {
c <- i + 1 // 채널이 <- 연산자 왼쪽에 온다면 채널로 데이터를 보낸다는 의미다. c <- i + 1 // 채널이 <- 연산자 왼쪽에 온다면 채널로 데이터를 보낸다는 의미다.
} }
// We'll use inc to increment some numbers concurrently. // 우리는 어떤 숫자들을 동시에 증가시키기 위해 inc 함수를 사용할 것이다.
func learnConcurrency() { func learnConcurrency() {
// Same make function used earlier to make a slice. Make allocates and // make는 slice, map, channel 타입들에 대해 메모리를 할당하고 초기화를 한다.
// initializes slices, maps, and channels. // Go에는 메모리 할당 방법으로 new와 make가 있다.
c := make(chan int) c := make(chan int)
// Start three concurrent goroutines. Numbers will be incremented // 3개의 동시에 실행되는 goroutine를 시작한다. 만약 실행하고 있는 머신이
// concurrently, perhaps in parallel if the machine is capable and // 멀티코어 CPU를 가지고 있고 올바르게 설정되어(GOMAXPROCS) 있다면
// properly configured. All three send to the same channel. // 숫자가 정말로 병렬적으로 증가하게 될 것이다.
go inc(0, c) // go is a statement that starts a new goroutine. go inc(0, c) // go는 새로운 goroutine을 시작하는 구문이다.
go inc(10, c) go inc(10, c)
go inc(-805, c) go inc(-805, c)
// Read three results from the channel and print them out. // 채널로부터 3개의 결과를 읽어 출력한다.
// There is no telling in what order the results will arrive! // 결과가 어떤 순서로 오는지는 알 수 없다.
fmt.Println(<-c, <-c, <-c) // channel on right, <- is "receive" operator. fmt.Println(<-c, <-c, <-c) // 채널이 <- 연산자 오른쪽에 있는 , 채널로부터 데이터를 받는 연산이다.
cs := make(chan string) // another channel, this one handles strings. cs := make(chan string) // string을 다루는 또 다른 채널
cc := make(chan chan string) // a channel of string channels. cc := make(chan chan string) // string 채널의 채널
go func() { c <- 84 }() // start a new goroutine just to send a value go func() { c <- 84 }() // c 채널로 값을 보내는 goroutine 시작.
go func() { cs <- "wordy" }() // again, for cs this time go func() { cs <- "wordy" }() // cs 채널로 값을 보내느 goroutine 시작.
// Select has syntax like a switch statement but each case involves // select 구문은 switch 문과 비슷하지만, case에서 채널 연산에 관한 일을 한다.
// a channel operation. It selects a case at random out of the cases // select의 case들은 채널통신을 할 준비가 된 case 하나가 무작위로 선택되어
// that are ready to communicate. // 그 부분이 실행된다.
select { select {
case i := <-c: // the value received can be assigned to a variable case i := <-c: // 채널로부터 받아진 값은 변수에 대입할 있다.
fmt.Printf("it's a %T", i) fmt.Printf("it's a %T", i)
case <-cs: // or the value received can be discarded case <-cs: // 또는 받은 값을 그냥 버릴 수도 있다.
fmt.Println("it's a string") fmt.Println("it's a string")
case <-cc: // empty channel, not ready for communication. case <-cc: // 통신할 준비가 되어 있지 않은 비어있는 채널.
fmt.Println("didn't happen.") fmt.Println("didn't happen.")
} }
// At this point a value was taken from either c or cs. One of the two // 여기서는 c나 cs 채널로부터 값 하나를 받을 수 있다. 위에서 실행한 두 개의
// goroutines started above has completed, the other will remain blocked. // goroutine 중 하나가 완료되면 다른 하나는 블락된 상태로 있게 된다.
learnWebProgramming() // Go does it. You want to do it too. learnWebProgramming() // Go에서는 웹 서버쪽 개발도 쉽게 할 수 있다.
} }
// http 패키지의 함수 하나로 웹 서버를 실행시킨다. // http 패키지의 함수 하나로 웹 서버를 실행시킨다.
@ -304,15 +302,13 @@ func (p pair) ServeHTTP(w http.ResponseWriter, r *http.Request) {
## 더 읽어볼 것들 ## 더 읽어볼 것들
The root of all things Go is the [official Go web site](http://golang.org/). Go에 대한 모든 것들은 [Go 공식 웹 사이트](http://golang.org/)를 참고하자.
There you can follow the tutorial, play interactively, and read lots. 여기에는 따라해볼 튜토리얼, 웹 기반의 인터랙티브 실행환경과 많은 읽을거리들이 있다.
The language definition itself is highly recommended. It's easy to read Go 언어 자체에 대한 스펙도 읽어보기를 적극 추천한다. 읽기 쉽게 되어있고
and amazingly short (as language definitions go these days.) 그리 길지는 않다.
On the reading list for students of Go is the [source code to the standard
library](http://golang.org/src/pkg/). Comprehensively documented, it
demonstrates the best of readable and understandable Go, Go style, and Go
idioms. Or you can click on a function name in [the
documentation](http://golang.org/pkg/) and the source code comes up!
Go 소스코드에 대해 좀더 알아보고 싶다면 [Go 표준 라이브러리](http://golang.org/src/pkg/)를
분석해보기 바란다. 이해하기 쉽게 문서화되어 있고, Go 스타일 그리고 Go에서의
관례 배우기에 가장 좋은 방법일 것이다. 또는 [문서](http://golang.org/pkg/) 안에서
함수 이름 하나를 클릭해보면 소스코드를 브라우저에서 살펴볼 수도 있다.