1 of 31

Go의 객체지향

최수녕 / 이노그리드

2 of 31

Index

  • Go를 이해해보자!
  • Go의 객체지향
  • Go가 클라우드 네이티브 세계에서 유명한 이유
  • Q&A

3 of 31

Go를 이해해보자!

4 of 31

Go를 이해해보자!

내가 알고있는 다른 언어와의 비교 - Go의 객체지향

언어의 탄생 배경 이해 - Go가 클라우드 네이티브 세계에서 유명한 이유

5 of 31

Go의 객체지향

6 of 31

객체 / 생성자

7 of 31

객체 / 생성자

8 of 31

캡슐화

9 of 31

인터페이스

저것의 이름이 콘센트인지 돼지코인지는 중요하지 않다.

내가 정의한 동작을 실행할 수 있다면 콘센트로 간주한다

“코드를 꽂을 수 있다!”

10 of 31

인터페이스

11 of 31

인터페이스

12 of 31

인터페이스

…이하 코드 생략

13 of 31

상속 (composition)

has -a 관계

is -a 관계

14 of 31

상속 (composition)

15 of 31

상속 (composition)

16 of 31

Go가 클라우드 네이티브 세계에서 유명한 이유

17 of 31

Go가 클라우드 네이티브 세계에서 유명한 이유

18 of 31

Go가 클라우드 네이티브 세계에서 유명한 이유

클라우드 위에서 애플리케이션을 돌리는 목적

→ 요청량에 따라 안정적으로 운영하기 위해 빠르게 서버의 갯수를 줄이거나 늘리는것이 중요

비용 감소 중요

⇒ 최대한 빠르고 가벼운 언어 선택 필수

19 of 31

클라우드 네이티브란?

1950년대

모든 프로그램과 데이터는 거대한 단일 장비에 저장

1980년대

저렴한 PC의 등장으로 프레젠테이션/비즈니스로직/데이터 계층으로 나뉨

1990년대

많은 양의 컴퓨팅 자원을 소모하는 애플리케이션으로 인해 개발/관리/배포의 어려움으로 마이크로서비스 시대 개막

2000년대

아마존이 AWS를 출시하면서 클라우드컴퓨팅 대중화

  • 기업들은 대규모 인프라 자원을 사용하는 것이 쉽지 않다는 것을 깨달았으며 모든 이슈를 사람이 직접 관리하는 것은 불가능하다고 느꼈다
  • 클라우드 네이티브 기술은 퍼블릭/프라이빗/하이브리드 클라우드처럼 동적인 환경에서 애플리케이션을 확장성있게 빌드하고 실행할 수 있도록 해준다
  • 애플리케이션을 확장성 있게 운영하는 것을 모두 아우른다
  • 클라우드 네이티브 애플리케이션은 지독히도 불행한 삶을 위해 만들어 졌다

20 of 31

Go를 만들게된 계기

지금 존재하는 언어들로는 구글처럼 분산되고 확장가능하고 탄력성있는 서비스를 표현하는데 적합하지가 않아요!

21 of 31

높은 설계 유연성

  • 상속을 활용하는 객체 지향 프로그래밍은 타입 사이의 관계를 신중하게 고려하여 설계해야 했고 특정한 설계 패턴과 관행을 충실히 준수해야했다
  • Go 역시 구조체의 형태로 타입과 동일한 개념을 구현할 수 있고 속성과 동작도 제공하지만 객체간의 정교한 관계(is-a 상속)를 지양한다
  • 복잡한 타입을 만들 때 간단한 타입을 안에 포함시키는 컴포지션이라고 알려진 접근 방식을 채택했다 (has-a 상속) ⇒ 설계 유연성을 높여준다

클라우드 네이티브 세계를 위한 기능 (Go의 장점)

22 of 31

이해하기 쉬운 언어

  • C++/자바는 다루기 힘들고 사용하기 불편하며 코드가 불필요하게 장황하다는 비판을 종종 받는다
  • 이 언어들은 프로그래머가 해결하려는 문제에 집중할 수 없을 정도로 불필요하게 많은 보일러플레이트를 가진 프로젝트를 요구한다
  • Go의 미니멀리즘 디자인은 영리함보다 명확함을 선호한다는 것을 보여준다
  • 이러한 특징은 프로그래머가 복잡성과 혼란을 넘어 코드의 단순함과 생산성을 높일 수 있도록 해준다.

클라우드 네이티브 세계를 위한 기능 (Go의 장점)

23 of 31

편리하고 가벼운 동시성 사용(goroutine, channel)

  • OS가 아닌 Go Runtime이 관리하는 경량 쓰레드로 OS 스레드보다 훨씬 가볍다
  • 대부분의 프로그래밍 언어는 동시성을 제공하며 프로그래머는 일부 메모리 공간을 프로세스 사이에 공유하도록 허용함으로써 많은 문제를 직면하며 이런 문제 해결을 위해 락이나 뮤텍스를 이용하지만 코드 작성에 대한 부담이 생기기 마련이다
  • Go의 동시성 기술인 goroutines에서 channel을 통해 메시지를 주고받을 수 있게 함으로써 메모리를 공유하지 않고도 통신할 수 있도록 하였다
  • Go의 유명한 속담으로 요약되곤 한다. “메모리를 공유하여 통신하지 마십시오. 대신 통신을 통해 메모리를 공유하십시오”

클라우드 네이티브 세계를 위한 기능 (Go의 장점)

24 of 31

빠른 빌드 속도

  • 대부분의 Go빌드는 하드웨어가 열악한 컴퓨터에서도 수 초 혹은 아주 가끔 수 분 내에 완료된다.

클라우드 네이티브 세계를 위한 기능 (Go의 장점)

25 of 31

언어의 안정성

  • 현재 동작중인 Go 프로그램은 앞으로 출시된 버전으로 업데이트 되더라도 계속해서 동작할 것이라고 기대할 수 있다.
  • Go 1버전은 계속 호환성을 유지할 것이고, 급격한 변화를 만들게 된다면 과거 Go 1버전 이동시 사용된 go fix 명령처럼 일종의 변환 유틸리티를 제공할 것이다.

클라우드 네이티브 세계를 위한 기능 (Go의 장점)

26 of 31

가비지 콜렉터

  • 포인터는 엄격히 타이핑되어 언제나 값을 갖고 초기화되어야 하며 포인터 연산은 허용되지 않는다
  • Go는 가비지 콜렉터가 존재하며 이는 개발자가 메모리 영역을 추적하고 해제할 필요가 없도록 해주었다
  • Go의 가비지 콜렉터는 메모리 관리를 수행하는 데 있어서 일부 오버헤드가 존재하지만 그럼에도 실행속도 관점에서 괜찮은 편이다

클라우드 네이티브 세계를 위한 기능 (Go의 장점)

27 of 31

성능

클라우드 네이티브 세계를 위한 기능 (Go의 장점)

C++

Go

Java

Node.js

Python3

Ruby

Rust

Fannkuck-Redux

8.08

8.28

11

11.89

367.49

1255.5

7.28

FASTA

0.78

1.2

1.2

2.02

39.1

31.29

0.74

K-Nucleotide

1.95

8.29

5

15.48

46.37

72.19

2.76

Mandlebrot

0.84

3.75

4.11

4.03

172.58

259.25

0.93

N-Body

4.09

6.38

6.75

8.36

586.17

253.5

3.31

Spectral norm

0.72

1.43

4.09

1.84

118.4

113.92

0.71

28 of 31

정적 링크

  • Go는 라이브러리와 런타임이 포함되어 정적으로 연결된 실행 가능 바이너리 파일로 컴파일된다
  • 다소 큰 파일을 만들어내기는 하지만 별도의 런타임이나 외부 라이브러리를 설치할 필요가 없고 쉽게 배포할 수 있으며 호스트 서버의 환경 차이나 라이브러리 의존성을 신경 쓰지 않아도 된다
  • 이러한 방식은 컨테이너 기술을 이용할 때 유용하다
    • 실행을 위한 런타임이나 배포가 필요하지 않기 때문에 컨테이너의 부모 이미지가 없는 상태에서도 새로운 이미지를 만들 수 있다
    • 정기적으로 컨테이너 이미지를 가져와야 하는 쿠버네티스 같은 오케스트레이션 시스템에 매우 유용하다

클라우드 네이티브 세계를 위한 기능 (Go의 장점)

29 of 31

  • 자유도가 높아서 협업시 컨벤션을 잘 가지고 가야한다
  • 강력한 프레임워크 부재
  • 예외처리 문법이 없으며 에러를 일일이 처리해줘야 한다
  • 중앙저장소(패키지매니저)부재로 인한 버전 관리의 어려움
  • 언어 자체에서 기본으로 제공하는 라이브러리가 단순해서 당연히 있을것 같은 기능을 직접 구현해야할 경우가 있다

Go의 단점

30 of 31

Thank you

추후 더 나은 세션을 위해, 피드백을 부탁드려요!

31 of 31

Q & A

추후 더 나은 세션을 위해, 피드백을 부탁드려요!