Programming/Golang

Go 언어 배우기 (II) - 변수부터 컬렉션까지 (With Python)

chronosa 2020. 5. 12. 00:34

목차

     

    이미 익숙한 Python과 새로 배우는 Go의 문법/용어를 대조하면서 내용을 정리하고자 한다. 

    Go vs Python

    용법 Golang python
    패키지 가져오기 1. import [package]
    2. import ( 
      [package A]
      [Package B]/[Package C]
      ...
    )
    1. import [package]
    2. from [package] import [module]
    표준출력 fmt.Println() print()
    변수선언 1. var name [type]
    2. var name := [value]
    3. const NAME = [value]
    variable = value
    문자열 1. 일반 문자열 : "string",
    2. raw string : `string`
    1.일반 문자열 : "string"
    2.f-string : f"string {var}"
    반복문 1. for 초기식; 조건식; 조건 변화식 { 반복 수행할 구문 }
    2. for 조건식
    3. for 인덱스, 요소값 := range 컬렉션이름
    for item in iterable:
    조건문 1. if 조건식 { 
       } else if 조건식 { 
       } else {
       }
    2. if 짧은 표현식; 조건식 { 
       } else { 
       } 
    if 조건:
    분기문 switch 태그/표현식 {
    case 라벨/표현식: 수행구문
    case 라벨/표현식: 수행구문
    ...
    default 라벨/표현식: 수행구문
    }
     
    컬렉션 1. Array : var array = [5]int{1,2,3,4,5}
    2. Slice : 
      - var my_slice = []int{1,2,3}
      - my_slice := make([]int, 0, 5)
    3. Map : 
      - var my_map = map[string]string{
        "key" : "value"
        }
      - var my_map = make(map[string]string)
    1. list : my_list = [1,2,3]
    2. dict : my_dict = {"key" : "value"}
    slice vs list 1. 추가 : s = append(s, value)
    2. 깊은 복사 : copy(slice_a, slice_b) // a <- b
    3. 슬라이싱 : s[1:3]
    1. 추가 : my_list.append(value)
    2. 얕은 복사 : new = copy.copy(old)
    3. 깊은 복사 : new = copy.deepcopy(old)

    map vs dict 1. 값 추가 : my_map[key] = value
    2. 값 삭제 : delete(my_map, key)
    3. 값 확인 : val, exist := my_map[key]
    1. 값 추가 : my_dict[key] = value
    2. 값 삭제 : del(dict['key'])
    3. 값 확인 : my_dict.get(key, False)
    Null nil None

     

    ※ (Python) Module과 Package

    패키지(Packages)는 도트(.)를 사용하여 파이썬 모듈을 계층적(디렉터리 구조)으로 관리할 수 있게 해준다. 
    예를 들어 모듈 이름이 A.B인 경우에 A는 패키지 이름이 되고 B는 A 패키지의 B모듈이 된다.
    (출처 : https://wikidocs.net/1418)

     

    ※ (Python) iterable, iterator

    Iterable, Iterator, Generator는 개념이기도 하며 또한 ABC에 정의되어 있는 추상 클래스이기도 하다.
      - 두 클래스는 파이썬의 Iterator Protocol이라는 개념 속에서 정의되는 한 쌍이다.
    Iterable은 순회할 수 있는 모든 객체를 가리킨다.
      - 다른 말로 하면 파이썬에서 for 문의 in 키워드 뒤에 올 수 있는 모든 값은 Iterable이다.
      - 클래스가 Iterable이기 위해서는 __iter__ 추상메소드를 실제로 구현해야 하며
        이 메소드는 호출될 때마다 새로운 Iterator를 반환해야 한다.
    Iterator는 Iterable에 iter 내장 함수를 적용해 반환되는 객체로서 next 함수를 통해 값을 한 번에 한 번씩 반환하는 특징이 있다. 
    - 내부적으로 현재까지의 반환 상태를 관리하고 조건에서 정의한 마지막까지 반환하면 더 사용할 수 없으며
      StopIteration 예외를 일으킨다.
    결론적으로, Iterator는 Iterable이며, Iterator는 Iterable의 자식 클래스이고, Iterable을 상속받는다.
    (출처 : https://shoark7.github.io/programming/python/iterable-iterator-generator-in-python#2a)

    출처 : https://www.datacamp.com/community/tutorials/python-iterator-tutorial

     

    ※ (Go) nil

      - zero value는 명시적인 초기값을 할당하지 않고 변수를 만들었을 때 해당 변수가 갖게 되는 값이다.
      - nil은 포인터, 인터페이스, 맵, 슬라이스, 채널, 함수의 zero value이다. 
        (출처 : https://2kindsofcs.tistory.com/3)

     

    Go만의 특징

    1. Short Assignment Statement(:=) : 별다른 형 선언 없이 타입 추론이 가능
    2. 선언만 하고 쓰지 않았다면 에러를 발생하며 컴파일에 실패합니다.
    3. string으로 선언한 문자열 타입은 immutable 타입으로서 값을 수정할 수 없습니다.
    4. 문자열 타입은 ""와 같이 비어있을 수 있고
      다른 언어에서 표현되는 null과 같이 Go언어에서 사용되는 nil이 아닐 수 있습니다. 
    5. 형 변환을 할 때 변환을 명시적으로 지정해주어야합니다.
    6. 조건문의 조건식은 반드시 Boolean 형으로 표현돼야 합니다.
    7. 두 개 이상의 변수를 모아 놓은 것을 '컬렉션'이라고 합니다.
    8. 배열은 정적입니다. , 고정된 배열 크기 안에 동일한 데이터를 연속적으로 저장할 수 있다는 뜻입니다.
      그래서 크기를 동적으로 증가시키거나 부분 배열을 발췌하는 등의 기능을 가지고있지 않습니다.
    9. 'Slice(이하 슬라이스)'는 배열과 다르게 고정된 크기를 미리 지정하지 않고
      이후에 필요에 따라 크기를 동적으로 변경할 수 있고
      , 부분 발췌가 가능합니다.
    10. 기본적으로 슬라이스는 아무런 값도 초기화하지 않아도 배열의 위치를 가리키는 ptr
      배열의 길이인
      len, 전체크기인 cap 메모리를 가지고 있습니다.

     

    배열의 위치를 가리키는 ptr 과 배열의 길이인 len, 전체크기인 cap 메모리
    ptr은 단지 배열의 위치만을 가르킨다.

     

    예제 코드

    (1) Hello Go!

    package main
    import "fmt"
    func main() {
    	fmt.Println("Hello Go!")
    }

     

    (2) 슬라이스 자체가 참조하고 있는 것은 '주소값'이다.

    package main
    
    import "fmt"
    
    func main() {
    	c := make([]int, 0, 3) //용량이 3이고 길이가0인 정수형 슬라이스 선언
    	c = append(c, 1, 2, 3, 4, 5, 6, 7)
    	fmt.Println(len(c), cap(c))
    
    	l := c[1:3] //인덱스 1요소부터 2요소까지 복사
    	fmt.Println(l)
    
    	l = c[2:] //인덱스 2요소부터 끝까지 복사
    	fmt.Println(l)
    
    	l[0] = 6
    
    	fmt.Println(c) //슬라이스 l의 값을 바꿨는데 c의 값도 바뀜
    	//값을 복사해온 것이 아니라 기존 슬라이스 주솟값을 참조
    }
    
    ------------------------------------------------------------------
    
    > 7 8
    [2 3]
    [3 4 5 6 7]
    [1 2 6 4 5 6 7]
    

     

     

     

    출처 : https://edu.goorm.io/lecture/2010/한-눈에-끝내는-고랭-기초

    'Programming > Golang' 카테고리의 다른 글

    [번역] Strings, bytes, runes and characters in Go  (0) 2021.07.02
    Golang 기초 - III  (0) 2021.06.30
    Go 언어 배우기 (I) - 왜, 어떻게?  (0) 2020.05.06