golang

    [바미] Go - Logrus과 lumberjack을 사용하여 Log를 찍어보자!

    로그를 남길 때 일반 "log"패키지 외에도 로그를 남길 수 있는 방법이 있어 공유하고자 올립니다. Logrus라는 패키지 인데요. 사용 방법은 다음과 같습니다. 먼저 패키지를 다운받아 줍니다. github.com/sirupsen/logrus 그 후 코드를 작성해봅시다. package main import ( log "github.com/sirupsen/logrus" ) func main() { // 기본 ASCII 포맷터 대신 JSON으로 로깅합니다. log.SetFormatter(&log.JSONFormatter{}) // 기본 stderr 대신 stdout으로 출력하기 위해 사용. log.SetOutput(os.Stdout) // 지정된 모듈에 대한 로깅 수준을 설정 -> DebugLevel 이상 ..

    [바미] Go - Packaging 과 Stack, Queue에 대해 알아보자!

    안녕하세요. 오늘은 Go의 Packaging 과 Stack, Queue에 대해 알아보겠습니다. 패키지(Package)라는 것은 어떤 모듈, 기능 등을 묶어 놓은 것을 의미 합니다. Go 자체가 가지고 있는 "fmt"라는 패키지가 있는데 "format"의 약자인데 이것은 출력과 관련된 것들을 묶어놓은 것이고, "math"라는 패키지가 있는데 수학과 관련된 함수들을 묶어 놓은 패키지 입니다. 이런 관련된 기능들을 묶어 놓은 것을 패키지(Package)라고 합니다. 이전에 Linked List를 만들었었는데 그 외에도 Stack, Queue, Tree, Heap들을 하나의 패키지로 만들어서 dataStruct라는 것으로 만들어 늘려가볼까 합니다. 먼저 지난 시간에 만들었던 Linked List를 패키지로 분리..

    [바미] Go - 묻고 더블로 가는 Double Linked List에 대해 알아보자!

    안녕하세요. 오늘은 Double Linked List에 대해 알아보고자 합니다. 우선 Double Linked List를 만들기 전에 지난 시간에 했었던 코드를 정리해보죠. AddNode와 RemoveNode를 따로 했었는데 이거를 하나의 struct를 정의해서 그 struct안에 몰아넣도록 해줍니다. 현대 프로그래밍 언어에서는 결합성을 올리고 의존성을 내리는데요. 관련되어 있는 것들은 하나로 묶어서 하나의 모듈로 만들고, 관련 없는 것들 끼리는 서로 의존관계가 생기지 않도록 의존성을 끊는다는 의미입니다. 그래서 AddNode와 RemoveNode는 서로 관련이 있기 때문에 하나의 struct로 묶겠습니다. type LinkedList struct { root *Node tail *Node } func ..

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

    안녕하세요. 이번에는 Linked List에 대해 알아 봅시다! Linked List는 연결된 리스트를 의미하는데 요소들을 서로 연결했다고 보면 되는데요. 배열은 하나의 통 메모리를 할당해서 그것을 나눠 쓰는 것인데 그것이 붙어 있다고 생각하면 되는데 Linked List는 붙어있는게 아니라 연결을 해놓은 것입니다. 배열은 한 덩어리로 존재하지만 Linked List는 서로 떨어져있는 메모리들을 한 줄로 연결해 놓은 것이라고 생각하면 됩니다. 연결하는 방법은 포인터를 이용하는 방법입니다. Linked List의 한 요소를 Node라고 하는데 이 Node에서 다음 Node로 포인터를 가지고 서로 연결을 시킬 수가 있습니다. 그러면 포인터를 가지고 어떻게 연결을 하는지 알아보겠습니다. 먼저 Struct를 하..

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

    이번에는 Instance에 대해 알아보죠. Struct의 복사에 대해 알아 봤었었는데요. 예를 들어 Student라는 struct가 있다 가정하에 type Student struct { name string age int grade int } 이렇게 구성되어 있는게 Student일 때 이것이 복사가 된다 했는데 a라는 애를 만들어서 name이 "aaa", age가 20, grade가 10일 때 마찬가지로 메모리 공간에 a라는 애가 있을 것입니다. 그런데 이 때 b = a를 해버리게 되면 b라는 공간을 만들어서 a의 값을 복사하게 됩니다. 코드 상으로 보겠습니다. package main type Student struct { name string age int grade int } func main() {..

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

    대부분의 현대 언어들은 동적 배열들을 하나씩 가지고 있는데 C++에서는 Vector, Java에서는 ArrayList, C#에서는 List, Python은 Golang과 똑같은 Slice, Golang도 마찬가지 입니다. 그렇다면 동적배열이 무엇일까요? 동적배열의 반대가 정적배열인데 정적배열(Fixed size array)은 길이가 바뀌지 않는 배열입니다. [10]int이렇게 사용합니다. 반대로 동적배열은 [] int 이렇게 표시하는데 길이가 변하는 배열이라 생각하면 됩니다. 그래서 처음에 하나가 되었다가 두개가 되었다가 세개가 되는 배열입니다. 그럼 이걸 어떻게 만들었는지 생각해보죠. 메모리가 늘어날 수는 없습니다. 메모리는 처음 할당받은 사이즈가 있으면 그 사이즈를 그대로 써야지 그 사이즈를 넘어서 ..

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

    Garbage Collector? 말 그대로 쓰레기 청소부 라는 의미인데, Momory에 있는 쓰레기를 청소하는 것입니다. 메모리에 어떤 쓰레기가 쌓이는지 알아보죠! 변수는 여러 속성을 갖지만 가장 중요한 속성은 변수는 메모리다.라는 것입니다. 변수는 값을 담는 그릇인데 var a int 이런식으로 변수를 선언하게 되면 메모리에 이 그릇을 만들었다는 소리이고, 이 그릇이 있는 곳이 메모리 주소인데 그 메모리 주소를 변수 a가 나타내고 있는 것인데 이렇게 변수를 선언해서 메모리를 확보만 해놓고 쓰지 않게되고, 이러한 변수들이 많아지면 메모리만 차지하게 될 것이고, 결국에는 메모리가 부족해서 프로그램이 종료되는 상황에 이를 수 있습니다. 이런걸 메모리에 쌓이는 쓰레기라 해서 Momory Garbage라고 한..

    [바미] Go - 숫자야구를 만들어보자!(2)

    지난번에 이어서 숫자야구를 마저 만들어 보도록 해봅시다! 그 다음은 키보드로 부터 입력값을 받는것인데 여기에 들어가면 알 수 있습니다. func InputNumbers() [3]int { // 두 개의 숫자 3개를 비교해서 결과를 반환한다. var rst [3]int for { var no int _, err := fmt.Scanf("%d", &no) if err != nil { fmt.Println("잘못 입력 했습니다.") continue } for no > 0 { // 1 n := no%10 no = no/10 rst[idx] = n idx++ } break } return rst } 이 Scanf가 어떻게 동작하는지 볼려면 여기에 들어가면 되는데 return값으로 몇 개를 입력받았는지와 실패 시 ..

    [바미] Go - 숫자야구를 만들어보자! (1)

    종이와 게임으로 했었던 게임인데 룰은 간단합니다. 먼저 두 사람이 0 ~ 9까지의 겹치지 않는 숫자 3개를 생각해 둡니다. 첫 번째 A 사람이 2 6 3을 생각해두었고, 두 번째 B 사람이 5 4 1을 생각했다고 가정했을 때, 각자 자기 차례가 되면 숫자 3개를 말합니다. A 사람이 1 2 3이라고 했을 때 B는 상대방이 말한 숫자와 자신이 생각한 숫자와 비교를 합니다. 그래서 자리도 같고 숫자도 같으면 '스트라이크', 숫자는 같지만 자리가 다르면 '볼'이 됩니다. 그러면 B는 5 4 1을 생각했었고, A는 1 2 3을 외쳤으니 1 볼이 되죠. 그렇게 해서 B차례가 되었고, A에게 마찬가지로 1 2 3을 외쳤을 때 2 6 3과 1 2 3을 비교해보면 2는 숫자가 있지만 자리가 다르고, 3은 자리와 숫자가..