Go (프로그래밍 언어): 두 판 사이의 차이

내위키
편집 요약 없음
편집 요약 없음
3번째 줄: 3번째 줄:
Go의 기본을 공부하고 싶으면 [http://go-tour-kr.appspot.com A Tour of Go]를 방문해 보자. 즉석에서 직접 실습도 해 볼 수 있다.
Go의 기본을 공부하고 싶으면 [http://go-tour-kr.appspot.com A Tour of Go]를 방문해 보자. 즉석에서 직접 실습도 해 볼 수 있다.


=특징=
==특징==


C 언어와 많은 부분이 닮아 있다. <s>요즘 안 그런 언어도 있나?</s> Go 언어를 만든 주역 세 명 중에 한 명인 켄 톰슨이 C 언어의 전신인 B 언어를 만들었다는 점을 생각해 보면 이해가 간다. <s>그러고 보니 C에 점 하나만 찍으면 G가 된다. 본격 민소희 언어?</s>  
C 언어와 많은 부분이 닮아 있다. <s>요즘 안 그런 언어도 있나?</s> Go 언어를 만든 주역 세 명 중에 한 명인 켄 톰슨이 C 언어의 전신인 B 언어를 만들었다는 점을 생각해 보면 이해가 간다. <s>그러고 보니 C에 점 하나만 찍으면 G가 된다. 본격 민소희 언어?</s>  


문장을 C처럼 세미콜론으로 끝내지만 실제 코딩할 때에는 찍지 않는다. 컴파일러가 자동으로 줄 끝에 붙여준다. 조심할 점이 있는데, 만약 전통적인 C 프로그램의 관례처럼 코드 블럭의 시작을 뜻하는 여는 중괄호({)를 조건문이나 루프문 다음 줄에 쓰면 컴파일러가 조건문이나 루프문의 바로 뒤에 세미콜론을 붙여버리므로 에러가 난다. 조건문이나 루프문 뒤에 줄바꿈 하지 말고 [[자바]]처럼 같은 줄에 중괄호를 써야 한다.
문장을 C처럼 세미콜론으로 끝내지만 실제 코딩할 때에는 찍지 않는다. [[컴파일러]]가 자동으로 줄 끝에 붙여준다. 조심할 점이 있는데, 만약 전통적인 [[C]] 프로그램의 관례처럼 코드 블럭의 시작을 뜻하는 여는 중괄호({)를 조건문이나 루프문 다음 줄에 쓰면 [[컴파일러]]가 조건문이나 루프문의 바로 뒤에 세미콜론을 붙여버리므로 에러가 난다. 조건문이나 루프문 뒤에 줄바꿈 하지 말고 [[자바]]처럼 같은 줄에 중괄호를 써야 한다.


최근 쏟아져 나오는 프로그래밍 언어와는 달리 <s>수많은 치명적 버그의 원흉</s> 포인터를 지원한다. 다만 포인터 연산은 지원하지 않는다. 변수에 대한 참조로는 쓸 수 있지만 메모리를 마음대로 조작하게 <s>그러다가 뽀개먹게</s> 만들지는 않겠다는 뜻. C에서는 배열과 포인터가 사촌지간쯤 되는데, Go는 C보다 배열을 좀 더 편리하게 조작할 수 있는 '슬라이스'라는 기능을 지원한다.
최근 쏟아져 나오는 프로그래밍 언어와는 달리 <del>수많은 치명적 버그의 원흉</del> 포인터를 지원한다. 다만 포인터 연산은 지원하지 않는다. 변수에 대한 참조로는 쓸 수 있지만 메모리를 마음대로 조작하게 <del>그러다가 뽀개먹게</del> 만들지는 않겠다는 뜻. [[C]]에서는 배열과 포인터가 사촌지간쯤 되는데, Go는 C보다 배열을 좀 더 편리하게 조작할 수 있는 '슬라이스'라는 기능을 지원한다.


==변수==
===변수===


변수를 정의할 때 대부분 다른 언어와 달리 이름 다음에 타입이 나온다.
변수를 정의할 때 대부분 다른 언어와 달리 이름 다음에 타입이 나온다.
28번째 줄: 28번째 줄:
처음 두 개의 예는 차이가 없지만 마지막은 차이가 있다. C의 경우에는 x만 포인터고 y은 그냥 변수인데 반해 Go는 x와 y 둘 다 포인터다. 변수 뒤에 타입을 쓰는 방식이 덜 헷갈리고 읽기에도 자연스럽다는 게 (x와 y는 int다) Go의 주장.
처음 두 개의 예는 차이가 없지만 마지막은 차이가 있다. C의 경우에는 x만 포인터고 y은 그냥 변수인데 반해 Go는 x와 y 둘 다 포인터다. 변수 뒤에 타입을 쓰는 방식이 덜 헷갈리고 읽기에도 자연스럽다는 게 (x와 y는 int다) Go의 주장.


==함수==
===함수===


여러 개의 값을 반환값으로 넘겨줄 수 있다. 이를테면,
여러 개의 값을 반환값으로 넘겨줄 수 있다. 이를테면,
49번째 줄: 49번째 줄:
이렇게 하면 함수로부터 두 개의 값을 받을 수 있다.
이렇게 하면 함수로부터 두 개의 값을 받을 수 있다.


==조건문과 루프문==
===조건문과 루프문===


조건문과 루프문에 괄호를 쓰지 않는다. 이를테면 <code lang="go">for i := 0; i < 10; i++</code>
조건문과 루프문에 괄호를 쓰지 않는다. 이를테면 <code lang="go">for i := 0; i < 10; i++</code>
68번째 줄: 68번째 줄:
</syntaxhighlight >
</syntaxhighlight >


==패키지==
===패키지===


요즘 많은 언어에서 지원하는 패키지 개념을 가지고 있다. 변수나 함수 이름의 첫 글자를 대문자로 하면 패키지를 불러들인 파일에서 접근할 수 있으며, 소문자면 같은 패키지 안에서만 쓸 수 있다.
요즘 많은 언어에서 지원하는 패키지 개념을 가지고 있다. 변수나 함수 이름의 첫 글자를 대문자로 하면 패키지를 불러들인 파일에서 접근할 수 있으며, 소문자면 같은 패키지 안에서만 쓸 수 있다.
74번째 줄: 74번째 줄:
패키지 기능을 쓰면 패키지 바깥에서 쓸 수 있는 함수와 변수를 지정할 수 있다. 함수 또는 변수의 첫 글자를 대문자로 하면 외부에서 쓸 수 있고, 소문자로 하면 패키지 내부에서만 쓸 수 있다. [[C++]]나 [[자바]]는 private나 public 키워드를 써야 하는데 Go는 그냥 대소문자로 구별한다. 보통 객체지향 프로그래밍 언어들이 클래스 단위로 캡슐화를 지원하는데 반해, Go는 패키지 단위로 캡슐화를 하는 셈이다.
패키지 기능을 쓰면 패키지 바깥에서 쓸 수 있는 함수와 변수를 지정할 수 있다. 함수 또는 변수의 첫 글자를 대문자로 하면 외부에서 쓸 수 있고, 소문자로 하면 패키지 내부에서만 쓸 수 있다. [[C++]]나 [[자바]]는 private나 public 키워드를 써야 하는데 Go는 그냥 대소문자로 구별한다. 보통 객체지향 프로그래밍 언어들이 클래스 단위로 캡슐화를 지원하는데 반해, Go는 패키지 단위로 캡슐화를 하는 셈이다.


==객체지향==
===객체지향===


요즘 나오는 대부분의 언어들이 클래스를 비롯한 [[객체지향 프로그래밍]] 기능을 기본으로 지원하는데 비해, Go는 클래스가 없다. 다만 구조체를 만들고 구조체의 포인터를 인자로 받는 함수를 만들면 비슷한 효과를 낼 수 있다.
요즘 나오는 대부분의 언어들이 클래스를 비롯한 [[객체지향 프로그래밍]] 기능을 기본으로 지원하는데 비해, Go는 클래스가 없다. 다만 구조체를 만들고 구조체의 포인터를 인자로 받는 함수를 만들면 비슷한 효과를 낼 수 있다.
103번째 줄: 103번째 줄:
사실 최근에 나오는 언어들이 [[객체지향 프로그래밍]] 기능을 대폭 지원하고 프로그래머의 편의성을 많이 챙겨주는 건 좋은데 그 결과로 덩치 크고 무거운 결과물이 나오는 일이 잦다. 간단한 일을 할 때조차도 클래스 정의부터 상당한 양의 코드를 요구하기도 한다. Go는 최근 언어들이 가진 특징을 어느 정도 수용하면서도 과거의 언어들이 가졌던 가볍고, 빠르고, 간결하다는 장점을 얻기 위해 최근에 많은 언어들이 지원하는 주요 기능 가운데 일부를 확 들어내버렸다.
사실 최근에 나오는 언어들이 [[객체지향 프로그래밍]] 기능을 대폭 지원하고 프로그래머의 편의성을 많이 챙겨주는 건 좋은데 그 결과로 덩치 크고 무거운 결과물이 나오는 일이 잦다. 간단한 일을 할 때조차도 클래스 정의부터 상당한 양의 코드를 요구하기도 한다. Go는 최근 언어들이 가진 특징을 어느 정도 수용하면서도 과거의 언어들이 가졌던 가볍고, 빠르고, 간결하다는 장점을 얻기 위해 최근에 많은 언어들이 지원하는 주요 기능 가운데 일부를 확 들어내버렸다.


=활용=
==활용==


[[구글]]로서는 Go가 지나치게 자기네 회사 언어처럼 인식되는 것을 경계하는 눈치다. <del>그런데 Google을 분리해 보면 Go + ogle (추파를 던지다)이다. 구글은 태어날 때부터 Go에 추파를 던지고 있었다.</del>  하지만 조금씩 지원은 늘려가고 있다. [[구글]]의 다운로드 서버를 비롯한 여러 프로젝트들이 Go로 진행되었다. 1.4 버전부터는 [[안드로이드]]용 앱도 제작되고 있다. [[안드로이드]]가 사용하고 있는 [[자바]] 기술을 가지고 [[오라클]]이 자꾸 시비를 걸고 있으니, 나름대로 출구 전략으로 Go의 활용을 점점 늘려 나갈 듯. [[롤리팝]]부터 [[달빅 캐시]]를 들어내 버리고 [[ART]]로 바꿔버린 것도 그와 같은 맥락이다. 문제는 클래스나 상속을 활용한 객채지향 프로그래밍에 젖어 있는 다수의 개발자들에게 과연 Go가 잘 먹혀들지.
[[구글]]로서는 Go가 지나치게 자기네 회사 언어처럼 인식되는 것을 경계하는 눈치다. <del>그런데 Google을 분리해 보면 Go + ogle (추파를 던지다)이다. 구글은 태어날 때부터 Go에 추파를 던지고 있었다.</del>  하지만 조금씩 지원은 늘려가고 있다. [[구글]]의 다운로드 서버를 비롯한 여러 프로젝트들이 Go로 진행되었다. 1.4 버전부터는 [[안드로이드]]용 앱도 제작되고 있다. [[안드로이드]]가 사용하고 있는 [[자바]] 기술을 가지고 [[오라클]]이 자꾸 시비를 걸고 있으니, 나름대로 출구 전략으로 Go의 활용을 점점 늘려 나갈 듯. [[롤리팝]]부터 [[달빅 캐시]]를 들어내 버리고 [[ART]]로 바꿔버린 것도 그와 같은 맥락이다. 문제는 클래스나 상속을 활용한 [[객체지향 프로그래밍]]에 젖어 있는 다수의 개발자들에게 과연 Go가 잘 먹혀들지.


{{각주}}
{{각주}}


[[Category:프로그래밍 언어]]
[[Category:프로그래밍 언어]]

2016년 4월 11일 (월) 09:09 판

구글에서 만들고 밀어주는 프로그래밍 언어. 하지만 왕창 밀어주고 있지는 않다. 구글=Go라는 인식이 지나치게 박히면 널리 퍼지는데 오히려 장애가 된다고 생각하는 듯.

Go의 기본을 공부하고 싶으면 A Tour of Go를 방문해 보자. 즉석에서 직접 실습도 해 볼 수 있다.

특징

C 언어와 많은 부분이 닮아 있다. 요즘 안 그런 언어도 있나? Go 언어를 만든 주역 세 명 중에 한 명인 켄 톰슨이 C 언어의 전신인 B 언어를 만들었다는 점을 생각해 보면 이해가 간다. 그러고 보니 C에 점 하나만 찍으면 G가 된다. 본격 민소희 언어?

문장을 C처럼 세미콜론으로 끝내지만 실제 코딩할 때에는 찍지 않는다. 컴파일러가 자동으로 줄 끝에 붙여준다. 조심할 점이 있는데, 만약 전통적인 C 프로그램의 관례처럼 코드 블럭의 시작을 뜻하는 여는 중괄호({)를 조건문이나 루프문 다음 줄에 쓰면 컴파일러가 조건문이나 루프문의 바로 뒤에 세미콜론을 붙여버리므로 에러가 난다. 조건문이나 루프문 뒤에 줄바꿈 하지 말고 자바처럼 같은 줄에 중괄호를 써야 한다.

최근 쏟아져 나오는 프로그래밍 언어와는 달리 수많은 치명적 버그의 원흉 포인터를 지원한다. 다만 포인터 연산은 지원하지 않는다. 변수에 대한 참조로는 쓸 수 있지만 메모리를 마음대로 조작하게 그러다가 뽀개먹게 만들지는 않겠다는 뜻. C에서는 배열과 포인터가 사촌지간쯤 되는데, Go는 C보다 배열을 좀 더 편리하게 조작할 수 있는 '슬라이스'라는 기능을 지원한다.

변수

변수를 정의할 때 대부분 다른 언어와 달리 이름 다음에 타입이 나온다.

C Go
int x x int
int x, y x, y int
int* x, y x, y int*

처음 두 개의 예는 차이가 없지만 마지막은 차이가 있다. C의 경우에는 x만 포인터고 y은 그냥 변수인데 반해 Go는 x와 y 둘 다 포인터다. 변수 뒤에 타입을 쓰는 방식이 덜 헷갈리고 읽기에도 자연스럽다는 게 (x와 y는 int다) Go의 주장.

함수

여러 개의 값을 반환값으로 넘겨줄 수 있다. 이를테면,

package main

import "fmt"

func swap(x, y string) (string, string) {
	return y, x
}

func main() {
	a, b := swap("hello", "world")
	fmt.Println(a, b)
}

이렇게 하면 함수로부터 두 개의 값을 받을 수 있다.

조건문과 루프문

조건문과 루프문에 괄호를 쓰지 않는다. 이를테면 for i := 0; i < 10; i++

Go는 루프문으로 오로지 for만 지원한다. while이니 do while이니 하는 것 없다. C의 for 구조와 비슷하지만 조건을 쓸 때 괄호를 치지 않으며 첫 번째(초기 조건)와 세 번째(루프를 되풀이할 때마다 실행시킬 구문)는 생략할 수 있다. 사실 for 하나 가지고 다른 루프문들과 같은 루프를 만들 수 있다. 예를 들어, for에 조건만 써 주면 while과 같은 기능을 한다.

for i := 0; i < 100; i++	# C의 for 루프와 같은 구조.
for ; i < 100;		# C의 while과 같은 구조.

[1]

if에 초기 조건을 써 줄 수도 있다. 이를테면,

if v := math.Pow(x, n); v < lim {
    return v
}

패키지

요즘 많은 언어에서 지원하는 패키지 개념을 가지고 있다. 변수나 함수 이름의 첫 글자를 대문자로 하면 패키지를 불러들인 파일에서 접근할 수 있으며, 소문자면 같은 패키지 안에서만 쓸 수 있다.

패키지 기능을 쓰면 패키지 바깥에서 쓸 수 있는 함수와 변수를 지정할 수 있다. 함수 또는 변수의 첫 글자를 대문자로 하면 외부에서 쓸 수 있고, 소문자로 하면 패키지 내부에서만 쓸 수 있다. C++자바는 private나 public 키워드를 써야 하는데 Go는 그냥 대소문자로 구별한다. 보통 객체지향 프로그래밍 언어들이 클래스 단위로 캡슐화를 지원하는데 반해, Go는 패키지 단위로 캡슐화를 하는 셈이다.

객체지향

요즘 나오는 대부분의 언어들이 클래스를 비롯한 객체지향 프로그래밍 기능을 기본으로 지원하는데 비해, Go는 클래스가 없다. 다만 구조체를 만들고 구조체의 포인터를 인자로 받는 함수를 만들면 비슷한 효과를 낼 수 있다.

package main

import (
	"fmt"
	"math"
)

type Vertex struct {
	X, Y float64
}

func (v Vertex) Abs() float64 {
	return math.Sqrt(v.X*v.X + v.Y*v.Y)
}

func main() {
	v := Vertex{3, 4}
	fmt.Println(v.Abs())
}

상속도 지원하지 않는다. 다만 인터페이스의 상속은 지원한다.

사실 최근에 나오는 언어들이 객체지향 프로그래밍 기능을 대폭 지원하고 프로그래머의 편의성을 많이 챙겨주는 건 좋은데 그 결과로 덩치 크고 무거운 결과물이 나오는 일이 잦다. 간단한 일을 할 때조차도 클래스 정의부터 상당한 양의 코드를 요구하기도 한다. Go는 최근 언어들이 가진 특징을 어느 정도 수용하면서도 과거의 언어들이 가졌던 가볍고, 빠르고, 간결하다는 장점을 얻기 위해 최근에 많은 언어들이 지원하는 주요 기능 가운데 일부를 확 들어내버렸다.

활용

구글로서는 Go가 지나치게 자기네 회사 언어처럼 인식되는 것을 경계하는 눈치다. 그런데 Google을 분리해 보면 Go + ogle (추파를 던지다)이다. 구글은 태어날 때부터 Go에 추파를 던지고 있었다. 하지만 조금씩 지원은 늘려가고 있다. 구글의 다운로드 서버를 비롯한 여러 프로젝트들이 Go로 진행되었다. 1.4 버전부터는 안드로이드용 앱도 제작되고 있다. 안드로이드가 사용하고 있는 자바 기술을 가지고 오라클이 자꾸 시비를 걸고 있으니, 나름대로 출구 전략으로 Go의 활용을 점점 늘려 나갈 듯. 롤리팝부터 달빅 캐시를 들어내 버리고 ART로 바꿔버린 것도 그와 같은 맥락이다. 문제는 클래스나 상속을 활용한 객체지향 프로그래밍에 젖어 있는 다수의 개발자들에게 과연 Go가 잘 먹혀들지.

각주

  1. do-while은 무조건 한 번은 실행시킨다는 것만 빼고는 while과 같으므로 while의 조건을 조금만 변형시키면 된다.