Go의 역사
Go는 최근의 유명세를 탄 것에 비해 생각보다는 오래전에 만들어졌습니다. 2007년 9월 21일에 로버트 그리즈머, 롭 파이크, 켄 톰슨이 인페르노라는 분산 운영체제(위키백과: 인페르노)와 관련된 작업을 하다가 화이트 보드에 새로운 언어에 대한 스케치를 하면서 구상되었다고 합니다. 구글의 직원들은 업무시간 중 20%를 파트타임 프로젝트라고 주요 업무와는 무관한 별도의 다른 프로젝트를 수행할 수 있는 제도가 있습니다. Go언어는 이 제도로 만들어진 대표적인 프로젝트입니다.
2008년 1월, 켄 톰슨이 Go 스펙으로 만들어진 코드를 C 코드로 변환하는 컴파일러를 만들기 시작했고, 2008년 중반에는 구글의 공식적인 풀타임 프로젝트로 승격되었습니다. 2008년 5월 이안 테일러는 Go 스펙의 초안을 이용해서 GCC 프론트엔드를 만들기 시작했고, 2008년 말 러스 콕스가 참여하면서 프로토타입에서 실질적인 언어와 응용 프로그램을 쉽게 만들 수 있도록 도와줄 기본적인 라이브러리들이 만들어지기 시작했습니다.
2009년 11월 10일에 리눅스와 Mac OS X에서 동작하는 최초의 버전이 공식 발표되었으며, 출시 직후에는 실용성이 떨어진다는 평가도 있었지만, 반년정도 지난 뒤에는 구글 내부에서 실제로 사용되고 있다고 알려지기도 했습니다.
현재 Go는 점점 더 그 세력을 확장하고 있으며, 몽고DB, 트위치, 우버 등 많은 상용 서비스들이 활용하고 있다고 합니다. 구름의 서비스 인프라 쪽에서도 Go를 사용하고 있죠.
WHY Go?
개발자들은 Go를 개발하면서 간단하고 간결한 직관적인 언어를 지향했습니다. Go는 C언어 기반으로 C++와 Java, Python의 장점을 뽑아 개발되었습니다. Go는 객체지향 프로그래밍(OOP, Object Oriented Programming)을 지원하는데 이 말은 우리가 객체지향 프로그래밍에서 흔히 알고있는 클래스, 객체, 상속의 개념이 없다는 것을 의미합니다. 그리고 Go에서 쓰이는 키워드는 Java에 절반 수준인 25개밖에 되지 않습니다. 또한, Go는 컴파일 언어지만 컴파일러의 컴파일 속도가 매우 빠르기 때문에 인터프리터 언어처럼 쓸 수 있습니다. 물론 컴파일 언어이기 때문에 인터프리터 언어보다는 빠르지 않지만 인터프리터 언어 이상의 성능을 감안했을 때 굉장히 큰 효율을 보여줍니다. 그리고 프로그래밍 언어 순위를 확인할 수 있는 사이트인 https://www.tiobe.com/를 참고했을 때 최근 가장 "핫"한 언어임을 알 수 있습니다. 역사가 있는 쟁쟁한 언어들 사이에서 2018년 9월 현재 17위를 기록하고있고 2016년 올해의 언어로 뽑힌적도 있습니다.
Go언어 는 단일 파일로 떨어지는 실행 결과물을 장비에 따로 설치하는 것이 없어 외부 의존성에 대한 버전을 신경쓰지 않아도 돼서 실행이 쉽습니다. 물론 컴파일 언어이기 때문에 타겟 장비에 맞도록 '크로스 컴파일'을 해야합니다. 각 장비에 맞는 단일 실행 파일만 있으면 어디서든 동작해 개발자를 위한 개발 툴을 만들 때 좋습니다. 또한, 위에서도 언급했다시피, Go언어는 코드가 굉장히 간결합니다. 따라서 코드량 자체가 줄어들고 가독성이 좋습니다. 사용하면서 가장 눈에 띄는 특징은 바로 강력한 내장 라이브러리입니다. 최근에 나온 언어답게 내장 라이브러리가 굉장히 탄탄합니다. 추가 라이브러리나 프레임 워크 없이도 http 서버도 쉽게 만들 수있습니다. 자바의 경우 스레드 개수가 성능과 직결되어 항상 신경써야했는데 Go언어에서 사용하는 고루틴의 경우에는 엄청나게 많은 수를 사용해도 괜찮아 부담이 없습니다.
Go의 특징
Go는 정적 타입 컴파일 언어의 효율성과 동적 언어처럼 쉬운 프로그래밍을 할 수 있도록 하는 것을 목표로 합니다. 눈에 띄는 특징들로는
- 정적 타입 : 자료형에 형이 정해져 있음
- 강타입 : 자료형 변환(타입캐스팅)이 항상 명시되어야 함
- 안전성 : 타입 안전성과 메모리 안전성
- 병행성 : 스레드를 한 단계 더 추상화한 '고루틴'이라는 개념 사용
- 가비지 컬렉션 : 결과물에 go runtime이 내장되는데 go run time이 메모리를 핸들링
- 컴파일 언어 : 인터프리터 언어가 아니지만 근접한 수준의 빠른 컴파일
- 포인터는 존재, 하지만 포인터 연산은 없음
들이 있습니다.
Go언어에는 아래와 같이 없는 것도 있습니다.
- 클래스
- 상속
- 생성자
- final
- 제네릭
Go의 문법
Go의 문법은 대체로 C와 비슷합니다. 코드 블록들은 중괄호로 둘러싸고 for
, switch
, if
를 포함한 일반적인 제어구조를 가지고 있습니다. C와 다르게, 한 라인 끝의 세미콜론은 필수가 아닌 옵션입니다. 변수 선언은 다르게 작성되고 대개 옵션입니다. 형변환은 명시적으로 해야 합니다. 병행성 프로그래밍을 다루기 위해 go
와 select
키워드가 사용됩니다. 새로운 타입은 map
, 유니코드 문자열, 배열 slice
, 그리고 내부 쓰레드 통신을 위한 channel
이 있습니다.
Go는 그리 좋지 않은 하드웨어에서도 빠르게 컴파일될 수 있도록 디자인되었습니다. Go는 가비지 컬렉션 기능이 있는 언어입니다. 병행성(concurrency)와 관련된 Go의 구조적인 규칙들(channel과 선택적인 channel input들)은 Tony Hoare의 CSP로부터 가져온 것입니다.
위에 언급한 것처럼 C++이나 Java에 있는 기능들 중 타입 상속, 제너릭, assertions, 메서드 오버로딩, 포인터 연산은 Go에서 포함하고 있지 않습니다. Go를 만들고 있는 개발자들은, 제너릭 등은 급하진 않지만 어느 시점에는 기능이 들어갈 거라고 합니다.
병행성
Go를 이용해 프로그램들이 서로 소통하면서 상태를 공유하는 동시성(concurrency) 프로그램을 쉽게 만들 수 있습니다. 동시성이란 멀티쓰레딩, 병렬 컴퓨팅 뿐 아니라, 비동기성 입출력 또한 포함합니다. 예를 들어, 이벤트 기반 서버와 같이, 데이터베이스나 네트워크 작업과 같이 시간이 많이 걸리는 연산을 하는 동안 프로그램이 다른 일을 하는 것을 말합니다.
Go 웹 프레임워크
Go는 웹 프로그래밍의 프래임 워크 언어로 많이 사용되고 있다. 현재 여러 프래임워크들이 개발중에 있고 아래 목록은 현재 사용되는, 혹은 개발되고 있는 프레임 워크들입니다.
적용 가능 분야 및 대표적인 프로젝트
Go언어는 현재 아래왁 같은 다양한 프로젝트의 개발 언어로서 사용되고있습니다.
도커(Doker), 곡스(Gogs: Go Git Service), 퀴베르네시스(Kubernetes), Etcd & Fleet, 데이스(Deis), 플린(Flynn), 라임(Lime), 싱크띵(Syncthing), 레벨(Revel), 인플럭스DB(InfluxDB)
그리고
- 웹 서버
- 웹 브라우저
- 웹 로봇
- 검색 엔진
- 컴파일러
- 프로그래밍 도구
- 운영체제
의 개발 언어로서 사용 가능합니다.
이 강의의 출처들
강의에 나오는 기본 예제들 중 일부는 https://gobyexample.com/ 를 참고하였습니다.