프론트 엔드/Go

[Go] Go 변수와 상수

Koras02 2023. 2. 2. 21:37

이번 시간에는 go의 변수와 상수를 

알아보도록 하겠습니다.

 

변수 선언 

Go에서 변수는 var 키워드를 사용해

선언하고 다음과 같이 var 다음에 

 

변수 이름과 타입을 표기합니다.

var 변수명 타입

Go는 대부분의 언어와는 달리

변수 이름을 먼저 쓰고 그 다음에 

타입을 표기해 줍니다.

var a int
var b string

다른 언어들과 비교해 보면 

// C - 타입을 변수명 앞에 표기
int a;
char *b;
// 자바 - 타입을 변수명 앞에 표기
int a;
String b;

이와 같은 순서로 변수를 선언하는

이유는 코드를 더욱 자연스럽게

읽기 위해서 입니다.

 

코드를 읽을 때 var i int라는 구문을

보면 '변수 i를 int 타입을 선언한다"는 

뜻으로 자연스럽게 해석할 수 있습니다.

 

Go는 변수를 선언할 때 초기값을 

지정하지 않을 시 제로값으로 초기화 됩니다.

 

이는 변수에 값이 할당되기 전에 

가비지(garbage) 값이 할당되어

 

예상치 못한 결과가 발생하는 것을 

방지합니다.

 

  • 정수 타입의 제로값:0
  • 실수(부동소수점) 타입의 제로값:0.0
  • 문자열 타입의 제로값: **

변수를 여러 개 한번에 선언

 

같은 타입인 변수 여러 개를 콤마(,)로

구분하여 한꺼번에 선언할 수 있습니다.

 

var name, id, address string

타입이 다른 변수 여러 개를 한꺼번에

선언할 때는 소괄호(())로 묶어 표기합니다.

var (
   name string 
   age int
   weight float
)

특정 구간에 사용할 변수를 그룹으로

묶어서 한꺼번에 선언하면 가독성을 

높일 수 있습니다.

 

변수 타입 생략

 

변수 선언과 동시에 값을 할당할 때는

타입을 생략할 수 있습니다.

var c = true

타입을 생략하면 변수의 타입은 

초기값의 타입으로 정해집니다.

 

타입을 생략하고 변수 선언과

동시에 값을 할당할 때 

 

다음과 같이 특정 타입으로

변환된 값을 할당할 수도 있습니다.

var size = unit16(1024)

짧은 선언

 

변수 선언과 동시에 값을 할당할 떄는

var를 생략할 수 있습니다.

 

var를 생략할 떄는 := 연산자를 

사용합니다. 

start := 1

이미 선언된 변수에 값을 할당할 떄

:= 연산자를 사용할 수 없습니다.

 

:= 연산자는 변수 선언과 동시에

초기값을 할당할 때만 사용합니다.

 

이처럼 var을 생략하고 := 연산자를 

사용해 변수를 선언하는 것은 

짦은 선언이라 합니다.

 

그리고 짧은 선언은 함수 안에서만 

가능하고 전연 변수는 짧은 선언으로

선언할 수 없습니다.

// Go 코드 컨벤션
/* 
   Go는 제한된 범위 내에서만 사용하는 변수를 선언할 때 
   변수 타입을 생략하고 := 연산자로 짧게 선언하는 패턴을
   자주 사용합니다. 짦은 선언은 변수의 선언 방식이나 타입보다는
   코드의 패턴과 흐름에 집중하여 코드를 작성할 수 있게 해줍니다.
*/

if v := getValue() {
  fmt.Println(v)
}​

 

변수 이름 

 

변수 이름에는 공백을 포함하지 않은 

문자, 숫자, 밑줄(_)을 사용할 수 있고,

 

숫자는 첫 글자에 사용할 수 없습니다.

Go는 대소문자를 구문하므로 

 

NUMBER,Number, number는 모두 

다른 변수입니다. 변수 이름에는 

 

알파벳뿐만 아니라 유니코드 문자도

사용할 수 있습니다.

 

수학 기호를 사용하는 프로그램에서

변수 이름에 α(알파)나 β(베타)또는 

 

π(파이) 같은 기호를 사용하면 

프로그램을 좀 더 이해하기 쉽게 

작성할 수 있습니다.

 

var β float32

Go는 변수 이름에 예약어와

키워드를 사용할 수 없습니다.

 

// Go 코드 컨벤션 변수 이름의 길이
/* 프로그래밍 시 변수 이름은 그 의미를 정확히 설명할 수 
  있을 정도로 구체적이어야 합니다. 
  
  대부분의 프로그래밍 언어에서는 너무 짧은 이름은 피하며,
  보통 한 단어 또는 두세 단어를 조합하여 변수 이름을 
  정합니다. 하지만 Go에서는 변수의 이름을 될 수 있으면
  
  짧고 간결히, 그리고 함축적으로 짓도록 권장합니다.
  단어 여러 개가 조합된 긴 이름은 가독성을 떨어뜨리기 때문입니다.
  
  대신 변수의 범위를 최소한으로 제한하며, 그 범위 안에서는 변수의 
  의미가 모호해지지 않게 합니다. Go의 기본 라이브러리 패키지 소스
  코드를 보다 보면 w,p,r 처럼 한 글자로 된 변수이름을 자주 볼 수 있습니다.
*/

// 다음은 fmt 패키지 Fprintln 함수입니다. 앞서 이야기했듯 한 글자로 된
// 변수이름이 많습니다.

func Fprintln(w io.Writer, a ...interface{}) (n int, err error) {
   p := newPrinter()
   p.doPrint(a, true, true)
   n, err = w.Write(p.buff)
   p.free()
   return
 }

Go 코드 컨벤션 권장 표기법

 

단어 여러 개를 조합해서 이름을 지어야

한다면 밑줄(_)로 연결하지 않고 

 

낙타 표기법(came casing)으로 짓습니다.

내장 함수 이름이나 패키지 이름은 

피하는 것이 좋습니다.

 

Go 코드 컨벤션 Getter와 Setter

 

특정 객체를 반환하는 함수나 

메서드의 이름은 명사형으로 짖고

Get 접수어를 붙이지 않습니다.

// 특정 객체를 반호나하는 함수나 메서드의 이름은 
// 명사형으로 짓고 Get 접수어를 붙이지 않는다.

func Connection() *Conn { 
	// GetConnection()으로 사용하지 않음
	// ...
	return conn
}

// 특정 개체를 변형하거나 설정하는 함수의 이름 앞에는
// Set 포함

func SetId(i int) {...}

 

상수

상수는 처음 선언한 이후 변하지 않는

변수는 상수(constant)로 선언합니다.

 

변수는 var 키워드로 선언했듯 

상수는 const 키워드로 선언합니다.

 

상수는 불리언(Boolean), 숫자, 문자열 

타입으로만 선언할 수 있습니다.

 

const limit = 64

상수를 선언할 때는 타입은 따로 

표기하지 않아도 됩니다.

 

할당되는 값의 타입에 따라 

컴파일러가 자동으로 상수의 타입을 

결정하고 명시적으로 타입을  

 

지정해주려면 다음과 같이 

타입을 표기해 줍니다.

const max unit64 = 1024

상수는 컴파일할 때 값이 정해집니다.

특정 계산식의 결과를 상수로 지정할 수 있는데,

 

이런 계산식은 컴파일할 때 

연산할 수 있어야 합니다.

// 상수는 컴파일 시 값이 선언됨
// 특정 계산식의 결과를 상수로 지정 가능 
// 이런 계산식은 컴파일 시 연산할 수 있어야 함
const max = 1024 * 1024 // 유효함
const c = getNumber() // 유효하지 않음

변수 선언과 마찬가지로 상수 여러개를

한꺼번에 선언 시 ( )로 묶어 표기합니다.

const (
	RED = 0
	ORANGE = 1
	YELLO = 2
	GREEN = 3
	BLUE = 4
)

 


참고 자료

 

Go 언어 웹 프로그래밍 철저 입문: 2.2 변수와 상수

더북(TheBook): (주)도서출판 길벗에서 제공하는 IT 도서 열람 서비스입니다.

thebook.io

 

 

GitHub - Koras02/go-tutorial-blog: https://koras02.tistory.com/category/%ED%94%84%EB%A1%A0%ED%8A%B8%20%EC%97%94%EB%93%9C/Go

https://koras02.tistory.com/category/%ED%94%84%EB%A1%A0%ED%8A%B8%20%EC%97%94%EB%93%9C/Go - GitHub - Koras02/go-tutorial-blog: https://koras02.tistory.com/category/%ED%94%84%EB%A1%A0%ED%8A%B8%20%EC%...

github.com