반응형

Go는 정적타입 언어 

정적 타입은 컴파일 타임에 타입이 결정되며 런타임 중에 동적으로 타입이 변경될 수 없다 

대신 빠름(왜? 런타임 중에 타입 추론하거나 다시 최적화를 해야할 필요는 없기 때문에)

 

변수

값을 담는 공간 

변수 이름은 문자 

변수의 초기화는 런타임에 동작 / 사용하지 않는 변수가 있는 경우 에러를 뱉는다. 

또 변수를 선언만하고 명시적으로 초기화 하지 않은 상태에서 디폴트로 할당되는 값은 제로값 / int타입은 0  / 각 타입별 제로값 확인하는 함수는 Go IsZero()

구분자료형제로값
숫자형 int, float64 0
불리언 형 bool false
문자열 string "" (빈 문자열)

 

전역 변수 선언

전역 변수는 함수 내에서 선언하는 것과 달리 단축 구문(:=)을 사용하면 에러 

package main

import "fmt"

var hi string = "hi" // 가능
var hello = "hello" // 가능

goodbye := "goodbye" // 에러 발생

func main(){
    //
}

 

함수 외부에서는 모든 문장이 var , func 같은 키워드로 시작되므로 키워드가 없는 단축 구문은 외부에서 사용할 수 없음

 

여러 개 변수 선언

변수를 여러 개 선언하고 초기화 할때는 반드시 선언하는 벼눗와 초기화 하는 값의 개수가 같고, 타입은 같지 않아도 된다. 

package main

import "fmt"

func main(){
    hi, hello, goodbye := "hi", "hello", "goodbye"
}
 

 

var()을 이용해서도 여러 개 변수 선언 가능 

어떨 때 쓰는지? → 연관성 있는 변수 한번에 선언하기 위해서

package main

import "fmt"

func main(){
        var (
        i = 10
        j = 20
    )
}

 

변수 재할당 , 선언

아래 코드 상으로는 m 변수가 재선언하고 값이 변경됨 

정확히는 재선언은 아니고 string으로 m이 이미 선언되어있기 때문에 값만 변경된 것

package main

import "fmt"

func main() {
    m := "hello"
    m, i := "hihi", false

    fmt.Println(m, i)
}

>>hihi false

 

단축 변수 선언 할때 여러 개의 변수를 함께 선언할때 하나라도 새로운 변수가 있으면 

단축 변수 선언 문법을 사용하더라도 기존 변수에 대해서는 재할당 처리 

package main

import "fmt"

func main() {
    m := "hello"
    m := "hihi"

    fmt.Println(m)
}

>># command-line-arguments
.\test.go:12:4: no new variables on left side of :=

만약,

    m := "hello"
    m = "hihi"
로 :가 제거되면 재선언이 되지 않고 값만 변경되기 때문에 hihi 출력

Type 변환

다른type의 요소들 간의 할당에는 명시적인 변환 필요

package main

import (
    "fmt"
    "math"
)

func main() {
    var x, y int = 3, 4
    var f  = math.Sqrt(float64(x*x + y*y))
// /만약 float64 명시적 타입 선언을 제거하면? 에러 발생  prog.go:10:21: cannot use (x * x + y * y) (value of type int) as type float64 in argument to math.Sq
    fmt.Println(x, y, f)
} -> 3 4 5

 

이름 쉐도잉

패키지, 타입과 똑같은 이름의 변수를 선언해도 에러나지않는다. 

package main

import "fmt"

func main() {
    string := 10

    fmt.Print(string)
} --> 해당 코드는 정상 출력하지만 (10)

package main

import "fmt"

func main() {
    string := 10
    var m string
    m = "hi"

    fmt.Print(m)
} --> 해당 코드는 .\test.go:7:6: string is not a type 에러를 뱉는다. 왜? string이라는 변수가 var m 변수에서는 string 타입을 선언하고 있으니까

상수 

한번 선언되고 할당되면 값을 바꿀 수 없다 

선언과 할당을 동시에 진행되어야 하며 const 키워드를 사용하면 상수를 선언 가능 

자료형 명시도 선택적으로 해주면 된다. 어차피 컴파일러가 추론해줌 

package main

import "fmt"

func main() {
    const max_size int = 10
    const max_size = 10 //type 명시 안해도 가능

    fmt.Print(max_size)
}--> 10

여러 상수 선언

변수 처럼 여러개 선언 가능

package main

import "fmt"

func main() {
    const (
        max_size, lang = 10, "golang"
    )
    fmt.Print(max_size, lang)
}10golang

 

반응형

'Language Study > Go' 카테고리의 다른 글

[Golang]Method  (0) 2022.12.14
[Golang]Quick sort(퀵 정렬)  (0) 2022.12.13
[Golang]bubble sort(버블 정렬)  (0) 2022.12.13
[Golang]array, slice, map  (0) 2022.12.04
[Golang]클래스, 구조체, 인스턴스  (0) 2022.08.08

+ Recent posts