1 of 100

Go의 효능

박한나(Hannah Park)

~마을의 위기를 막다~

2 of 100

“세상의 어둠을 행복으로 밝혀주는 달빛처럼🌃”

⋅ 컴퓨터공학 & 예술공학 전공(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)

3 of 100

Why I learned Go

4 of 100

5 of 100

6 of 100

Go언어의 효능 ~Node.js마을의 위기를 막다~

7 of 100

  • 저에게 Go 공부할 수 있도록 힘을 주셨음 🔥
  • 발표 내용 검수
  • github: @blurfx
  • blog: xo.dev

Thanks to

창희님 (Changhui Lee), Golang enthusiast

8 of 100

  • 茶 친구
  • 발표 내용 검수
  • github: @leejseo
  • personal website: leejseo.com

Thanks to

종서님 (Jongseo Lee), 생계형 Go 사용자

9 of 100

10 of 100

여기 주인공 세나가 있습니다.

Illustration: いらすとや

11 of 100

세나는 프로그래밍 언어 중에서 Go를 좋아하는 대학생입니다.

12 of 100

어느 한 평범한 날, 평소와 같이 책을 읽으며 걷던 그가 횡단보도에 건너다가

13 of 100

14 of 100

15 of 100

Written by. Hannah Park w/ ChatGPT

16 of 100

이게 무슨 일이야? ㅇ...여긴 어디야?

세나

17 of 100

당신은 선택 받았습니다.

신비한 목소리

18 of 100

위기로 혼란에 빠진 이세계를 구해주세요.

신비한 목소리

19 of 100

당신의 지식과 기술이 새로운 세계를 구할 열쇠입니다.

신비한 목소리

20 of 100

뭐라고요?

세나

21 of 100

22 of 100

정신을 차린 세나는 이세계의 마을에 도착해 있었습니다.

23 of 100

세나는 금방 적응했고, 마을 사람들의 컴퓨터 사용을 도움 주며 평화롭게 지냈습니다.

24 of 100

우와! 컴퓨터 한다! 지금 어떤거 코딩해요??

마을 닌자

25 of 100

Go언어로 코딩하고 있어!

세나

26 of 100

Go? 그게 무엇인가요?

마을 닌자

27 of 100

Go?

Here We Go~

28 of 100

Go?

정적 타입의 컴파일 언어

29 of 100

Go?

C와 같은 강력한 기능

+ Python 같은 동적 타입 언어의 간결한 문법

30 of 100

C Based Language

메모리 수동 관리를 지원 + 시스템 프로그래밍에 사용 가능

31 of 100

But, It has a Garbage Collector

메모리 관리가 자동으로 이루어지므로 별도로 신경 쓸 필요가 없음

(C언어에서는 free()를 통해 메모리를 직접 해제)

32 of 100

Go?

빠른 성능 & 강력한 동시성 처리 능력

33 of 100

History

옛날 옛적에…

Gopher illustration by Renee French

34 of 100

History

2006년: 최초의 듀얼코어 프로세서 소비자용 출시

But, 그 당시의 모든 프로그래밍 언어는 싱글코어만 활용하도록 설계.

35 of 100

History

2007년: 멀티코어 지원 & C++의 복잡성에 대한 대안으로 새로운 언어 개발 시작

(Robert Griesemer, Rob Pike, Ken Thompson)

36 of 100

Go?

2009년: Google Tech Talks에서 소개

37 of 100

Go?

2012년 3월: 오픈소스로 Go배포

(Go version 1 is released)

38 of 100

그런데 갑자기 용이 마을에 침입했다.

39 of 100

나. 너무. 심. 심. 해!!!!!!!!!!!!

나랑도 놀아줘!!!!

드래곤

40 of 100

나 너무 심심하다.

세나

세나님, 저희를 살려주세냥.

고양이

41 of 100

나 너무 심심하다.

세나

어떤 수단을 동원 해서라도 저희를 구해주세요.

청년

42 of 100

네. 제가 Go를 이용해서 해결해 보겠습니다.

세나

43 of 100

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

  1. 게임 진행 방식: 이 게임은 AI와 플레이어가 번갈아가며 진행한다.
  2. 라운드 진행 방식: 각 라운드에서 AI와 플레이어는 동시에 카드 한 장씩을 내면서 게임을 진행한다. 양측이 같은 카드를 낼 때까지 계속 카드를 내며, 같은 카드가 나오면 승리가 결정된다.
  3. 카드 종류: 사용되는 카드에는 apple, lemon, grape, mango, peach라는 5가지 과일이 있다.
  4. 종 치기 규칙: 게임 도중에 AI와 플레이어가 같은 과일 카드를 내면, 플레이어는 b 버튼을 눌러 종을 치게 된다.
  5. 종 치기 타이밍: b 버튼은 언제든지 누를 수 있다. 하지만 종을 칠 때 같은 과일 카드가 아니면 AI가 라운드에서 승리하게 된다.
  6. 시간 제한: 플레이어가 주어진 시간 안에 종을 치지 못하면, AI가 종을 치게 되어 플레이어가 패배한다.
  7. 종 치는 시간 제한: 플레이어에게 주어진 종을 치는 시간은 라운드가 진행됨에 따라 0.2초에서 2초 사이의 랜덤 시간으로 짧아진다. 하지만 시간은 절대 0.2초 이하로 줄어들지 않는다.
  8. 게임 종료 조건: 5 라운드로 구성된 게임은 5 라운드가 종료되거나 플레이어가 q를 누르면 종료된다.

44 of 100

Go and Stop: command line game

Inspired by Halli Galli(할리 갈리)

45 of 100

용이 마음에 들어하는 눈빛이다.

46 of 100

마음에 든 용은 마을에서 사라졌고, 마을에 평화가 다시 찾아왔다.

47 of 100

저 세나님처럼 Go를 배우고 싶어요.

마을 농사꾼

48 of 100

그런데 Go를 배우게 된다면 문법적으로 어려움을 많이 갖게 될까요?

저는 다른 프로그래밍 언어를 조금 할 줄 알아요.

마을 농사꾼

49 of 100

Number of Keywords in Go

🤔

Q. Go의 키워드는 몇 개일까요?

(hint: 키워드: 구문 분석 할 때 특별하게 처리하는 단어, JavaScript에서는 var, if, for, ... )

50 of 100

51 of 100

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

52 of 100

Variable declaration

작고 다양한 타입이 존재

53 of 100

Variable declaration in Go

Go: 정적 타입 언어.

변수의 타입을 미리 지정해야 하고 변수의 타입을 바꿀 수 없다.

[Go]

[JavaScript]

54 of 100

cannot use "twenty" (untyped string constant) as int value in assignment

55 of 100

Variable declaration

1) Go는 타입 추론으로 변수의 데이터 타입을 결정한다.

∴ 따라서 변수 x의 선언은 문제가 없다.

2) 초기값을 제공하지 않으면 해당 타입의 기본값(0/""/false)으로 초기화

56 of 100

Variable declaration - Short variable declaration

  1. 타입을 정하지 않고도 변수 선언 및 초기화가 가능하다!
  2. 전역 변수로 사용 할 수 없고, 함수 내부에서만 사용 가능하다.

★ Go에서 권장하는 방식 ★

57 of 100

[Go and Stop] Variable declaration

fruits: 전역변수이므로 Short variable declaration 사용 불가

초기값을 제공하지 않은 score:

score.Player, score.AI가 각각 int의 기본값인 0으로 초기화

58 of 100

Type conversions

다른 Type 요소 간의 할당에서 명시적인(explicit) 변환을 필요로 한다.

[Go]

[C/C++]

59 of 100

Function declaration

함수는 0개 혹은 그보다 많은 인자를 받을 수 있으며

변수 이름 뒤에 type이 온다.

[Go]

[TypeScript]

60 of 100

Function declaration

만약 함수 인자가 2개 이상이며 연속적으로 나열된 인자가 같은 타입일 때

마지막 인자에만 타입을 명시해도 된다.

61 of 100

Function declaration - Multiple return values

함수는 반환 값을 여러 개 가질 수도 있다.

[Go]

[Python]

62 of 100

[Go and Stop] Function declaration

함수 반환값이 없는 경우도 가능하다.

63 of 100

Function declaration - Anonymous function

익명 함수와 함수 표현식 또한 지원한다.

[Go]

[JavaScript]

64 of 100

Flow control - Conditional statement

[Go]

[JAVA]

★ 중괄호 필수 ★

syntax error: unexpected newline, expected { after if clause

65 of 100

Flow control - `if` with a short statement

조건 앞에 short statement로 시작해 실행할 수 있다.

이렇게 선언된 변수는 if 문이 끝날 때까지만 범위 내에 존재한다.

[Go]

[C++17↑]

66 of 100

Flow control - Loop

initial statement: 첫 번째 반복(iteration) 전에 실행

condition expression: 모든 반복 전에 평가

post statement: 모든 반복이 끝날 때마다 실행

[JavaScript]

[C/C++]

[Go]

67 of 100

Flow control - Loop

initial statement, post statement은 옵션

C, JAVA, JavaScript 등 다른 언어들과 달리

세가지 구성 요소를 감싸는 괄호가 없고

★ 항상 {중괄호}가 필수 ★

68 of 100

Flow control - `for` is Go’s `while`

세미 콜론(;) 생략을 통해

C에서의 `while`은 Go에서는 `for`로 쓰인다.

69 of 100

Flow control - Infinity loop

condition expression을 생략하면 무한 루프 생성 가능하다.

70 of 100

Flow control - break, continue, goto

break: 빠져나올 때 사용

continue: for의 루프 시작으로 이동

goto: 특정 레이블로 이동

71 of 100

[Go and Stop] Flow control

bool 형식으로 리턴하는 processRoundInput 값에 따라

for loop 이 진행할 수도, 빠져나갈수도 있다.

72 of 100

[Go and Stop] Flow control

github.com/eiannone/keyboard 라이브러리 이용, 키보드 입력 지속적 감지

  • 입력에 err가 안생기면 keyPresses 채널에 값 넣기
  • err가 생기면(errnil 이 아니면) handleKeyPresses 함수 종료

73 of 100

Error Handling

throw/raise를 통해 상위 함수(레벨)로 전파하는 것이 아닌

GoError를 체크해서 처리하는 컨벤션을 가지고 있다.

[Go]

[JavaScript]

74 of 100

defer

앞에 defer를 붙이면 해당하는 줄이 함수가 끝나고 실행된다!

defer가 여러 개 있으면 나중에 선언한 defer문부터 실행한다.

(LIFO)

75 of 100

defer(Go) vs try-finally(Python, JavaScript)

[JavaScript]

[Python]

[Go]

defer: 함수 종료 시 자동으로 실행, 예외 발생 여부에 관계없이 작업을 보장

자원 할당과 해제 코드를 가까이 배치해 관리를 용이하게 한다

76 of 100

[Go and Stop] defer

defer를 통해 키보드 입력 받는 것을 끝낸다

github.com/eiannone/keyboard 키보드 입력을 쉽게 받을 수 있는 라이브러리

77 of 100

Channel

채널 연산자 `<-`를 사용하여 goroutine을 연결해주는 통로(파이프)

양방향이며 동일한 채널로 데이터 주고받기 가능하다

78 of 100

[Go and Stop] Channel

keyPressesChannel에 키보드로 입력한 값을 넣는다.

79 of 100

[Go and Stop] Channel

processRoundInput:

채널 keyPresses을 활용, 그 값에 따라 게임을 진행 여부 결정

true: 게임 종료

false: 라운드만 종료

80 of 100

`select`

여러 채널의 I/O 작업을 동시에 기다림 + 준비된 작업을 실행하는 조건 분기 구문

복수의 채널 간의 비동기적 통신을 관리하는데 사용한다.

81 of 100

[Go and Stop] Channel & Select

playRound:

채널 keyPresses을 활용, 그 값에 따라 게임을 진행 여부 결정

시간이 지남 & 같은 카드 = AI 승

82 of 100

Go의 🌻: goroutine

고루틴은 Go언어에서 독립적으로 동시에 실행하는 함수이다.

프로그램 내의 모든 동시 활동을 나타낸다.

83 of 100

Light-weight thread

일반 스레드보다 생성 비용이 적어 ‘경량 스레드’라 부른다.

모든 Go 프로그램은 최소 하나의 고루틴(main 함수)을 포함한다.

84 of 100

Avoid race condition

어?

data = 0

a = data

b = data

a += 1

b += 1

data = a

data = b

∴ 연산 순서가 겹치고 꼬인다

85 of 100

Avoid race condition: Goroutine & Channel

<- 100,000개의 채널 만들기

<- 각 채널이 1씩 값을 담음

<- 100,000개의 채널 속 모든 값을 data에 더하기

86 of 100

Avoid race condition: `sync.WaitGroup`

마치 like Promise.Resolve(JS)

<- 기다릴 것 다 끝났어요~~

<- 한번에 한 스레드만 읽고 쓰게 잠그기

<- 기다릴 것 1개 추가

<- 끝장나게 기다리기

87 of 100

[Go and Stop] Goroutine & Channel

handleKeyPresses:

키보드 입력을 비동기적으로 감지하여 keyPresses 채널로 전송 & 키 입력 오류 시 종료

88 of 100

그런데 Go를 배우게 된다면 문법적으로 어려움을 많이 갖게 될까요?

저는 다른 프로그래밍 언어를 조금 할 줄 알아요.

마을 농사꾼

그래서 Go의 효능이 뭔가요?

마을 닌자

89 of 100

Go의 효능: Multi-core processing

멀티 코어 활용으로 고성능 어플리케이션 구축 가능(대규모 데이터 처리, 실시간 시스템, ...)

시스템 자원을 효율적으로 활용 가능

클라우드 및 분산 시스템에서의 확장성 향상

90 of 100

Go의 효능: Concurrency & Parallelism

여러 작업이 시간을 공유하며 실행되는 동시성(concurrency)와

여러 작업이 병렬적으로 실행되는 병렬성(parallelism)을

`goroutine`을 통해 아주 쉽게 해냄

91 of 100

Google이 운영하고 있는 정도의 거대한 스케일의 웹 서비스에 매우 효엄적

(HTTP, TCP, UDP와 같은 네트워크 프로그래밍에도 효엄적)

92 of 100

블록체인은 보안, 성능, 동시성 및 안정성이 중요

Go는 Garbage collection, 컴파일 시 타입 검사 수행,

메모리 접근의 엄격한 규칙 등을 통해 메모리 안정성 제공

93 of 100

94 of 100

그렇게 주인공은 Go의 강점을 활용하여 마을의 위기를 해결했고,

마을 사람들은 새로운 프로그래밍 언어의 가능성을 깨닫게 되었다.

95 of 100

96 of 100

세나는 현실 세계에 가서 더욱 열심히 Go를 공부했다고 한다.

-끝-

97 of 100

98 of 100

잠깐! 시선을 멈추세요!

저는 Go의 초승달 담당입니다.

프로그래밍 언어를 배워본 경험이 있는 당신이라면 Go를 도전 해보세요!

간결한 문법을 쉽게 익힐 수 있으며, 고루틴이 당신의 비동기를 축복할 것입니다.

Summary

99 of 100

Q & A

100 of 100

Thank you!

Special Thanks to: 삼월초하루 & 임권영