이 글을 읽는 분이라면 이미 Generic Programming(일반화 프로그래밍)에 대해 들어보았을 것이다. 대표적으로 C++의 템플릿 프로그래밍이 있고 C#, Java와 같은 오래된 언어뿐만 아니라 Swift, Kotlin등 Modern Language에서도 지원한다.

그러나 아직까지 Go에서는 Generic을 지원하지 않는데, 이유는Go의 탄생 배경과 무관하지 않은 것 같다(C++을 싫어해서 만든 언어인데 Generic을 추가하면 언어가 복잡해지는 것을 피하기 힘들다).

 

그럼에도 불구하고 대부분의 Go 프로그래머는 언젠가 Go에서 Generic을 지원하게 될 것이라 기대하고 있을 것이다. Generic에 대한 논의는 2009년 11월 10일 처음 Go가 발표되었을 때부터 벌써 시작된 것 같다. 그 이후에도 프로그래머들은 계속해서 Generic에 대한 필요성을 요구해왔고, 나 또한 처음 Go 1.11을 접한 이후로 매번 새로운 버전이 릴리즈될 때마다 Generic에 대한 기대를 버리지 않고 있다.

 

그렇다면 Generic은 왜 필요할까? 왜 Go 프로그래머는 간절하게 Generic을 원할까?

 

2019년 7월 31일 Go 블로그에 Ian Lance Tayler(Golang 팀 멤버)의 "Why Generics"란 포스트가 등록되었다. 해당 포스트는 GopherCon 2019 에서 저자가 발표한 "Generics in Go"의 블로그 버전으로, 요약하면 다음과 같은 내용이 담겨 있다.

  • Go에 Generic이 추가된다는 건 어떤 의미인가?
  • 왜 Generic을 추가해야할까?
  • Go에 추가되는 Generic의 초안 디자인

해당 글에서 Ian이 강조하는 것은 Go의 단순함과 명확함을 손상하지 않고 Generic을 가져오는 것이다. 그럼에도 불구하고 해당 글에서 제안한 초안 디자인은 다른 언어의 Generic보다 결코 단순하고 명확하지 않은 모습을 보여 준다. 오히려 Go의 제한적인 문법 특성 때문인지 부가적인 문법(Contract, Ordered...)이 추가되어 해당 디자인이 그대로 확정되지 않기를 바라는 마음이 들 정도이다.

 

다행히도 최근 글인 "The Next Step for Generics"에서 업데이트된 초안 디자인에는 Contract 컨셉이 제외되었다는 언급이 있었다. 또한 간단히 테스트해 볼 수 있도록 실험도구인 translation 도구도 제공하는데 go2goplay 에서도 테스트해 볼 수 있다.

 

go2goplay 예제코드는 다음과 같다.

package main

import (
	"fmt"
)

func Print(type T)(s []T) {
	for _, v := range s {
		fmt.Print(v)
	}
}

func main() {
	Print([]string{"Hello, ", "playground\n"})
}

 

이대로만 나와줘도 좋을 것 같은데, "The Next Step for Generics"에서는 Go 커뮤니티의 피드백을 받아 초안 디자인에 큰 변화가 필요하지 않고 공식 언어 변경 제안도 무사히 통과했을 때를 가정하면, 결국 최대한 낙관적으로 예측해도 2021년 8월 Go 1.17 릴리즈에나 Generic이 정식으로 포함될 것 같다고 한다.

 

아직은 조금 더 기다려야 할 것 같다.

'programming > golang' 카테고리의 다른 글

Go 팀에서 공식적으로 VS Code Go Extension을 지원  (0) 2020.06.29

+ Recent posts