118 개.발.자.를 위.한 하룻밤에 읽는 Go 언어 이야기 신제용 지음
118 개. 발. 자. 를위. 한하룻밤에읽는 Go 언어이야기 신제용지음
표지사진김유안이책의표지는김유안님이보내주신풍경사진을담았습니다. 리얼타임은독자의시선을담은풍경사진을책표지로보여주고자합니다. 사진보내기 ebookwriter@hanbit.co.kr 개발자를위한하룻밤에읽는 Go 언어이야기 초판발행 2015 년 11 월 16 일 지은이신제용 / 펴낸이김태헌펴낸곳한빛미디어 ( 주 ) / 주소서울시마포구양화로 7길 83 한빛미디어 ( 주 ) IT출판부전화 02-325-5544 / 팩스 02-336-7124 등록 1999년 9월 30일제10-1779호 ISBN 978-89-6848-790-3 15000 / 정가 11,000원 총괄배용석 / 책임편집김창수 / 기획 편집정지연 / 교정이미연디자인표지 / 내지여동일, 조판최송실마케팅박상용 / 영업김형진, 김진불, 조유미 이책에대한의견이나오탈자및잘못된내용에대한수정정보는한빛미디어 ( 주 ) 의홈페이지나아래이메일로알려주십시오. 한빛미디어홈페이지 www.hanbit.co.kr / 이메일 ask@hanbit.co.kr Published by HANBIT Media, Inc. Printed in Korea Copyright c 2015 신제용 & HANBIT Media, Inc. 이책의저작권은신제용과한빛미디어 ( 주 ) 에있습니다. 저작권법에의해보호를받는저작물이므로무단복제및무단전재를금합니다. 지금하지않으면할수없는일이있습니다. 책으로펴내고싶은아이디어나원고를메일 (ebookwriter@hanbit.co.kr) 로보내주세요. 한빛미디어 ( 주 ) 는여러분의소중한경험과지식을기다리고있습니다.
저자소개 올해 4월까지 LG전자에서 SW 개발자로그리고컨설턴트로 11년을보냈다. SW 개발자로펌웨어개발부터시작해단말기에신규로탑재되는 TDMB, 카메라, 메신저등의기능을개발했다. 애자일개발방법론의열렬한옹호자로회사에서개발방법과이를실천할수있는프렉티스를전파하는컨설턴트와개발자코치역할을수행하였다. Java, 안드로이드앱개발, Go 언어와같은기술분야를전파하는사내강사로활동했으며, 애자일개발방법, 코드리뷰등과같이팀단위생산성을높이는방법을전파하는워크숍을개발하고운영했다. 현재는드론과관련된 SW을연구개발하는회사를창업하여 SW 개발자로다시돌아왔다. Go 언어는프로젝트에필요한툴을개발하는데사용하고있으며새로구현하는서비스에도적용할예정이다. Go 언어, 안드로이드단위테스트, 오픈소스하드웨어등에관심이많아관련된글을꾸준히기사로남기고있다. Go 언어와관련된활동으로 Go 언어국내모임에서 2011년부터꾸준히발표자로참여하고있으며, 특히 2011년 9월부터 마이크로소프트웨어 에 Go 프로그래밍언어 를국내에소개하기위해심층적인분석내용을 3 회연재했다. 최근에는개발자들이 Go 언어를짧은시간내에제대로사용할수있도록돕는워크숍을준비중이다. 해외 Go 언어개발자들과네트워크를위해매년열리는해외 Go 언어컨퍼런스와개발자모임에도꾸준히참석하고있다. 역서로는 임베디드 C를위한 TDD (2012, 인사이트, 한주영공역 ) 가있다.
저자의말 출판사와책의방향을정하고집필을시작한지 1년이흘렀다. 몇년동안틈틈이정리한자료도있었고샌프란시스코에 1년정도머물면서 Go 언어모임에서다양한개발자들을만나이야기할기회도많았다. 이런이유로처음시작했을때는몇달내에원고를마감할수있으리라는확신이있었다. 하지만집필에들어가면서 Go 언어를처음접할개발자가 Go 언어에대해궁금해하는것이인터뷰를진행하면서구체적으로드러났다. 초기의계획과방향에수정이생기면서자료보강이필요하여집필시간이오래걸렸다. 단순한사실의열거만으로는다음과같은궁금증에답을주기어렵다고생각했다. Go 언어를배우면어디에써먹을수있나요? Go 언어를배우면나중에도움이될까요? 안드로이드개발은 Go 언어로대체되는건가요? 기존언어와의차이점은무엇인가요? 구글에서일하는 Go 언어개발팀을비롯해국내외 Go 언어개발자그리고제품이나서비스에 Go 언어를사용하는개발자를만나서답을얻고자노력했다. 노력을많이기울인만큼 Go 언어에관심을가지기시작한개발자에게이책이길잡이역할을해주었기를기대한다. Go 언어를알아가는과정은필자의인생에도많은영향을미쳤다. Go 언어를만든개발자들개개인의삶을추적하면서존경하는마음이들었고지금은훌륭한롤모델로필자의마음속에자리잡았다. 필자처럼 Go 언어자체의재미뿐만아니라 Go 언어를만든개발자들과도친근해졌기를기대한다. Go 언어가정식으로공개되고 5년정도가지난지금, Go 언어의방향에대해언급하는것이섣부른판단이될지도몰라조심스러웠다. 하지만시작부터현재의모습을정
확히이해한다면여러분스스로 Go 언어가어떻게발전해나가고어느부분에활용할수있을지를판단할수있으리라생각한다. 필자처럼여러분도 Go 언어와좋은인연을맺기바라며기회가주어진다면 Go 언어가정식으로세상에나온 10주년쯤에 Go 언어가걸어온길을뒤돌아보면서국내 Go 언어개발자들을다시만나보고싶다.
이책을읽기전에 이책은다음세사람이나누는대화를통하여 Go 언어를알아보고, 지금까지제가국내외에서만난개발자와나눈이야기를대화형식으로정리하였습니다. 프로그래밍에입문한지얼마되지않은초보자와현업개발자의대화를통해 Go 언어에대한실질적인궁금증을해소할수있도록구성하였습니다. 입문자가가질만한질문을섞어서이해하기쉽고설명이지루하지않도록구성하는데최선을다하였습니다. 등장인물김학생컴퓨터공학과에입학한지이제 1년이되어가는대학새내기다. 미국에서개발자로일하는사촌형의권유로컴퓨터공학과에입학하였으며 1학년과목으로컴퓨터공학의기초과목, C 언어를경험한상태다. 아직개발이자신의적성과맞는지의문이든다. 하지만앞으로개발을계속공부한다면선배들의조언에따라개발언어하나쯤은잘다루고싶다고생각하고있다. 이경험현재안드로이드앱을개발하는회사의주임연구원이다. 올해로개발 5년차며 Java, C++ 를이용하여개발한경험이있다. 현재는 Java로안드로이드앱을개발하고있다. 이전직장에서는 C++ 로임베디드소프트웨어개발을했는데회사사정이어려워져서이직하게되었다. 그동안다양한개발언어를배우고익히고싶어도프로젝트에쫓겨시간을낼수가없었다. 그런데지난주에프로젝트가마무리되면서새로운언어로무엇을배워볼까고민하고있다. 신제용김학생과이경험에게 Go 언어에대해알려주는인물이다. 안드로이드스마트폰이나오기전부터휴대전화에들어가는소프트웨어를주로개발하였다. 안드로이드스마트폰이나온이후에는안드로이드앱을개발하고안드로이드앱에대해교육하는일을담당하였다. 회사에서주로사용한프로그래밍언어는 C와 Java였다. 2009년새로운개발언어가나왔다는뉴스를접한뒤 ' 이건뭐
지?' 라는호기심으로 Go 언어에대한자료를모으기시작하였다. 이후 Go 언어와관련된글을쓰고, Go 언어와관련된프레젠테이션을도맡았으며, Go 언어에대한교육을시작하였다. 다양한활동을통하여 Go 언어의가능성을알리는데조금이라도힘을보태고싶어한다.
한빛리얼타임 한빛리얼타임은 IT 개발자를위한전자책입니다. 요즘 IT 업계에는하루가멀다하고수많은기술이나타나고사라져갑니다. 인 터넷을아무리뒤져도조금이나마정리된정보를찾기도쉽지않습니다. 또한, 잘정리되어책으로나오기까지는오랜시간이걸립니다. 어떻게하면조금이라 도더유용한정보를빠르게얻을수있을까요? 어떻게하면남보다조금더빨 리경험하고습득한지식을공유하고발전시켜나갈수있을까요? 세상에는수 많은종이책이있습니다. 그리고그종이책을그대로옮긴전자책도많습니다. 전자책에는전자책에적합한콘텐츠와전자책의특성을살린형식이있다고생 각합니다. 한빛이지금생각하고추구하는, 개발자를위한리얼타임전자책은이렇습니다. 1 2 ebook First - 빠르게변화하는 IT 기술에대해핵심적인정보를신속하게제공합니다 500페이지가까운분량의잘정리된도서 ( 종이책 ) 가아니라, 핵심적인내용을빠르게전달하기위해조금은거칠지만 100페이지내외의전자책전용으로개발한서비스입니다. 독자에게는새로운정보를빨리얻을기회가되고, 자신이먼저경험한지식과정보를책으로펴내고싶지만너무바빠서엄두를못내는선배, 전문가, 고수분에게는좀더쉽게집필할수있는기회가될수있으리라생각합니다. 또한, 새로운정보와지식을빠르게전달하기위해 O'Reilly의전자책번역서비스도하고있습니다. 무료로업데이트되는전자책전용서비스입니다 종이책으로는기술의변화속도를따라잡기가쉽지않습니다. 책이일정분량이상으로집필되고정리되어나오는동안기술은이미변해있습니다. 전자책으로출간된이후에도버전업을통해중요한기술적변화가있거나저자 ( 역자 ) 와독자가소통하면서보완하여발전된노하우가정리되면구매하신분께무료로업데이트해드립니다.
3 4 독자의편의를위해 DRM-Free 로제공합니다 구매한전자책을다양한 IT 기기에서자유롭게활용할수있도록 DRM-Free PDF 포맷으로제공합니다. 이는독자여러분과한빛이생각하고추구하는전자책을만들어나가기위해독자여러분이언제어디서어떤기기를사용하더라도편리하게전자책을볼수있도록하기위함입니다. 전자책환경을고려한최적의형태와디자인에담고자노력했습니다종이책을그대로옮겨놓아가독성이떨어지고읽기어려운전자책이아니라, 전자책의환경에가능한한최적화하여쾌적한경험을드리고자합니다. 링크등의기능을적극적으로이용할수있음은물론이고글자크기나행간, 여백등을전자책에가장최적화된형태로새롭게디자인하였습니다. 앞으로도독자여러분의충고에귀기울이며지속해서발전시켜나가겠습니다. 지금보시는전자책에소유권한을표시한문구가없거나타인의소유권한을표시한문구가있다면위법하게사용하고있을가능성이큽니다. 이경우저작권법에따라불이익을받으실수있습니다. 다양한기기에사용할수있습니다. 또한, 한빛미디어사이트에서구매하신후에는횟수와관계없이내려받으실수있습니다. 한빛미디어전자책은인쇄, 검색, 복사하여붙이기가가능합니다. 전자책은오탈자교정이나내용의수정 보완이이뤄지면업데이트관련공지를이메일로알려드리며, 구매하신전자책의수정본은무료로내려받으실수있습니다. 이런특별한권한은한빛미디어사이트에서구매하신독자에게만제공되며, 다른사람에게양도나이전은허락되지않습니다.
차례 Go 언어맛보기 011 Go 언어의탄생 017 구글이 Go 언어를만든이유 029 Go 언어를만든사람들 035 Go 언어개발팀사무실을가다 041 왜 Go 언어를배워야하나요 047 마스코트 - 고퍼 (Gopher) 055 Go 언어개발자행사 063 C와 Java 개발자를위한 Go 언어 075 병렬성과동시성 101 동시성예제 117 어떤곳에사용되고있나요 127 Go 언어개발자인터뷰 135 참고문헌 146
Go 언어맛보기 프로그래밍을막시작한김학생, 현업에서개발자로일하는이경험, Go 언어의 안내자신제용의대화를통하여 Go 언어에대한첫발을떼보자. 김학생안녕하세요. 컴퓨터공학과 1학년김학생입니다. 이경험안녕하세요. 안드로이드앱을개발하고있는이경험입니다. 신제용안녕하세요. 만나뵙게되어서반갑습니다. 여러분께 Go 언어에대해이야기해드릴신제용입니다. Go 언어에대한설명에앞서여러분께서 Go 언어에관해어떤관점으로접근하고있는지, 무엇이궁금한지이야기를듣고싶습니다. 김학생제가먼저말씀드리겠습니다. 저는이제막학교에서 C 언어기초를배우기시작했습니다. 선배들이프로그래밍언어하나쯤은마스터하고졸업하라고하는데아직어떤언어를공부해야할지정하지못하였습니다. 이왕이면제가사회에나갔을시점에많이사용하는언어를마스터하고싶은데제가졸업할무렵 Go 언어가널리사용될지궁금합니다. 그렇다고하면지금부터라도열심히시작하고싶어서요. 이경험저는이미 C와 Java를이용해개발한경험이있습니다. Go 언어가기존언어와다른점이무엇인지어떤분야에서많이활용될것인지궁금합니다. 제가작업하는분야에도적용할수있다면다음프로젝트에활용하고싶습니다. Go 언어맛보기 - 011
신제용김학생님은앞으로 Go 언어가널리사용될언어인지, 이경험님은 Go 언어가기존언어와무엇이다른지와어떻게활용할수있는지궁금하시군요. 그럼 Go 언어에대해설명하면서말씀하신부분에대해서는조금더구체적으로설명하겠습니다. 자, 그럼 Go 언어가무엇인지예제를먼저봐볼까요? 김학생, 이경험네, 좋습니다. 김학생저그런데, 실습하는지모르고미처노트북을준비하지못했어요. 신제용괜찮아요. 스마트폰은가지고계시죠? 스마트폰으로도쉽게실행해볼수있습니다. 그럼스마트폰에서웹브라우저를실행해 http://golang.org 에접속해볼까요? 김학생네, 접속했습니다. 신제용화면에 Try Go 가있고그아래노란창이뜰거예요. 그림 1 Go 홈페이지 신제용이창에는다음과같이 Go 언어로 Hello, 世界 를출력하는코드가있습 니다. 012 -
// You can edit this code! // Click here and start typing. package main import "fmt" func main() { } fmt.println("hello, 世界 ") 김학생프로그래밍언어를배울때가장먼저보았던예제같은데요? main 함수와 Println 문을보니 C 언어와비슷하네요. 이경험 Java 와도비슷한것같아요. 신제용새로운언어임에도생소하게느끼지않아서다행입니다. 이경험그런데한자를사용하고있네요? 신제용네, 잘보셨습니다. 코드사이에한자가적혀있으니눈에확띄지요? 그부 분이바르게실행될지도눈여겨봐주세요. 그럼 [Run] 버튼을눌러코드를 실행해볼까요? 그림 2 Hello, 世界 실행하기 Go 언어맛보기 - 013
김학생와! 바로실행이되었네요. 신제용이번에는 Hello, 世界 대신에 Hello, 제용 처럼여러분이름을넣고한 번실행해볼까요? 그림 3 Hello, 제용 실행하기 김학생스마트폰에서도프로그래밍을할수있으니지하철타고가면서심심할때코딩연습이가능하겠어요. 이경험흥미롭네요. 결과가바로바로나와서좋아요. 신제용아주중요한점을지적하셨습니다. 현재웹에서보이는코드는실제로서버에서컴파일 Compile 과빌드 Build 과정을거쳐서실행하게됩니다. 이경험인터프리터방식이아니고실제로실행파일을만들어서실행하는방식이군요. 신제용네. 사실 Go 언어개발팀에서자랑스럽게생각하는점중에하나가빠른빌드입니다. 그래서 Go 언어가처음세상에나온시점부터메인화면에서샘플코드를실행할수있도록서비스하고있습니다. 014 -
김학생그런비밀이숨어있었군요. 최근에 HTML이나 JavaScript 코드를브라우저에서바로실행할수있도록제공하는사이트는봤는데빌드해서실행하는것은처음봤습니다. 이경험한자와한글도지원되는부분도놀랍습니다. 신제용네, 빠른빌드와더불어 Go팀이강조하는부분이바로 UTF-8을지원한다는것입니다. Go 언어는소스코드에한자어나한글등다양한언어를기본으로사용할수있습니다. Go 언어를만든사람들과 UTF-8이어떤관련이있는지는나중에알아보겠습니다. Go 언어맛보기 - 015
016 -
Go 언어의탄생 Go 언어가탄생하기까지 2007년어느화창한가을날샌프란시스코근처구글사무실. 화이트보드앞에세개발자가모여있었다. 한사람은화이트보드에무언가적고있고두사람은화이트보드를보며깊은생각에잠겨있었다. 잠시후이들은각자생각한것을꺼내놓았다. 화이트보드에글로적기도하고그림으로그리기도했다. 중간중간다른사람과이견이있는부분에서는목소리톤이높아지기도했다. 이들은무엇을하고있던것일까? 열띤토론을벌인세사람은로버트그리스머 Robert Griesemer, 켄톰슨 Ken Thompson, 롭파이크 Rob Pike 로, 이들은앞으로만들새로운개발언어에대해이야기하고있었다. 새로태어날개발언어가어떤모습이어야할지에대해각자가지금까지경험한것을바탕으로의견을나누고있었다. 이렇게새로태어난언어가바로 Go 언어다. 개발중간에두명의멤버가더보강되었다. 그중이안테일러 Ian Taylor 는 Go 언어를 GCC 컴파일러에적용하는일을맡고, 러스콕스 Russ Cox 는 Go 언어의완성도를높이는일을담당하게되었다. Go 언어의탄생 - 017
Go 탄생후 2009년 11월, 드디어 Go 언어가공개되었다. 공개와함께다양한매체에서 Go 언어에대해높은관심을보였다. 대부분 구글이만든개발언어 라는제목의기사들이었다. 우호적인내용도있지만그렇지않은내용도있었다. I Like It! CNET이나 SWITCHED에서는구글의새로운개발언어에대한소개와향후기대에대한내용을볼수있었다. 구글이내부의천재개발자를모아새로운언어를만들어냈다는찬사를보내기도했다. 놀라운사실은 TIOBE가 2009년올해의개발언어타이틀을 Go 언어에수여했다는것이다. Go 언어가 2009년 11월에나왔다는사실을떠올려보면 Go 언어에대한관심이얼마나뜨거웠는지를미루어짐작할수있다. 그림 4 TIOBE 사이트에서뽑은올해의프로그래밍언어 01 01 출처 : http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html 018 -
I Don t Like It! Go 언어를접한일부개발자는자신의블로그나기사를통해 이건뭐야. 뭔가색다른게없잖아!, 로드맵에대한명확한설명이없어, 문법이왜이래 등의불평을했다. 불평을쏟아낸개발자는이미나온개발언어가제공하는기능이상을기대했으나깜짝놀랄만한무엇인가를발견하지못했고, 기대에못미친다고생각했다. 또한, Go 언어를상용으로적용하려는개발자에게 Go 언어의로드맵이정확히제공되지않아답답함을토로하기도했다. 당시에는로드맵을명확히제공하지않았지만, 현재는다음과같이일정한개발주기로버전을업데이트하고있다. NOTE 릴리스주기 (https://golang.org/doc/devel/release.html) 정식으로 1.0 버전공개후버전업데이트는 6개월 ~ 1년을주기로하고있다. go1.5(released 2015/08/19) Minor revisions go1.4(released 2014/12/10) Minor revisions go1.3(released 2014/06/18) Minor revisions go1.2(released 2013/12/01) Minor revisions go1.1(released 2013/05/13) Minor revisions go1 (released 2012/03/28) Minor revisions 시스템개발언어를넘어 Go 언어가처음설계되던때부터정식버전공개전인 2011년까지공식적인프레젠테이션에서밝힌 Go 언어의목표는시스템개발분야였다. 그당시 Go 언어개발팀이프레젠테이션에서밝힌 Go 언어를적용할수있는예상분야는다음과같았다. 웹서버웹브라우저웹로봇검색엔진 Go 언어의탄생 - 019
컴파일러프로그래밍도구 ( 디버깅도구, 분석도구등 ) IDE( 통합개발환경 ) 운영체제 C와비슷한성능을내면서 C/C++ 로개발되어온분야를대체할수있다는설명이었다. 하지만정식버전공개연도인 2012년이다가오면서나온프레젠테이션자료에서는시스템개발에한정하지않고다양한용도의개발에활용할수있다는설명이추가되었다. 실제로공개후 Go 언어를 1년간사용해보니일반개발언어 General Purpose Language 로도손색이없다는피드백이많았다고한다. 구글앱엔진에사용되어다른앱엔진개발지원언어인 Python, Java와어깨를나란히한것을보면과장된표현은아니다. Go 언어를만든롭파이크는 내가써본개발언어중에서가장생산성이높다. 라고자신있게말하기도했다. 구글서비스와의결합 구글 I/O 2011 행사에서 Go 언어와관련한깜짝소식이전해졌다. 바로구글앱엔진에서 Go 언어를지원한다는것이었다. 이전까지구글앱엔진은 Python, Java 이렇게두개언어만을지원하고있었다. 당시에과연언제쯤 Go 언어가상용화될것인가, 구글이언제쯤 Go 언어로자신의서비스를활용할수있게할것인가에대해의견이분분했다. 구글 I/O 2011 행사에서한발표는이러한의문에대한명확한답변이었다. Go 언어가세상에나온지 1년반만에구글서비스와결합하게된사건이었다고할수있다. 처음타깃을구글앱엔진으로잡은것은다른구글서비스보다안전성을확보하기위한작업이가능하기때문으로풀이된다. 안드로이드나크롬관련제품에바로탑재하기에 Go 언어의신뢰성이나완성도가확보되지않은상태였고, 특히 020 -
ARM을지원하는 Go 언어의버전이당시에는아직진행중이었기때문이기도했다. 이유가어찌되었든구글 I/O 2011에서보여준구글서비스와의연동소식이개발자에게깊은인상을심어준것은확실했다. 구글 I/O 2011 이후 Go 언어관련문서가눈에띄게늘어났다. 그내용역시점점정리되었으며개발자의참여도가파른상승세를보였다. Go 언어를이용한프로젝트등록수도급증하는추세를보였다. 그림 5 구글 I/O 2011 로고 02 공식적으로 Go 언어는구글에서만들었다. 하지만필자가 Go 언어가발표될당시 Go 언어홈페이지에올라온자료들을번역해보았을때구글에대한언급을찾아보기힘들었다. 문서에서도최대한구글에대한언급을자제하는분위기였다. 오히려외부의기사를통하여구글과 Go 언어의관계에대해서알게되었다. 외부기사에서구글과 Go 언어의관계에대해설명하지않았다면그관계를파악하지못할정도였다. 개인적으로는구글이 Go 언어의개발주체라기보다개발스폰서같은느낌을받았다. 새로운개발언어의필요성 구글은왜시스템프로그래밍언어를만들었을까? 구글은왜이토록새로운개발 언어를필요로했을까? 02 출처 : https://www.google.com/events/io/2011/ Go 언어의탄생 - 021
구글은현재까지 4년넘게오라클과특허분쟁중이다. Go 언어가세상에나온시기와비슷한시점에오라클과 Java 관련소송이시작되었다. 특히구글을가장곤혹스럽게만드는부분은안드로이드에탑재된 Java다. 오라클은썬을인수하자마자구글을상대로안드로이드에탑재된 Java API에대해라이선스를얻지않고무단으로사용했다며제소했는데, 오라클이주장하는피해금액은 10~60억달러정도다. 해외언론에서는오라클이소송에서구글보다조금더유리한입장이라고보고있다. 소송이시작되면서구글은개발언어와 API에대한기술을갖고있지않을경우자사의서비스를하루아침에중단해야할지도모른다고생각했을것이다. 이러한구글의상황과시대의요구가잘맞아떨어져서 Go 언어에대한지원은더욱탄력을받으리라예상되었다. 그림 6 구글과오라클의특허전쟁 vs 개발자와 Go 언어 타임머신을타고필자가처음회사생활을시작한 2000 년대초로돌아가보자. 그 022 -
당시 MS는그누구도대항할수없는회사였다. MS의윈도우는운영체제시장의대부분을차지했고윈도우를기반으로한개발이대부분이었다. 당시 MS는프로그래밍언어전문가를모아 C# 이라는개발언어를시장에내놓았다. 공식적으로 C# 을적극적으로지원하겠다는메시지도함께보냈다. 개발자라면누구나 C# 관련서적 1~2권쯤은책장에두었다. C# 이 MS의언어이기때문이었다. 물론예전이야기이고지금은상황이많이변했다. MS의힘이전보다많이약해졌고그에따라 C# 의영향력도많이줄어들었다. 다시오늘날로돌아와서필자의하루를살펴보자. 안드로이드폰에서울리는알림으로잠을깨고, 지메일로메일을확인하고행아웃 Hangout 으로친구들과이야기를나눈다. 구글캘린더로일정을관리하고구글검색을통해개발관련자료를얻기도한다. 구글의서비스안에서하루를살아가고있다고해도과언이아니다. 그만큼구글의시장지배력이엄청나다. 이러한구글이새로운언어를만들어발표했다. 이것은바로 2011년에 Go 언어가아직완성되지않았음에도개발자에게큰영향력을끼쳤던이유다. 시대요구 내가지금이세상을살고있는것은 21 세기가간절히나를원했기때문이야. - 조용필의 킬리만자로의표범 중에서 시스템개발환경에초점을두고이야기해보자. 현재의개발환경은 C 언어가처음나온 40년전과많이다르다. 따라서현재의개발환경에적합한개발언어가필요하다. 과거와달라진현재개발환경의특징을요약하면다음의다섯가지로말할수있다. 1 개발속도 ( 하드웨어개발 vs 소프트웨어개발 ) 2 모듈화를위한의존성 Go 언어의탄생 - 023
3 동적타입언어의속성을가진언어 Garbage Collection 4 가비지컬렉션 5 병렬처리 Parallelism 이다섯가지특징을바탕으로 Go 언어에대해살펴보자. 먼저하드웨어의개발속도와소프트웨어의개발속도에대해이야기해보자. 하 드웨어에조금이라도관심이있는사람이라면무어의법칙 Moore s law 에대해들어 본적이있을것이다. 하드웨어관련법칙중에가장많이인용되는것이바로무 어의법칙이다. 무어의법칙이란마이크로칩에저장할수있는데이터의양이매 년또는적어도 18 개월마다두배씩증가한다는법칙이다. 무어가처음이법칙을이야기한것은 1965 년강연에서였다. 이후하드웨어는 8 비트부터 64 비트까지, 싱글코어에서듀얼코어를지나쿼드코어까지다양하게발 전해왔다. 하지만정작이하드웨어의성능을제대로발휘하게하는소프트웨어 의발전속도는더디기만했다. 이를개발언어의탓으로돌리기에는무리가있겠 지만현재의하드웨어를지원할수있게설계된시스템프로그래밍언어가필요하 다는것에는충분히공감할것이다. 그런면에서 Go 언어는멀티코어환경을고 려하여설계했기때문에기존개발언어보다현재의하드웨어에맞게설계된편에 속한다. 현대개발환경에적합한언어가되려면모듈화가쉬워야한다. 모듈화를쉽게하 기위해서는의존성 Dependency 과컴파일속도가중요하다. 파일수가 500 개이상 인규모의 C/C++ 로개발하는프로젝트에참여한경험이있는개발자라면빌드 시간에얽힌추억들이꽤있을것이다. 이런경험들을재미있게표현한 컴파일 Compiling 이라는제목의만화도있다. 024 -
그림 7 컴파일 (Compiling) 03 C 언어에서컴파일시간이많이소요되는이유는실제빌드에필요하지않은파일까지접근해서읽기때문이다. 이해를돕기위해 C/C++ 에서기본헤더파일을포함하는경우컴파일할때얼마나많은파일에접근하여작업이수행되는지에대한실험결과를소개한다. [ 표 1] 은 2011년당시 Go팀에서발표한자료로, 맥 OS X 10.5.8에서 gcc4.0.1을이용하여테스트한결과다. 표 1 C/C++ 컴파일시의존성테스트결과 개발언어 기본헤더파일 (#include) 필요한처리 C stdio.h 9개파일에서 360라인읽기 C++ iostream 131개파일에서 25,326라인읽기 Objective C Carbon/Carbon.h 689개파일에서 124,730라인읽기 C 언어의컴파일에서나타나는의존성은모듈화를어렵게하는요소다. 또한, 단위테스트와같이빠른피드백을얻어야하는경우컴파일에걸리는시간이길어져피드백을받는주기도함께길어진다. 이는모듈화를어렵게할뿐아니라개발자의단위테스트를힘들게만드는환경요소라할수있다. 03 출처 : https://xkcd.com/303/ Go 언어의탄생 - 025
그렇다면 Go 언어에서는어떻게이문제를해결할까? [ 코드 1] 을보면 Hello World 소스에서 import "fmt" 의경우 fmt 모듈 1 개만참조한다. [ 코드 1] Go 언어로작성한 Hello World package main import "fmt" func main() { fmt.println("hello, World") } Go 의의존성과빌드에대해간략히소개하면다음과같다. 의존성가정 a.go b.go c.go(a B : A 는 B 에의존성을가진다.) 빌드순서 c.go, b.go, a.go( 순서대로빌드 ) Go 의의존성 a.go 를빌드하는경우 b.go 만참조한다 대표적인동적언어로는 Python과 JavaScript를꼽을수있다. 동적언어속성은개발코드가간결해지고개발자의귀찮은코딩작업을최소화하여개발자가개발에재미를느낄수있게한다. 하지만동적언어는정적언어처럼에러발생을사전에검증하는처리가부족해서해당코드가실제로실행될때에러에직면하게되는문제가있다. 다시말해, 안전성이보장되지않는다는것이단점이다. Go 언어는정적타입언어 Statically Typed Language 이지만동적타입언어 Daynamically Typed Language 속성을지원하도록설계되었다. 컴파일시점에컴파일러에의해지원되는것이특징이다. 정적타입언어의특징인타입의안전성을가지고있으면서코딩시동적언어의특징도함께가지고있다. C 개발자를골치아프게하는것중에포인터, 메모리할당과해제가있다. Go 언어는포인터에관한문제점을제거하기위해포인터는제공하되포인터연산은제공하지않는다. 메모리할당과해제에대해가비지컬렉션 Garbage Collection 을제공하는경우메모리해제에대해개발자가신경쓰지않아도된다. 특히동시성 026 -
Concurrency 관련개발을할때메모리할당과해제는개발을어렵게하는요소다. 동시성을언어차원에서제대로지원하기위해서는가비지컬렉션이반드시필요하며 Go 언어는이를완벽하게지원한다. 가비지컬렉션은 Java도지원하는기능이다. 하지만 Java의경우 VM Virtual Machine 에서가비지컬렉션을제공하는것과달리 Go 언어는빌드되어나온결과실행파일에서이를지원한다는것이다르다. 최근안드로이드기기의트렌드는멀티코어다. 물론앞으로네개이상의코어를갖는기기가기본스펙으로자리잡을것으로예상한다. C/C++ 는멀티코어를고려하여설계된개발언어가아니다. 40년전에멀티코어를미리고려해서언어를설계할수는없었을것이니말이다. 그러므로 C/C++ 로병렬처리가가능한프로그램을작성하는데에는많은노력이든다. 멀티코어환경에서개발할경우단순히하드웨어의병렬처리뿐아니라소프트웨어레벨에서동시성도함께고려해야한다. Go 언어는설계단계에서멀티코어를지원하는개념을도입했다. 그결과멀티코어환경에서안전하고쉽게개발하는방법을제공하고있다. Go 언어의뿌리를찾아서 Go 언어는공식적으로 C 계열언어다. B 언어와 C 언어를만들었던켄톰슨이 Go 언어를만들었으니어찌보면당연하다. 게다가현재가장널리사용되는언어가 C 언어이므로이를완전히뒤집고새로운형태의언어를만드는것은어렵기도하고효용도적을것이다. Go 언어를만든멤버들은 Go 언어를구상할때 C 언어를기반으로현존하는개발언어의장점을의미있게접목하고싶어했다. 일부문법은파스칼 Pascal 에서빌려왔으며 Go 언어의중요특징인동시성은 Newsqueak의영향을받았다. Newsqueak은 Go 언어를만든멤버중에한사람인롭파이크의작품으로, C 와 CSP의영향을받았다. Newsqueak은롭파이크가 C 언어문법에서동시성 Go 언어의탄생 - 027
을지원하는언어를만들려고오랫동안연구한결과이기도하다. 그림 8 Go 팀원의기술전문분야 Compiler Language OS Concurrency Java Hotspot 그림 9 Go 언어에영향을준언어들 B C Pascal /Modula/ Oberon Newsqueak /Limbo Go 지금까지 Go 언어가정식으로공개되기까지 (2012 년 ) 있었던일을정리해보았다. Go 언어에대한글을읽고이해하는데필요한배경지식이갖춰졌다. 이제다음 으로넘어가보자. 028 -