comnic's Dev&Life

[Golang] 6. 데이터 구조(배열과 슬라이스, 맵과 구조체) 본문

Golang

[Golang] 6. 데이터 구조(배열과 슬라이스, 맵과 구조체)

comnic 2023. 12. 30. 10:04
반응형

6. 데이터 구조(배열과 슬라이스, 맵과 구조체)

 

6.1 배열과 슬라이스

배열(Array):

  • 고정된 크기의 요소로 이루어진 데이터 구조입니다.
  • 배열의 크기는 타입과 함께 정의되며, 한 번 정의된 크기는 변경할 수 없습니다.
package main

import "fmt"

func main() {
    // 배열의 정의와 초기화
    var numbers [5]int
    numbers = [5]int{1, 2, 3, 4, 5}

    // 배열 순회
    for i := 0; i < len(numbers); i++ {
        fmt.Println(numbers[i])
    }
}

 

슬라이스(Slice):

  • 동적 크기의 데이터 구조로, 배열의 일부를 가리키는 참조 형태입니다.
  • 슬라이스는 배열의 일부를 나타내기 때문에 크기가 동적으로 조절 가능합니다.
package main

import "fmt"

func main() {
    // 슬라이스의 정의와 초기화
    numbers := []int{1, 2, 3, 4, 5}

    // 슬라이스 순회
    for _, num := range numbers {
        fmt.Println(num)
    }
}

 

  • append 함수를 사용하여 슬라이스에 새로운 요소를 추가할 수 있습니다.
package main

import "fmt"

func main() {
    // 슬라이스의 동적인 특성
    numbers := []int{1, 2, 3, 4, 5}

    // 새로운 요소 추가
    numbers = append(numbers, 6)
    fmt.Println(numbers) // [1 2 3 4 5 6]
}

슬라이스의 장점:

  • 크기가 동적이므로 메모리 관리가 편리하고 유연합니다.
  • 배열과는 달리 슬라이스는 값 복사가 아닌 참조를 통해 작동하므로 성능 상의 이점이 있습니다.

 

6.2 맵과 구조체

맵(Map):

  • 키-값 쌍으로 이루어진 데이터 구조입니다.
  • 맵은 동적으로 크기가 조절되며, 키를 통해 값을 검색하고 저장할 수 있습니다.
package main

import "fmt"

func main() {
    // 맵의 정의와 초기화
    person := map[string]interface{}{
        "name":    "Alice",
        "age":     30,
        "isMale":  false,
    }

    // 맵 값 조회
    fmt.Println("Name:", person["name"])
    fmt.Println("Age:", person["age"])
}

 

구조체(Struct):

  • 서로 다른 데이터 타입의 필드들을 묶어 놓은 사용자 정의 데이터 타입입니다.
  • 구조체는 필드의 이름으로 각각의 값을 식별할 수 있습니다.
package main

import "fmt"

// Person 구조체 정의
type Person struct {
    Name    string
    Age     int
    IsMale  bool
}

func main() {
    // 구조체의 사용
    person := Person{
        Name:   "Bob",
        Age:    25,
        IsMale: true,
    }

    // 구조체 필드 조회
    fmt.Println("Name:", person.Name)
    fmt.Println("Age:", person.Age)
}

 

6.3 메소드와 인터페이스 소개

메소드(Method):

  • 구조체나 사용자 정의 타입에 함수를 연결하여 해당 타입에 특화된 동작을 정의합니다.
  • 메소드는 특별한 형태의 함수로, 특정 타입과 연관된 동작을 수행합니다.
package main

import "fmt"

// Rectangle 구조체 정의
type Rectangle struct {
    Width  float64
    Height float64
}

// Area 메소드 정의
func (r Rectangle) Area() float64 {
    return r.Width * r.Height
}

func main() {
    // 메소드의 사용
    rectangle := Rectangle{Width: 5, Height: 10}
    area := rectangle.Area()
    fmt.Println("Area:", area)
}

 

인터페이스(Interface):

  • 메소드 집합을 나타내는 추상 타입입니다.
  • 인터페이스를 구현하는 타입은 인터페이스의 모든 메소드를 정의해야 합니다.
package main

import "fmt"

// Shape 인터페이스 정의
type Shape interface {
    Area() float64
}

// Rectangle 구조체가 Shape 인터페이스를 구현
func (r Rectangle) Area() float64 {
    return r.Width * r.Height
}

func main() {
    // 인터페이스의 사용
    rectangle := Rectangle{Width: 5, Height: 10}

    // Shape 인터페이스 변수에 할당
    var shape Shape
    shape = rectangle

    // 인터페이스 메소드 호출
    area := shape.Area()
    fmt.Println("Area:", area)
}

이러한 데이터 구조들은 Go 언어에서 데이터를 효과적으로 구조화하고 조작하는 데 사용되며, 각각의 특징과 용도에 따라 적절한 상황에서 활용됩니다.

반응형
Comments