mspring03 / go-for-GO

(정리) Golang의 기초 문법 및 알고리즘부터 자료구조 및 마이크로서비스 개발까지! (MD + 개인 프로젝트)

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Go는 어떤 언어인가?

Go빠른 성능, 안정성, 편의성, 쉬운 프로그래밍을 목표로 개발되었고 시스템 프로그래밍부터 웹 어플리케이션 개발까지 여러 분야에서 여러 용도로 사용된다.



Go언어의 특징

  • 간결하고 유연한 문법
  • 병행 프로그래밍
  • 정적 타입 언어
  • 동적 프로그래밍
  • 쉬운 협업
  • 가비지 컬렉션(Garbage Collection) 제공
  • 빠른 컴파일과 실행 속도


간결하고 유연한 문법

  • 언어의 기능이 많고 복잡하면 문제해결하는 것보다 기능이해하고 익히는 것더 많은 시간을 할애해야 한다.
  • 따라서 Go간결하고 명확한 문법에 중점을 두고 설계됐다. 그래서 코드가 단순해졌고 가독성이 높아졌다.
  • Go를 사용하면 기억하기 쉬운 키워드 몇몇만으로도 규모가 큰 어플리케이션을 구현할 수 있다.

언어별 키워드 수 KeywordsGraph



병행 프로그래밍

  • 지난 30여 년간 CPU의 성능무어의 법칙대로 18개월마다 2배씩 빨라졌다.
  • 하지만 한계에 부딪힌 후, 컴퓨터 하나CPU 여러 개를 장착해서 CPU 여러 개동시에 계산을 수행하게 된다.
  • 따라서 소프트웨어도 이러한 멀티 코어 전략에 영향을 받아 병행 또는 병렬 처리를 지원하는 것이 필수 조건이 되었다.

인텔 프로세서의 트랜지스터 집적수 성장과 무허의 법칙 TransistorGraph


  • 따라서 Go 언어를 설계할 때 특별히 중점을 둔 부분이 바로 병행 처리이다.
  • Go의 병행 처리 방식통신 순차 프로세스(Communicating Sequential Processes, CSP) 방식에 근간을 둠.
  • 즉, 메모리를 공유하는 것이 아니라 메세지를 전달하는 방식으로 동기화한다.

고루틴과 채널 GoRoutine

  • 동시에 처리해야 하는 작업은 고루틴으로 실행하고, 고루틴끼리 메세지주고 받는 작업채널이라는 통로를 사용한다.
  • 고루틴은 Go 프로그램 안에서 동시에 독립적으로 실행되는 흐름의 단위로, 스레드와 비슷한 개념이다.
  • 하지만 스레드와 달리 매우 적은 리소�스에서 동작하므로 한 프로세스수천, 수만 개의 고루틴을 동작시킬 수 있다.


Static + Dynamic


정적 언어와 동적 언어 DynamicStatic


  • 위의 사진과 같이 언어는 동적 타입정적 타입으로 나눠져있다.
  • rudy, python과 같은 동적 타입 언어개발 속도가 빠르지만 컴파일 과정불안전하다는 특징을 가지고 있다.
  • 반면에, c/c++과 같은 정적 타입 언어컴파일은 매우 안정적이지만 개발 속도는 느려진다는 특징을 가지고 있다.
  • 따라서 Go 언어는 동적 언어의 개발 속도와 정적 언어의 안정성, 두 장점을 모두 수용하고 있다.

동적 언어의 개발 속도와 정적 언어의 안정성을 갖춘 Go 언�어 Dynamic+Static


  • Go는 컴파일 기반정적 타입 언어이다.
  • 하지만 동적 언어의 특성도 수용함으로써 동적 언어의 유연함과 자유를 만끽할 수 있다.
  • 이를 가능하게 해주는 것이 바로 덕 타이핑(duck typing)방식으로 동작하는 Go의 인터페이스다.


가비지 컬렉션(Garbage Collection)

  • C나 C++ 같은 언어는 가비지 컬렉션을 제공하지 않아서 개발자가 직접 메모리관리해야 한다.
  • 하지만 이러한 메모리 할당하고 해제하는 작업은 까다롭고 디버깅도 어려워서 많은 시간할애해야 한다.
  • 하지만 Go 언어가비지 컬렉션제공하므로 메모리 관리보다 문제 해결에 더 집중할 수 있다.


빠른 컴파일과 실행 속도

  • 2003년 켄트벡이 TDD(Test Driven Development) 를 주장한 이후 TDD의 중요성은 계속 강조되고 있다.
  • TDD는 '테스트 코드 작성(red) > 코드 완성으로 테스트 성공(green) > 리펙토링(refactor)' 사이클로 개발된다.
  • 이러한 TDD는 코드가 수정될 때 마다 수정된 코드를 컴파일 하고 실행하는 것을 전제로 한다.
  • 따라서 프로그램 규모가 커질 수록 컴파일 과정전체 사이클느리게 한다.

TDD의 개발 사이클 TDDCycle


  • 하지만 Go빠른 성능을 목표로 개발됐고 개발 초기부터 빠른 실행 속도에 초점을 두었다.
  • 따라서 Go는 패키지화된 소스 코드에서 실제도 사용되는 부분컴파일하므로 컴파일 속도가 빠르다.
  • 이렇게 최적화된 컴파일 방식이라 아무리 큰 규모의 프로젝트라도 대부분 수 초 이내 컴파일이 완료된다.

About

(정리) Golang의 기초 문법 및 알고리즘부터 자료구조 및 마이크로서비스 개발까지! (MD + 개인 프로젝트)


Languages

Language:Go 99.1%Language:Gherkin 0.5%Language:Makefile 0.3%Language:Dockerfile 0.1%