프로그래밍 언어

    Go: 에러와 패닉 (panic, recover)

    예외가 없다고? 그렇다. Go 언어에는 예외(Exception)가 없다. 에러로 모든 것을 처리한다. error 빌트인 타입은 존재하긴 하지만, 그렇다고 타언어처럼 모든 에러에 대해 타입이 매핑되어 있는 것은 아니다. 내가 접한 언어 중에는 Syntax, Out of Range 등을 전부 나눠놓은 경우가 있었는데, 그다지 좋은 기분이 들지는 않았다. 아니면 에러와 예외를 둘 다 사용하여 컴파일이나 정적으로 발생하는 것은 에러로, 런타임 중에 발생한 것은 예외로 하여 개별 클래스가 계층에 따라 분리된 경우도 있었는데, 상당히 헷갈리기 그지 없었다. Go 에는 에러와 패닉이 있는데, 패닉은 런타임 중에 발생하는 치명적인 에러를 의미하며 프로그램이 더 이상 진행될 수 없는 수준의 에러다. 상당히 치명적이어서 ..

    Go: 인터페이스와 타입 단언 (Interface, Type Assertion)

    인터페이스 인터페이스는 이기종간 기능을 약속하여 서로 다른 기기일지라도 오직 기능적인 관점에서 일관성을 유지하기 위해 사용한다. 같은 개발자라도 가지고 있는 기술에 따라 기술 스택이 달라지지만, 코딩이라는 기능은 가질 수 있는 것처럼 말이다. 인터페이스는 아래와 같이 정의하는데, Go 에서는 구조체에 정의하는 메서드에 대해 인터페이스를 사용하는 것을 명시하지 않는다. 인터페이스는 타입으로 선언하며 Develop 이라는 인터페이스는 코딩이라는 기능을 가질 수 있음을 말한다. 인터페이스는 실질적인 구현에 대해서는 이야기하지 않고, 오직 그 기능이 가능한 지에 대해서만 신경쓴다. type Develop interface { Coding() } 조건에 만족하려면 인터페이스를 만족하기 위한 조건은, 메서드를 가진..

    Go: 구조체 (메서드, 임베딩, 캡슐화)

    Go 에는 클래스가 없다. 개념적으로 객체라는 단어를 거의 사용하지 않는다. 다만 C언어처럼 구조체라는 존재가 있다. 구조체는 클래스와 유사하지만 전통적인 객체지향 프로그래밍의 형태보다는 Go 언어에 맞는 프로그래밍 방식이 요구된다. 객체지향에서 언급하는 상속과 캡슐화를 하는 것은 가능하지만 그 방법이 다른 언어와는 상당히 다르다. 기존 객체지향에서 사용하는 extends, public, protected, private 와 같은 키워드가 존재하지 않으며, this 키워드가 없어서 혼란스러울 일이 없다. 타언어를 사용하다보면(특히 자바스크립트) this 가 무엇을 가르키는지 소스코드에 명시가 되어있지 않기 때문에 헷갈리는 경우가 많은데, Go 에서는 명시하기 때문에 그럴 일이 없다. 구조체 구조체는 클래..

    Go: 맵 (Map)

    Map 맵은 자바스크립트의 객체 리터럴이나 파이썬의 사전과 비슷하게 키와 값을 가질 수 있는 자료구조다. 맵을 사용하면 배열과 슬라이스를 사용했을때 거쳐야 할 일부 번거로운 연산과정을 거칠 필요 없이 키와 값이 매핑되어 있기 때문에 접근이나 값을 수정하는 것이 수월하다. Go 언어의 맵은 데이터가 들어간 순서대로 정렬되지 않는다는 특징이 있어서 정렬된 데이터를 원한다면 별도의 정렬 함수를 사용하여 정렬해야 한다. 맵은 아래와 같이 사용할 수 있으며 슬라이스와 마찬가지로 make() 를 통해 생성해야 한다. 이 맵은 키가 스트링타입이며 값 또한 스트링 타입이다. 문법이 다소 특이하기 때문에 적응하기 어려울 수도 있다. 현재 Go 언어에서는 제네릭이 없다. package main func main() { v..

    Go: 배열 & 슬라이스 (Array, Slice)

    배열 배열은 메모리 공간에서 연속된 위치에 있는 값 목록이다. 배열은 자료구조의 일종이며 Go 에서는 같은 타입에 대해 여러 개의 값을 담을 수 있다. 일반적인 형태의 변수를 사용한다면 변수를 여러 개 사용해야 할 것도 배열이 있으면 그 일을 보다 수월하게 처리할 수 있다. 아래의 배열은 5개의 숫자를 받을 수 있는데, Go 의 배열은 크기가 정해져있는 정적 배열이다. 크기가 변할 수 있는 동적은 것은 슬라이스라는 개념에서 나올 것이다. package main func main() { numbers := [5]int{0, 1, 2, 3, 4} } 배열을 여러 줄로 사용하기 위해서는 맨 마지막 요소에 콤마를 반드시 찍어줄 필요가 있다. package main func main() { runes := [5]..