Backend/GoLang

GoLang만의 문법, 변수 표현식( Variable Expression)을 알아보자!

Juwon2106 2022. 1. 31. 11:14
728x90

이번 포스팅에서 다뤄볼 내용은

GoLang의 문법

변수 표현식

Multi Return

Naked Function

defer

에 대해 알아보겠습니다.

 

 

GoLang은 간결하고 명확한 문법을 추구합니다.

 

Go의 문법???

우선 함수의 접근제한자입니다.

 

Java의 접근 제한자( public, private )를 함수의 첫 글자의 대소문자로 구분합니다.

 

Go는 JavaScript처럼 Export Default를 하지 않습니다.

 

import에 선언만 하면 바로 사용할 수 있습니다.

 

먼저 example.go를 작성합니다.

example.go

package example

import "fmt"

func sayBye(){
	fmt.PrintLn("Bye~")
}

func SayHello(){
	fmt.PrintLn("Hello!")
}

 

첫 글자가 대문자인 SayHello인 함수는 import 후에 어디서나 호출 가능합니다.

 

하지만 소문자인 sayBye 함수는 예외를 발생시킵니다.

main.go

package main

import (
	"fmt"
    "example"
)

func main(){
	// 메소드의 첫 글자가 대문자인 경우 Public 접근 제한자가 설정됩니다.
    example.SayHello()
    
	// 메소드의 첫 글자가 소문자인 경우 Private 접근 제한자가 설정됩니다.
    // 따라서 예외가 발생됩니다.
    example.sayBye()
}

 

 

또한, Go는 생성자 메서드를 직접 수동으로 만들어 주어야 합니다.

 

Java의 new Method();

JavaScript Class의 constructor()

Python의 __init__처럼 선언과 동시에 초기화를 하지만 Go에서는 따로 해주어야 합니다.

 

다음은

변수와 상수입니다. ( var, const )

 

JavaScript의 var와 const의 개념과 유사합니다.

 

TypeScript처럼 변수 혹은 상수의 유형( Type )을 미리 선언할 수 있습니다.

 

다음 예제는 전역 변수, 지역 변수 둘 다 설정 가능합니다.

UnType
 const c_name = "juwon"
 var c_name2 = "juwon"
Type 
 const v_name string = "juwon"
 var v_name2 string = "juwon"

 

Type 바인딩(축약형 선언)입니다. ( 지역변수로만 선언 가능합니다. )

name := "juwon" // string type으로 자동 바인딩
age := 1 // int type으로 자동 바인딩

 

함수 표현식입니다.

 

Go의 경우 리턴 타입을 매개변수 선언한 다음에 표기해줍니다.

Java

public int multiply(int a, int b){
	return a * b;
}


Go

func Multiply(a, b int) int{
	return a * b // Go의 컴파일러가 컴파일 시점에 자동으로 세미콜론( ; )을 붙여 줍니다.
}

 

다음은 Java에는 없는

 

Multi Return입니다. ( ignore variable )

// return을 int 타입과 string 타입으로 선언
func lenAndUpper(name string)(int, string){
	// len()과 strings.ToUpper는 go가 가지고 있는 내장 메소드입니다.
	return len(name), strings.ToUpper(name)
}

func main(){
  length, upperName := lenAndUpper("juwon")
  fmt.PrintLn(length, uppercase)
  // 이처럼 Java에는 없는 Multi Return이 가능합니다.
  
  // 하지만 Multi Return 중 하나의 리턴값만 사용하고 싶을 경우
  length, upperName := lenAndUpper("juwon")
  // upperName을 선언만 했기 때문에 decalered but not used 예외가 발생합니다.
  fmt.PrintLn(length) 
  
  // 이러한 경우 Go에서는 _ ( ignore variable)를 사용할 수 있습니다.
  length, _ := lenAndUpper("juwon")
  fmt.PrintLn(length) // _로 무시할 수 있습니다.
  
  
}

 

 

Naked Return입니다. ( 벌거벗은 반환값? )

 

Naked Return은 Go Compiler에게 미리 선언한 변수명과 변수의 타입으로 리턴한다는 것을 알려주고 

 

컴파일하겠다는 뜻과 같습니다.

 

// naked return은 var length int, var uppercase string를 미리 선언하는 것과 같습니다.
func lenAndUpper(name string) (length int, uppercase string){
	// naked return 구문에 의해 length := 생략됨
    length = len(name)
    uppercase = strings.ToUpper(name)
    return
}

func main(){
    totalLength, upperCase := lenAndUpper("juwon")
    fmt.PrintLn(totalLength, upperCase)
}

 

defer 입니다. 

 

defer는 함수의 리턴 후에 실행할 수 있는 문법입니다.

 

func lenAndUpper(name string) (length int, uppercase string){
    defer fmt.PrintLn("defer는 메소드의 Return 이후에 실행되는 구문입니다.")
    length = len(name)
    uppercase = strings.ToUpper(name)
    return
}

func main(){
    totalLength, upperCase := lenAndUpper("juwon")
    fmt.PrintLn(totalLength, upperCase)
}

 

이번 포스팅으로 GoLang의 기본 문법들을 알아보았습니다.

728x90