프로그래밍(Basic)/Golang

    [바미] Go - OOP(Object란?)

    안녕하세요. 저번 시간에 이어서 절차적 프로그래밍이 어떤점이 나빴기 때문에 OOP가 나타났는지를 살펴보도록 하겠습니다! 저번시간에 딸기잼 샌드위치를 만드는 프로그램을 만들었었는데 이번에는 그 프로그램이 변경되서 딸기잼이 아니라 오렌지잼 샌드위치를 만드는 프로그램을 만든다고 했을 때 어떤 부분들이 수정되야 하는지 살펴보죠! type OrangeJam struct { opened bool } 먼저 딸기 잼이 아니라 오렌지 잼이 있어야 할 것 입니다. 그 다음에 func main() { // 1. 빵 두개를 꺼낸다. breads := GetBreads(2) //jam := &StrawbrreyJam{} jam := &OrangeJam{} // 2. 딸기잼 뚜껑을 연다. // OpenStrawberryJam(j..

    [바미] Go - OOP에 대해 알아보자.

    OOP(Object Oriented Programming)는 한국어로 풀어 쓰면 '객체 지향 프로그래밍'이라고 번역을 하는데 이 번역이 잘 못 되었다 생각합니다. '지향'은 Direct, 그러니까 어떤 방향성을 갖고 있는 것이고, 그 쪽으로 가겠다.는 얘기인데 'Oriented'는 어떤 중심의, 기원의, 근간이 되는 이라는 뜻입니다. 그러니까 객체 지향은 내가 객체 쪽이 아닌데 객체 쪽으로 나아가겠다.는 뜻인데 이미 프로그래밍은 객체로 넘어갔고, 지금은 객체 중심으로 프로그래밍을 해야 합니다. 물론 'OOP'가 처음 나왔을 때는 "우리는 아직 OOP가 아니기 때문에 OOP를 향해 가자!" 라고 말할 수 있지만 2021년 현재는 이미 OOP로 넘어갔고, 넘어간지도 20년이나 지났습니다. Java나 C#같은..

    [바미] Go - Select에 대해 알아보자.

    안녕하세요. 오늘은 Select에 대해 알아보도록 하겠습니다. 지난번에 자동차 공장을 만들었었고, 그 중에 MakeTire()로 타이어를 만들었었는데 이 타이어는 자동차 타이어 외에도 다른 곳에서도 쓰일 수 있습니다. 만약 비행기 타이어도 만들 수 있다고 가정하여 자동차 타이어 요청이 들어오면 자동차 타이어로, 비행기 타이어 요청이 들어오면 비행기 타이어로 만든다 가정해봅시다. 그러니까 어떤 요청이 들어오냐에 따라서 어떤걸 만들지를 결정하는 것인데 이걸 어떻게 만들지 생각해 봅시다! carChan이 있고, planeChan이 있다고 하고, Make Tire()라는 함수가 있다고 했을 때 Car Chan와 Plane Chan 두 개 다 기다리게 만들 수 있을까요? 첫 번째로 아래와 같이 car는 carCh..

    [바미] Go - Channel에 대해 알아보자!

    안녕하세요. 오늘은 채널에 대해 좀 더 알아보도록 하겠습니다. 채널은 앞 전에 말씀 드렸듯이 Go언어에서 제공하는 멀티스레드용 프로그램을 좀 더 원활하게 하기 위해서 제공하는 타입이고, Fixed Size(정해진 크기를 갖는), Thread Safe(스레드에 안정적으로 돌아가는) 큐입니다.. 큐는 자료구조의 하나로써 FIFO를 제공하는 자료구조이죠. 채널도 하나의 타입인데 Slice랑 Map과 같은 Go에서 제공하는 자료구조 중에 하나라고 보면 됩니다. 그래서 chan으로 사용하면 되는데 선언은 var a chan int 이렇게 사용하는데 var로 선언하고 이름은 아무거나 하고, 타입은 chan, 값의 타입은 int, string, *, 등 Go에서 사용가능한 타입은 모두 가능합니다. Slice도 그렇고..

    [바미] Go - DeadLock & channel에 대해 알아보자.

    안녕하세요 오늘은 DeadLock에 대해 알아보겠습니다. 여기서 Dead는 '죽었다'의 표현이 아니라 막다른 길을 표현할 때 'Dead end'라고 표현을 하는데 그 때의 'Dead'와 같은 의미입니다. 그래서 Lock이 막혔다라고 보면 됩니다. 이 DeadLock은 멀티 스레드 프로그램을 할 때 발생 할 수 있는 치명적인 버그 중에 하나인데 이 DeadLock의 원인과 발생 이유를 알아보기 전에 DeadLock을 발생시켜 보죠. 기존 코드에서 몇가지만 고쳐보도록 하겠습니다! account 만들었을 때 잡아놨던 Lock을 빼줍니다. package main import ( "fmt" "math/rand" "sync" "time" ) type Account struct { balance int mutex *..

    [바미] Go - Thread에 대해 알아보자2.

    안녕하세요! 저번에 이어서 쓰레드에 더 자세히 알아보는 시간을 갖아보도록 하겠습니다! 먼저 헷갈릴 수 있는 부분이 있기 때문에 용어 정리 부터 진행하겠습니다. 프로그램이 있고, 프로세스가 있고, 쓰레드가 있습니다. 이 용어들의 차이를 알아보죠. 프로그램과 프로세스는 비슷한 개념이지만 프로그램이 좀 더 큰 개념이라 볼 수 있고, 프로그램 ≥ 프로세스 프로세스는 스레드를 가지고 있습니다. 또한 여러개의 스레드를 가질 수 도 있습니다. 그러면 프로그램이 뭔지 부터 알아보죠. 우리가 어떤 프로그램이라고 하면 게임, 음악, 그림쪽의 프로그램이 있는데 이 프로그램에 의미 안에는 실행파일 + 데이터가 포함 되어 있죠. 그러니까 이 두개를 합친 것을 프로그램이라고 부릅니다. 그래서 대부분의 프로그램들을 보면 하나의 실..

    [바미] Go - Thread에 대해 알아보자.

    안녕하세요. 오늘은 쓰레드(Thread)에 대해 알아보고자 합니다. 쓰레드(Thread)는 현대 프로그래밍 언어에서 가장 중요한 개념중에 하나이고, 현대 프로그래밍에서 가장 많이 쓰이는 부분이기도 하고, 가장 풀기 어렵고 복잡한 문제들이 발생하는 곳 중에 하나가 쓰레드가 됩니다. 쓰레드를 잘 모르면 나중에 더 고 수준의 프로그램을 하는데 문제가 있게 됩니다. 그래서 쓰레드의 개념을 파악하고, 어떤 문제들이 발생하는지, 또 그 문제들을 어떻게 해결 할 수 있는지 잘 알고 있어야 합니다만, 쓰레드를 잘 몰라도 프로그래밍 하는데 있어서 크게 문제되진 않습니다. 웹 페이지를 만든다거나 할 때는 멀티쓰레드 환경에 대해서 몰라도 되지만 시스템 프로그램을 한다거나, 게임서버 같이 헤비, 하드한 작업을 하게 되면 쓰레..

    [바미] Go - GoLang에서 Map을 사용하는 이유에 대해 알아보자.

    드디어 data struct의 마지막 시간이 찾아 왔습니다. Map은 저번에도 말했듯이 slice와 더불어 많이 쓰이는 것중 하나 입니다. Go에서 기본적으로 map을 지원해주고 있기 때문에 직접 만들필요는 없고, 직접 만든 이유는 Map의 동작원리를 알기 위해서 만들어 본 것입니다. Go에서 map을 사용하는 방법에 대해 알아보죠. main.go package main import ( "fmt" ) func main() { var m map[string]string } 위와 같이 m이라는 변수를 만들고, map이라고 쓰고 []를 사용하여 []안에는 key타입 값을 넣어주고, []밖에는 value타입 값을 넣어줍니다. 현재는 key타입은 string, value타입은 string형태의 map을 만든 것이..

    [바미] Go - Map 구현을 해보자!

    안녕하세요! 오늘은 Map을 구현해 보도록 하겠습니다. 그 중에서 Hash Map을 직접 만들어 볼 것인데 지금 만들어볼 Hash Map은 Rolling hash인데 간단한 Hash중에 하나입니다. "abcde"라는 String있을 때 첫 번째를 s0, 그 다음 s1, s2, s3, s4라 했을 때 a b c d e s0 s1 s2 s3 s4 (s0 * A(특정숫자) + s1) % B 한 값을 Rolling hash 라고 합니다. 다시 적어보면 s는 s0 ~ sN까지 있을 때 H(Hash의 H)i = (Hi-1 * A + si) % B가 됩니다. 예를 들어 방금 a b c d e s0 s1 s2 s3 s4 이러한 값이 있다고 했는데 이 첫번째 글자의 Hash값은 H0가 됩니다. a b c d e H0 그..