5.2. 프로그램언어 고(Go)에서의 복합 데이터 타입

프로그램언어 고(Go)의 배열 데이터 타입

고(Go) 언어의 배열은 값의 목록을 저장하기 위해 사용되는 기본 제공 형식입니다. 배열은 같은 타입의 요소들로 구성되어 있으며, 인덱스를 사용하여 개별 요소에 접근할 수 있습니다.


package main

import "fmt"

func main() {

    var a [5]int // 길이가 5인 int 배열
    a[0] = 1
    a[1] = 2
    fmt.Println(a[0], a[1])

}  

위의 예제에서 a 는 길이가 5인 int 형 배열을 선언합니다. 각 요소는 a[index] 문법을 사용하여 접근할 수 있습니다.

배열은 선언 시 길이를 정의해야 합니다. 위 예제에서 a의 길이는 5로 고정되어 있습니다. 동적 크기의 배열이 필요하다면 슬라이스를 사용할 수 있습니다.

배열은 값 타입입니다. 즉, 배열을 함수에 전달하게 되면, 전달된 배열의 복사본이 만들어집니다.

다음은 2차원 배열의 예제입니다.


package main

import "fmt"

func main() {

    var b [2][3]int
    
    b[0][0] = 1   
    b[0][1] = 2
    b[0][2] = 3

    b[1][0] = 4
    b[1][1] = 5
    b[1][2] = 6
    
    fmt.Println(b)

}

2차원 배열도 위와 같이 선언하고 인덱싱할 수 있습니다. n차원 배열도 비슷한 방식으로 사용할 수 있습니다.

배열은 for 문과 함께 자주 사용되는데, 다음은 배열 요소를 출력하는 예제입니다.


package main

import "fmt"

func main() {

    a := [3]int{1, 2, 3}

    for i := 0; i < len(a); i++ {
        fmt.Println(a[i]) 
    }

}  

len 함수를 사용하여 배열의 길이를 얻고 이를 사용하여 for 문을 순회할 수 있습니다.

이상으로 배열에 대한 간략한 설명과 예제 코드를 드렸습니다. 배열은 고정 길이의 같은 타입 값을 저장하기 위해 유용하게 사용될 수 있습니다. 보다 복잡한 데이터 처리를 위해서는 슬라이스와 맵 등의 자료구조를 활용할 수 있습니다.

프로그램언어 고(Go)의 슬라이스 데이터 타입

고(Go)언어의 슬라이스 자료형에 대해 설명드리겠습니다.

슬라이스는 고(Go)언어에서 동적인 배열을 구현하기 위해 제공하는 내장 자료형입니다. 배열과 유사하지만 크기가 동적으로 변경될 수 있다는 점이 다릅니다.


package main

import "fmt"

func main() {

    // 슬라이스 생성
    nums := []int{1, 2, 3}

    // 슬라이스 추가
    nums = append(nums, 4)

    fmt.Println(nums) // [1 2 3 4]
}

위의 예제코드에서 볼 수 있듯이 슬라이스는 []기호 안에 요소 타입을 선언하여 생성합니다.

이미 생성된 슬라이스에 append 함수를 사용하여 요소를 추가할 수도 있습니다. 이러한 특성으로 인해 배열과 다르게 동적인 크기 변경이 가능합니다.

슬라이스의 주요 특징들은 다음과 같습니다.

- 타입 []T로 표현 (T는 요소 타입)
- 순서가 있는 요소들의 모음
- 길이와 용량을 가짐 (len, cap 함수 사용)
- append 함수로 요소 추가 가능
- copy 함수로 슬라이스 복사 가능
- make 함수로 초기화된 슬라이스 생성 가능

슬라이스를 다루는 주요 함수들은 다음과 같습니다.

- make : 새로운 슬라이스 생성
- append : 요소 추가
- copy : 슬라이스 복사
- len : 길이 반환
- cap : 용량 반환

아래는 위의 함수들을 사용한 간단한 예제입니다.


func main() {
  arr := make([]int, 5) // 길이 5 용량 5 슬라이스 
  arr2 := []int{1, 2, 3}
  
  copied := make([]int, len(arr2)) 
  copy(copied, arr2) 
  
  arr = append(arr, 1, 2, 3)  
  fmt.Println(arr, copied)
  fmt.Println(len(arr), cap(arr))

}

위와 같이 슬라이스는 고(Go)언어에서 유용하게 사용되는 동적 자료형입니다. 지금 설명한 기초적인 내용 외에도 더 많은 학습이 필요하겠지만, 이 정도 내용으로 기본 개념을 이해하는데 도움이 되시길 바랍니다.

프로그램언어 고(Go)의 맵 데이터 타입

프로그램 언어 Go의 Map 데이터 타입은 키와 값의 쌍으로 이루어진 해시 테이블과 유사한 데이터 구조입니다. Map은 Go 언어의 내장 데이터 타입 중 하나로, 다음과 같은 특징이 있습니다.

  • 키로 값을 찾아올 수 있는 해시 테이블과 유사한 구조
  • 키 타입은 반드시 comparable 해야 함
  • 값 타입에 제한 없음
  • Nil 맵이 존재 가능
  • 자동 정렬 안 됨

Map을 생성할 때는 make 함수를 사용합니다.


package main

import "fmt"

func main() {

  // string을 키로, int를 값으로 가지는 Map 생성
  intMap := make(map[string]int) 
  
  // Map에 요소 추가
  intMap["apple"] = 5
  intMap["banana"] = 3
  
  // Map 요소 출력
  fmt.Println(intMap)
}

위 예제에서 보듯이 map[keyType]valueType 과 같은 형식으로 선언합니다.
그리고 key를 이용하여 값에 대한 접근이 가능합니다. 위 예제 출력 결과는 map[apple:5 banana:3] 이 됩니다.

Map에 새로운 요소를 추가하면 해당 key가 존재하지 않을 경우 자동으로 추가되고, 해당 key가 이미 존재할 경우 값이 수정됩니다.


package main

import "fmt"

func main() {

  intMap := make(map[string]int)

  intMap["apple"] = 5
  intMap["apple"] = 7 // apple 키의 값을 7로 수정
  intMap["banana"] = 3 // banana 키 추가
  
  fmt.Println(intMap) 
}  

위 예제의 출력은 map[apple:7 banana:3] 가 됩니다. apple의 값이 5에서 7로 수정되었습니다.

또한, 2가지 방식으로 Map에 저장된 key 존재 여부를 확인할 수 있습니다.


package main

import "fmt"

func main() {

  intMap := make(map[string]int) 
  
  // 1번째 방식 : 값 반환
  value, exists := intMap["apple"]
  
  if !exists {
    fmt.Println("apple 키가 존재하지 않습니다") 
  } else {
    fmt.Println(value)
  }
  
  // 2번째 방식 : bool 값 반환
  _, exists = intMap["banana"] 
  
  if !exists {
   fmt.Println("banana 키가 존재하지 않습니다")
  }  
}

1번째 방식은 값과 bool 타입을 반환하기 때문에 조금 더 긴 코드가 됩니다.
2번째 방식은 bool값만 확인하기 위해서 _ blank identifier를 사용하는 간결한 방식입니다.

마지막으로, Go언어 Map 타입도 for 반복문을 사용하여 순회가 가능합니다.

  
package main

import "fmt"

func main() {

  intMap := map[string]int{"apple": 5, "banana": 3}
  
  for key, value := range intMap {
    fmt.Println(key, value) 
  } 
}

위 예제처럼 key와 value를 가져와 출력합니다.
Map도 다른 컬렉션 타입과 비슷하게 for range 문법을 사용할 수 있습니다.

이상으로 프로그램언어 Go의 Map 데이터 타입에 대해서 간단히 설명해드렸습니다.
Map 타입은 키와 값으로 구성된 복잡한 데이터를 처리할 때 유용하게 사용할 수 있습니다.
앞으로 Map타입을 잘 활용하시기 바랍니다.

프로그램언어 고(Go)의 구조체 데이터 타입

고(Go) 프로그램언어의 구조체 데이터 타입에 대해 설명 드리겠습니다.

구조체는 연관된 데이터를 같이 묶어서 사용할 수 있는 사용자 정의 데이터 타입입니다. 구조체를 정의하면 복합 데이터 타입을 만들 수 있습니다.

type Person struct {
    Name string
    Age  int
}

위 코드는 Person이라는 구조체를 정의합니다. Name과 Age 두 개의 필드(멤버)를 가지고 있습니다. 각 필드의 타입도 지정해주어 Name은 문자열, Age는 정수로 선언했습니다.

구조체 변수를 선언하고 필드에 접근하는 방법은 아래와 같습니다.

func main() {
    var p Person 
    p.Name = "홍길동"
    p.Age = 30

    fmt.Println(p)
    fmt.Println(p.Name, p.Age)
}

p라는 Person 타입의 변수를 선언하고 각 필드에 값을 대입했습니다. .(점) 연산자를 사용하여 필드에 접근할 수 있습니다.

구조체에 함수를 추가할 수도 있습니다. 메서드(method)라고 부릅니다.

func (p Person) intro() string {
    return "제 이름은 " + p.Name + "이고, 나이는 " + strconv.Itoa(p.Age) + "세입니다." 
}

intro() 메서드가 Person 구조체에 추가되었습니다. p.Name 과 p.Age로 접근 가능합니다.

구조체는 유사한 성격의 데이터를 묶어서 관리할 수 있고, 메서드를 추가하여 기능을 확장할 수 있기 때문에 매우 유용합니다. 복잡한 데이터와 기능을 한 곳에서 관리할 수 있습니다.

고(Go)에서는 embedded types, anonymous fields 등의 기능으로 구조체를 더 유연하게 사용할 수 있습니다.

인터페이스와의 결합도 독특한데 이를 통해 객체지향 프로그래밍기법을 구조체에서도 사용할 수 있습니다.

이상으로 고(Go) 구조체에 대해 간략히 설명해드렸습니다. 구조체의 장점과 사용법에 대해 자세히 이해하시기 바랍니다.

프로그램언어 고(Go)의 채널 데이터 타입

채널은 고(Go) 프로그래밍 언어의 특징적인 동시성(concurrency)을 위한 통신수단입니다. 채널을 사용하면 고루틴(goroutine)간에 데이터를 안전하게 주고받을 수 있습니다.

채널은 타입을 가질 수 있는데, 이 타입은 채널을 통해 전송할 데이터의 타입을 정의합니다. 예를 들어 다음과 같이 정수형 채널을 선언할 수 있습니다.

var intChannel chan int

위의 코드는 int 타입의 데이터만 전송할 수 있는 채널을 정의합니다.

채널은 방향성을 가질 수 있는데, 단방향 또는 양방향 채널로 선언할 수 있습니다. 단방향 채널은 데이터가 단방향으로만 흐르도록 제한하는 반면, 양방향 채널은 쌍방向으로 데이터 송수신이 가능합니다.

// 단방향 채널
chan <- int 

// 양방향 채널
chan int

위의 코드에서 첫 번째 줄은 데이터 송신만 가능한 단방향 채널이고, 두 번째 줄은 데이터 송수신 모두 가능한 양방향 채널입니다.

채널을 사용하기 위해서는 make() 함수로 채널을 생성해야 합니다. 다음은 정수형 데이터 전송용 채널을 생성하는 예제입니다.

intChannel := make(chan int)

make()에 채널 타입과 용량(capacity)을 파라미터로 전달할 수 있습니다. 용량은 버퍼(buffer)의 크기를 의미하는데, 버퍼가 있는 채널은 용량 만큼 데이터를 버퍼링할 수 있습니다.

intChannel := make(chan int, 10)

위의 코드는 용량이 10개인 정수형 채널을 생성합니다. 버퍼가 없는(용량이 0인) 채널을 무버퍼(unbuffered) 채널이라고 하며, 이 경우 데이터 전송에 실제 통신이 발생합니다.

채널로 데이터를 보내기 위해서는 <- 연산자를 사용합니다. 다음은 정수형 데이터를 intChannel 채널로 보내는 예제입니다.

data := 10 
intChannel <- data

채널로부터 데이터를 받기 위해서는 반대방향 <- 연산자를 사용합니다.

data := <- intChannel 

위의 코드는 intChannel로부터 데이터를 받아 data 변수에 할당하는 예제입니다.

이 외에도 채널은 병렬처리, 동기화 등 고급 동시성 패턴을 구현하는데 매우 유용하게 사용됩니다. 채널은 고(Go) 언어의 가장 큰 특징 중 하나이므로 꼭 학습이 필요합니다.

Leave a Comment