Go의 효능
박한나(Hannah Park)
~마을의 위기를 막다~
“세상의 어둠을 행복으로 밝혀주는 달빛처럼🌃”
⋅ 컴퓨터공학 & 예술공학 전공(24년 2월 졸업 예정)
⋅ HCIK 2022 Creative Awards: 인터랙티브 미디어 아트 ‘초록별 4543호'
⋅ ISMIR 2022 Music Program & KCI 저널: 딥러닝을 활용한 시나위 생성 및 연주 퍼포먼스 ‘Fantastic AI Sinawi’
⋅ HCIK 2024 Creative Awards: 표정인식 AI 웹캠 어플리케이션 ‘PHOTOWAVE’(게재 예정)
💌: hannah@crescent.dev
🧭: crescent.studio 💕: 茶, 사진, 제빵
Speaker!
박한나 (Hannah Park)
Why I learned Go
Go언어의 효능 ~Node.js마을의 위기를 막다~
Thanks to
창희님 (Changhui Lee), Golang enthusiast
Thanks to
종서님 (Jongseo Lee), 생계형 Go 사용자
여기 주인공 세나가 있습니다.
Illustration: いらすとや
세나는 프로그래밍 언어 중에서 Go를 좋아하는 대학생입니다.
어느 한 평범한 날, 평소와 같이 책을 읽으며 걷던 그가 횡단보도에 건너다가
Written by. Hannah Park w/ ChatGPT
이게 무슨 일이야? ㅇ...여긴 어디야?
세나
당신은 선택 받았습니다.
신비한 목소리
위기로 혼란에 빠진 이세계를 구해주세요.
신비한 목소리
당신의 지식과 기술이 새로운 세계를 구할 열쇠입니다.
신비한 목소리
뭐라고요?
세나
정신을 차린 세나는 이세계의 마을에 도착해 있었습니다.
세나는 금방 적응했고, 마을 사람들의 컴퓨터 사용을 도움 주며 평화롭게 지냈습니다.
우와! 컴퓨터 한다! 지금 어떤거 코딩해요??
마을 닌자
Go언어로 코딩하고 있어!
세나
Go? 그게 무엇인가요?
마을 닌자
Go?
Here We Go~
Go?
정적 타입의 컴파일 언어
Go?
C와 같은 강력한 기능
+ Python 같은 동적 타입 언어의 간결한 문법
C Based Language
메모리 수동 관리를 지원 + 시스템 프로그래밍에 사용 가능
But, It has a Garbage Collector
메모리 관리가 자동으로 이루어지므로 별도로 신경 쓸 필요가 없음
(C언어에서는 free()를 통해 메모리를 직접 해제)
Go?
빠른 성능 & 강력한 동시성 처리 능력
History
옛날 옛적에…
Gopher illustration by Renee French
History
2006년: 최초의 듀얼코어 프로세서 소비자용 출시
But, 그 당시의 모든 프로그래밍 언어는 싱글코어만 활용하도록 설계.
History
2007년: 멀티코어 지원 & C++의 복잡성에 대한 대안으로 새로운 언어 개발 시작
(Robert Griesemer, Rob Pike, Ken Thompson)
Go?
2009년: Google Tech Talks에서 소개
Go?
2012년 3월: 오픈소스로 Go배포
그런데 갑자기 용이 마을에 침입했다.
나. 너무. 심. 심. 해!!!!!!!!!!!!
나랑도 놀아줘!!!!
드래곤
나 너무 심심하다.
세나
세나님, 저희를 살려주세냥.
고양이
나 너무 심심하다.
세나
어떤 수단을 동원 해서라도 저희를 구해주세요.
청년
네. 제가 Go를 이용해서 해결해 보겠습니다.
세나
1. 게임은 AI와 플레이어가 번갈아가며 진행한다.
2. 게임은 5라운드로 진행된다.
3. 라운드가 1. 게임은 AI와 플레이어가 번갈아가며 진행한다.
2. 게임은 5라운드로 진행된다.
3. 라운드가 진행하면 AI와 플레이어가 1장씩 동시에 카드를 냄으로써 진행된다. 승리가 결정될 때까지 카드를 낸다.
4. 카드는 'Apple', 'Banana', 'Grape', 'Pineapple', 'Strawberry' 5가지 종류가 있다.
5. 임의의 시간이 지난 후 AI와 플레이어가 모두 같은 과일 카드를 갖게 된다면, `b`(bell)를 눌러 종을 치며 승리한다.
6. 시간 안(0.2초부터 2초 사이의 랜덤, )에 종을 치지 못하면 AI가 종을 치게 되어 플레이어가 패배한다.
7. 게임은 총 5라운드로 진행되며, 5라운드가 끝나거나 `q`를 누르면 게임이 종료된다.
진행하면 AI와 플레이어가 1장씩 동시에 카드를 냄으로써 진행된다. 승리가 결정될 때까지 카드를 낸다.
4. 카드는 'Apple', 'Banana', 'Grape', 'Pineapple', 'Strawberry' 5가지 종류가 있다.
5. 임의의 시간이 지난 후 AI와 플레이어가 모두 같은 과일 카드를 갖게 된다면, `b`(bell)를 눌러 종을 치며 승리한다.
6. 시간 안(0.2초부터 2초 사이의 랜덤, )에 종을 치지 못하면 AI가 종을 치게 되어 플레이어가 패배한다.
7. 게임은 총 5라운드로 진행되며, 5라운드가 끝나거나 `q`를 누르면 게임이 종료된다.
Go and Stop
Go and Stop: command line game
Inspired by Halli Galli(할리 갈리)
용이 마음에 들어하는 눈빛이다.
마음에 든 용은 마을에서 사라졌고, 마을에 평화가 다시 찾아왔다.
저 세나님처럼 Go를 배우고 싶어요.
마을 농사꾼
그런데 Go를 배우게 된다면 문법적으로 어려움을 많이 갖게 될까요?
저는 다른 프로그래밍 언어를 조금 할 줄 알아요.
마을 농사꾼
Number of Keywords in Go
🤔
Q. Go의 키워드는 몇 개일까요?
(hint: 키워드: 구문 분석 할 때 특별하게 처리하는 단어, JavaScript에서는 var, if, for, ... )
C(C99): 37
C++(C++20): 92
Go: 25
Java(SE 17 LTS): 67
JavaScript(6th ): 46
Python 3(3.10): 38
Rust(1.46): 53
Variable declaration
작고 다양한 타입이 존재
Variable declaration in Go
Go: 정적 타입 언어.
변수의 타입을 미리 지정해야 하고 변수의 타입을 바꿀 수 없다.
[Go]
[JavaScript]
cannot use "twenty" (untyped string constant) as int value in assignment
Variable declaration
1) Go는 타입 추론으로 변수의 데이터 타입을 결정한다.
∴ 따라서 변수 x의 선언은 문제가 없다.
2) 초기값을 제공하지 않으면 해당 타입의 기본값(0/""/false)으로 초기화
Variable declaration - Short variable declaration
★ Go에서 권장하는 방식 ★
[Go and Stop] Variable declaration
fruits: 전역변수이므로 Short variable declaration 사용 불가
초기값을 제공하지 않은 score:
score.Player, score.AI가 각각 int의 기본값인 0으로 초기화
Type conversions
다른 Type 요소 간의 할당에서 명시적인(explicit) 변환을 필요로 한다.
[Go]
[C/C++]
Function declaration
함수는 0개 혹은 그보다 많은 인자를 받을 수 있으며
변수 이름 뒤에 type이 온다.
[Go]
[TypeScript]
Function declaration
만약 함수 인자가 2개 이상이며 연속적으로 나열된 인자가 같은 타입일 때
마지막 인자에만 타입을 명시해도 된다.
Function declaration - Multiple return values
함수는 반환 값을 여러 개 가질 수도 있다.
[Go]
[Python]
[Go and Stop] Function declaration
함수 반환값이 없는 경우도 가능하다.
Function declaration - Anonymous function
익명 함수와 함수 표현식 또한 지원한다.
[Go]
[JavaScript]
Flow control - Conditional statement
[Go]
[JAVA]
★ 중괄호 필수 ★
syntax error: unexpected newline, expected { after if clause
Flow control - `if` with a short statement
조건 앞에 short statement로 시작해 실행할 수 있다.
이렇게 선언된 변수는 if 문이 끝날 때까지만 범위 내에 존재한다.
[Go]
[C++17↑]
Flow control - Loop
initial statement: 첫 번째 반복(iteration) 전에 실행
condition expression: 모든 반복 전에 평가
post statement: 모든 반복이 끝날 때마다 실행
[JavaScript]
[C/C++]
[Go]
Flow control - Loop
initial statement, post statement은 옵션
C, JAVA, JavaScript 등 다른 언어들과 달리
세가지 구성 요소를 감싸는 괄호가 없고
★ 항상 {중괄호}가 필수 ★
Flow control - `for` is Go’s `while`
세미 콜론(;) 생략을 통해
C에서의 `while`은 Go에서는 `for`로 쓰인다.
Flow control - Infinity loop
condition expression을 생략하면 무한 루프 생성 가능하다.
Flow control - break, continue, goto
break: 빠져나올 때 사용
continue: for의 루프 시작으로 이동
goto: 특정 레이블로 이동
[Go and Stop] Flow control
bool 형식으로 리턴하는 processRoundInput 값에 따라
for loop 이 진행할 수도, 빠져나갈수도 있다.
[Go and Stop] Flow control
github.com/eiannone/keyboard 라이브러리 이용, 키보드 입력 지속적 감지
Error Handling
throw/raise를 통해 상위 함수(레벨)로 전파하는 것이 아닌
Go는 항상 Error를 체크해서 처리하는 컨벤션을 가지고 있다.
[Go]
[JavaScript]
defer
앞에 defer를 붙이면 해당하는 줄이 함수가 끝나고 실행된다!
defer가 여러 개 있으면 나중에 선언한 defer문부터 실행한다.
(LIFO)
defer(Go) vs try-finally(Python, JavaScript)
[JavaScript]
[Python]
[Go]
defer: 함수 종료 시 자동으로 실행, 예외 발생 여부에 관계없이 작업을 보장
자원 할당과 해제 코드를 가까이 배치해 관리를 용이하게 한다
[Go and Stop] defer
defer를 통해 키보드 입력 받는 것을 끝낸다
github.com/eiannone/keyboard 키보드 입력을 쉽게 받을 수 있는 라이브러리
Channel
채널 연산자 `<-`를 사용하여 goroutine을 연결해주는 통로(파이프)
양방향이며 동일한 채널로 데이터 주고받기 가능하다
Figure: stevenrojasl.medium.com
[Go and Stop] Channel
keyPresses을 Channel에 키보드로 입력한 값을 넣는다.
[Go and Stop] Channel
processRoundInput:
채널 keyPresses을 활용, 그 값에 따라 게임을 진행 여부 결정
true: 게임 종료
false: 라운드만 종료
`select`
여러 채널의 I/O 작업을 동시에 기다림 + 준비된 작업을 실행하는 조건 분기 구문
복수의 채널 간의 비동기적 통신을 관리하는데 사용한다.
[Go and Stop] Channel & Select
playRound:
채널 keyPresses을 활용, 그 값에 따라 게임을 진행 여부 결정
시간이 지남 & 같은 카드 = AI 승
Go의 🌻: goroutine
고루틴은 Go언어에서 독립적으로 동시에 실행하는 함수이다.
프로그램 내의 모든 동시 활동을 나타낸다.
Light-weight thread
일반 스레드보다 생성 비용이 적어 ‘경량 스레드’라 부른다.
모든 Go 프로그램은 최소 하나의 고루틴(main 함수)을 포함한다.
Avoid race condition
어?
data = 0
a = data
b = data
a += 1
b += 1
data = a
data = b
∴ 연산 순서가 겹치고 꼬인다
Avoid race condition: Goroutine & Channel
<- 100,000개의 채널 만들기
<- 각 채널이 1씩 값을 담음
<- 100,000개의 채널 속 모든 값을 data에 더하기
Avoid race condition: `sync.WaitGroup`
마치 like Promise.Resolve(JS)
<- 기다릴 것 다 끝났어요~~
<- 한번에 한 스레드만 읽고 쓰게 잠그기
<- 기다릴 것 1개 추가
<- 끝장나게 기다리기
[Go and Stop] Goroutine & Channel
handleKeyPresses:
키보드 입력을 비동기적으로 감지하여 keyPresses 채널로 전송 & 키 입력 오류 시 종료
그런데 Go를 배우게 된다면 문법적으로 어려움을 많이 갖게 될까요?
저는 다른 프로그래밍 언어를 조금 할 줄 알아요.
마을 농사꾼
그래서 Go의 효능이 뭔가요?
마을 닌자
Go의 효능: Multi-core processing
멀티 코어 활용으로 고성능 어플리케이션 구축 가능(대규모 데이터 처리, 실시간 시스템, ...)
시스템 자원을 효율적으로 활용 가능
클라우드 및 분산 시스템에서의 확장성 향상
Go의 효능: Concurrency & Parallelism
여러 작업이 시간을 공유하며 실행되는 동시성(concurrency)와
여러 작업이 병렬적으로 실행되는 병렬성(parallelism)을
`goroutine`을 통해 아주 쉽게 해냄
Figure: dev.to/harinathar
Google이 운영하고 있는 정도의 거대한 스케일의 웹 서비스에 매우 효엄적
(HTTP, TCP, UDP와 같은 네트워크 프로그래밍에도 효엄적)
Figure: dev.to/harinathar
Go in use: [ethereum/go-ethereum]
블록체인은 보안, 성능, 동시성 및 안정성이 중요
Go는 Garbage collection, 컴파일 시 타입 검사 수행,
메모리 접근의 엄격한 규칙 등을 통해 메모리 안정성 제공
Figure: dev.to/harinathar
그렇게 주인공은 Go의 강점을 활용하여 마을의 위기를 해결했고,
마을 사람들은 새로운 프로그래밍 언어의 가능성을 깨닫게 되었다.
세나는 현실 세계에 가서 더욱 열심히 Go를 공부했다고 한다.
-끝-
잠깐! 시선을 멈추세요!
저는 Go의 초승달 담당입니다.
프로그래밍 언어를 배워본 경험이 있는 당신이라면 Go를 도전 해보세요!
간결한 문법을 쉽게 익힐 수 있으며, 고루틴이 당신의 비동기를 축복할 것입니다.
Summary
Q & A
Thank you!
Special Thanks to: 삼월초하루 & 임권영