오늘의하루

[Go 기초] 얕은 복사? Error? 본문

코딩공부

[Go 기초] 얕은 복사? Error?

오늘의하루_master 2025. 1. 22. 18:23
반응형

Go 언어에서 값 타입은 복사할 때 깊은 복사가 이루어지며 참조 타입은 얕은 복사가 이루어집니다.

1. 값 타입 (Value Type)

값 타입은 변수에 할당될 때 값 자체가 복사(깊은 복사)됩니다.

  • Go에서 기본적으로 제공하는 값 타입으로는 int, float, struct 등이 있습니다.
package main

import "fmt"

type Jang struct {
    X, Y int
}

func (j *Jang) Jangto(i int) {
    j.X = j.X * i
    j.Y = j.Y * i
}

func JangTest() {
    originV := Jang{1, 2}
    copyV := originV  // 깊은 복사

    copyV.Jangto(2)
    
    fmt.Println("origin = ", originV)  // 1, 2
    fmt.Println("copy = ", copyV)     // 2, 4
}

func main() {
    JangTest()
}
  • originV와 copyV는 서로 독립적인 값입니다.
  • copyV를 변경하더라도 originV에는 영향을 미치지 않습니다.

2. 참조 타입 (Reference Type)

참조 타입은 변수에 할당될 때 주소값이 복사(얕은 복사)됩니다.

  • Go에서 참조 타입으로는 pointer, slice, map, channel, interface 등이 있습니다.
package main

import "fmt"

type Jang struct {
    X, Y int
}

func (j *Jang) Jangto(i int) {
    j.X = j.X * i
    j.Y = j.Y * i
}

func JangTest() {
    originV := Jang{1, 2}
    copyV := &originV  // 포인터로 주소값을 할당
    
    copyV.Jangto(2)
    
    fmt.Println("origin = ", originV)  // 2, 4
    fmt.Println("copy = ", *copyV)     // 2, 4
}

func main() {
    JangTest()
}
  • copyV가 originV의 주소를 가리킵니다.
  • copyV를 변경하면 originV도 동시에 변경됩니다.

Go에서 error 타입의 동작

Go에서 error 타입은 interface 타입으로 Error() 메소드를 구현한 모든 타입을 에러로 취급할 수 있습니다.

fmt.Println 등에서 error 타입을 출력하면 자동으로 Error() 메소드가 호출되는데 이는 fmt.Println이 error 인터페이스를 처리하는 방식입니다.

fmt.Println과 error 타입

fmt.Println 함수는 error 타입을 출력할 때 자동으로 Error() 메소드를 호출합니다.

이 메소드는 에러 메시지를 문자열로 변환하여 출력하는 역할을 하기 때문에 Error() 메소드를 명시적으로 호출할 필요 없이 error 타입을 출력하면 내부적으로 Error() 메소드가 실행됩니다.

package main

import (
    "fmt"
    "time"
)

type MyError struct {
    When time.Time
    What string
}

func (e *MyError) Error() string {
    return fmt.Sprintf("at %v, %s", e.When, e.What)
}

func run() error {
    return &MyError{time.Now(), "error!!!!"}
}

func main() {
    if err := run(); err != nil {
        fmt.Println(err)  // 자동으로 Error() 호출됨
    }
}

fmt.Println의 doPrintln 내부 동작

fmt.Println 함수는 내부적으로 doPrintln이라는 함수에서 동작합니다.

이 함수는 인자로 전달된 값이 error 타입인 경우 자동으로 해당 타입의 Error() 메소드를 호출하여 에러 메시지를 출력합니다.

반응형
Comments