ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Go 기초] 얕은 복사? Error?
    코딩공부 2025. 1. 22. 18:23
    728x90
    반응형

    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() 메소드를 호출하여 에러 메시지를 출력합니다.

    728x90
    반응형
Designed by Tistory.