go언어

    [Things of Go] 얕은 복사와 깊은 복사

    해당 글은 독자가 Go언어의 기본적인 문법과 포인터 혹은 참조 자료형의 개념에 대해 알고 있다고 가정한다. 변수 복사 프로그래밍 언어를 어느 정도 다룰 줄 알게 되면 항상 유의해야 하는 부분이 있다. 바로 변수의 복사이다. 변수의 복사라고 거창하게 말했지만 한 변수값을 다른 변수값에 할당하는 것이다. var a int = 3 var b int = a //복제 위에 예시로 든 int형같이 기본 자료형은 위와 같이 할당문으로 복사해도 별 문제가 되지 않는다. 그러나 자료형이 참조형일 때는 이야기가 다르다. 예시를 들기 위해 다음의 클래스를 준비했다. package main import ( "bytes" "encoding/gob" "fmt" ) type Pos interface { Print() Copy() ..

    [Design Go] 팩토리 메소드 패턴

    들어가기에 앞서... 이번 패턴의 설명 역시 지난 패턴의 예제를 이용했다. 팩토리 메소드 패턴 팩토리 메소드 패턴은 함수에게 다른 객체(product)의 생성을 맡기는 디자인 패턴이다. creator 함수는 product 객체의 일종의 생성자 역할을 한다고 볼 수 있다. 장점 객체의 생성과 구현을 분리해낸다. 이전의 생성 패턴들과 같다. 코드의 가독성이 높아진다. 빌더 패턴과 비슷한 이유이다. 빌더 패턴이 거대한 객체의 생성을 목적으로 한다면 팩토리 메소드는 작은 객체의 생성을 목적으로 한다. 다른 패턴과 쉽게 연동된다. 기존의 클래스에 해당 메소드만 추가하면 되는 만큼 다른 패턴에 적용하기 쉽다. 추상 팩토리 패턴은 여러 팩토리 메소드를 묶어 객체화한 패턴이다. 단점 코드가 난잡해질 수 있다. 팩토리 ..

    [Design Go] 추상 팩토리 패턴

    들어가기에 앞서... 이번 패턴의 예제는 지난 글을 참조하자. 추상 팩토리 패턴 추상 팩토리 패턴은 한 객체(factory)에게 서로 연관되어 있는 각 객체(product)들의 생성을 맡기는 패턴이다. 우선 factory 객체가 상속할 인터페이스(Factory)에는 하나 이상의 product 객체들을 생성하는 메소드가 정의되어 있어야 한다. factory 객체는 Factory 인터페이스를 상속하여 해당 인터페이스의 메소드를 구현한다. 사용자는 factory 객체를 생성하고 해당 객체의 메소드를 통해 product 객체들을 생성한다. 장점 연관된 객체들(객체군)끼리 생성할 때 문제의 여지가 없어진다. 추상 팩토리 패턴을 사용하는 가장 큰 이유이다. 예를 들어 여러 사이즈의 나사와 볼트가 있을 때 추상 팩토..

    [Design Go] 빌더 패턴

    들어가기에 앞서... 지난 글에서 언급했듯 해당 시리즈의 이번 글부터는 각 디자인 패턴에 대해 설명하면서 Go언어로 만들어보도록 하겠다. 책 'GoF의 디자인 패턴'에서는 생성 패턴들을 설명할 때 아래의 미로를 만드는 예제를 사용했다. 이 시리즈도 해당 예제를 이용할 예정이다. package main import "fmt" type Direction int const ( East Direction = iota West South North ) type MapSite interface { Enter() } type Room interface { MapSite GetSide(d Direction) MapSite SetSide(d Direction, s MapSite) GetNo() int } type roo..

    [Things of Go] 개인적으로 생각하는 Go언어의 단점

    Go언어를 소개하는 글에서는 보통 Go언어의 장점을 강조한다. 여러 언어를 비교하는 글에서는 Go언어의 장점과 단점을 모두 설명하지만 집중적으로 다루지는 않는다. 물론 모든 글이 그렇다는 것이 아니라 대개 그렇다는 것이다. 그저 선택과 집중의 문제일 뿐이다. 필자는 Go언어를 좋아한다. 하지만 코드를 작성하다 보면 불편할 때가 있다. 이 글에서는 필자가 코드를 직접 작성하면서, 혹은 생각해본 Go언어의 단점에 대해 끄적여보겠다. 이번 글은 필자의 주관이 잔뜩 들어가 있기에 비판적으로 봐주기를 바란다. 마지막으로 필자는 프로그래밍 언어 중에서는 Go언어를 가장 좋아한다.😉 1. 타 언어들과의 객체지향에 대한 관점의 차이 Go언어는 객체지향 언어이다. 그리고 프로그래밍 언어들 중에 흔하디 흔한 것이 객체지향..

    [Things of Go] Go언어의 객체지향 모델 - 응용편

    지난 글에서는 객체지향 프로그래밍을 하기 위한 기본적인 요소들에 대해 알아보았다. 이번 글에서는 이 요소들을 이용해 어떻게 객체지향 프로그래밍을 할 수 있는지 알아보겠다. 그 전에... 패키지 내의 함수 및 변수 호출은 인스턴스의 그것들을 호출하는 것과 유사하다. 그리고 이전 글에서 잠깐 언급했지만 Go언어의 접근제한은 패키지 단위로 이루어진다. 즉, Go언어에서의 패키지는 하나의 객체로 볼 수 있다. 그리고 캡슐화(은닉성)의 관점에서 패키지를 객체로 취급하는 것이 바람직하다 콘솔에서 패키지를 받아보자. go get github.com/simp7/pracOOPFromGo 받은 파일은 이전 글의 객체들(Dog, Cat, Animal)을 패키지로 묶은 것이다. 이후 예제에서 사용될 예쩡이다. Go언어에서의 ..

    [Things of Go] Go언어의 객체지향 모델 - 기초편

    이 글은 독자가 객체지향과 포인터에 관한 기본적인 지식이 있다는 가정 하에 작성되었다. Go언어와 객체지향 현재 인기있는 대부분의 프로그래밍 언어가 그렇듯이 Go언어는 객체지향 언어이다. 다만, 보통 객체지향에 입문하는 데에 쓰는 파이썬, 자바, 혹은 C++하고는 모습이 조금 다르다. Go언어의 설계 목표가 직관성, 단순성, 명료성, 효율성이다. 이런 목표를 달성하기 위해 다른 언어들에 비해 키워드가 적고 문법이 살짝 다르다. 클래스 정의 Go언어에는 class 키워드가 없다. Go언어는 struct, 즉 구조체를 이용해서 클래스를 정의한다. 구조체는 다음과 같이 선언한다. type Dog struct { name string } 'string형 변수 name을 가지는 구조체를 Dog라 칭한다' 정도로 ..