GO언어

[GO] Go언어 특징,변수,상수,열거형

HHRR 2023. 1. 5. 15:04

Hello Go World

1) Go 역사

- 2009년 발표된 오픈 소스 프로그래밍 언어. 홈페이지 : golang.org

- 온라인 Go언어 컴파일러 : play.golang.org


2) Go 언어 특징

개념 있다/없다 설명
클래스 없다 클래스는 없지만, 매서드를 가지는 구조체 지원
상속 없다 상속을 지원하지 않음
메서드  있다 구조체가 메서드 가질 수 있음
인터페이스 있다 상속이 없지만 인터페이스는 있음
익명 함수 있다 함수 리터럴이라는 이름으로 제공함
가비지 컬렉터 있다 고성능 가비지 컬렉터를 제공
포인터 있다 메모리 주소를 가리키는 포인터가 있음
제네릭 프로그래밍 없다 제네릭 프로그래밍을 지원하지 않음
네임 스페이스 없다 네임스페이스를 제공하지 않음. 모든 코드는 패키지 단위로 분리됨

3) 코드 실행되기까지

1> 폴더 생성

Go언어에서 모든 코드는 패키지 단위로 작성됨. 같은 폴더에 위치한 .

go파일은 모두 같은 패키지에 포함되고, 패키지 명으로 폴더명을 사용함. -> 폴더 다르면 패키지도 다름

goproject/hello/extra

hello폴더에 든 .go 파일은 hello 패키지, extra 폴더에 든 .go파일은 extra 패키지

 

2> .go 파일 생성 및 작성

Go문법으로 코드 만듦. 확장자는 .go

 

3> Go 모듈 생성

go mod init goproject/hello

go mod init 뒤에 모듈 이름 적어주어 go 모듈 생성

생성하면 go.mod 파일이 생성됨. (모듈명, go버전, 필요 패키지 목록 정보)

 

4> 빌드

go build 명령 -> Go코드를 기계어로 변환하여 실행파일 만듦.

 

5> 실행


4) 코드 설명

package main //ⓐ

import "fmt" //ⓑ

func main() { //ⓒ
   fmt.Println("Hello World!") //ⓓ
}
  • ⓐ : 패키지(=코드 묶음) 선언, Go언어는 패키지 선언으로 시작되어야함.
    main 패키지(프로그램 시작점 포함)에 속한 코드임을 컴파일러에게 알려줌.
  • ⓑ : fmt 패키지(내장)를 가져옴. 표준 입출력 패키지 
  • ⓒ : main()함수를 선언. 
  • ⓓ : 표준 출력으로 문자열을 출력하는 함수

5) 연습문제 

# 2번

오류는 main 두개여서 생기는 오류여서 연습문제이므로 일단 무시한다.


변수

- 변수의 속성 : 이름, 값, 타입, 주소

- 변수의 선언 = 메모리 할당

- 타입변환 : Go언어는 자동 변환 지원하지 않으므로 연산이나 대입에서 타입 변환을 해줘야함

  • 기본 변수 선언 방식
// 변수 1
package main

import "fmt"

func main() {
	//기본 초기화
	//정수타입 : 0 , 실수(소수점):0.0, 문자열:"", Boolean:true, false
	//변수명 : 숫자 첫글자x, 대소문자 구분o, 문자 숫자 밑줄 특수기호 사용 가능
	//변수 및 상수 : 함수 내외 사용 가능
	var a int
	var b string
	var c, d, e int
	var f, g, h int = 1, 2, 3
	var i float32 = 11.4
	var j string = "Hi Golang!"
	var k = 4.74 //선언 동시 초기화
	var l = "Hi! Seoul!"
	var m = true

	a = 4
	b = "Hello Go!"
	e = 77

	fmt.Println("a : ", a)
	fmt.Println("b : ", b)
	fmt.Println("c : ", c)
	fmt.Println("d : ", d)
	fmt.Println("e : ", e)
	fmt.Println("f : ", f)
	fmt.Println("g : ", g)
	fmt.Println("h : ", h)
	fmt.Println("i : ", i)
	fmt.Println("j : ", j)
	fmt.Println("k : ", k)
	fmt.Println("l : ", l)
	fmt.Println("m : ", m)
}
  • 기본 초기화 - 정수타입 : 0, 실수(소수점) : 0.0, 문자열 : " ", Boolean : true, false
  • 변수명 : 숫자 첫글자x, 대소문자 구분o, 문자 숫자 밑줄 특수기호 사용 가능
  • 변수 및 상수 : 함수 내외 사용 가능

  • 변수 여러개 선언★
package main

import "fmt"

func main() {
	//여러 개 선언 ★
	var (
		name      string = "machine"
		height    int32
		weight    float32
		isRunning bool
	)

	height = 250
	weight = 350.56
	isRunning = true

	fmt.Println("name: ", name, "height : ", height, "weight : ", weight, "isRunning : ", isRunning)
}

  • 짧은 변수 선언 ★★많이쓰임★★
package main

import "fmt"

func main() {
	//짧은 선언
	//함수 안에서만 사용(전역x), 선언 후 할당 예외 발생 ★★★
	//주로 제한된 범위의 함수 내에서 사용할 경우 코드 가독성을 높일 수 있다. -> 추천

	shortVar1 := 3 //ex오라클의 프로시저 만들 때
	shortVar2 := "Test"
	shortVar3 := false
	//shortVar3 := true -> 예외 발생

	fmt.Println("shortVar1 : ", shortVar1, "shortVar2 : ", shortVar2, "shortVar3 : ", shortVar3)

	//Example
	if i := 10; i < 11 { //if문 안에서만 i사용 후 밖에서 소멸
		fmt.Println("Short Variable Test Success!")
	}

}
  • 함수 안에서만 사용 가능함.(전역x)
  • 선언 후 다시 할당 -> 오류 발생 ★★
  • 주로 제한된 범위의 함수 내에서 사용할 경우 코드 가독성을 높일 수 있다.(ex.if문) -> 추천!

 


상수

  • 상수 기본 사용법
// 상수1
package main

import "fmt"

func main() {
	//상수
	//const 사용 초기화, 한 번 선언후 값 변경 금지, 고정된 값 관리용
	//선언과 동시에 초기화해줘야함
	const a string = "Test1"
	const b = "Test2"
	const c int32 = 10 * 10
	//const d = getHeight() -> 상수는 값 못받아옴
	const e = 35.6
	const f = false
	/*
		에러 발생
		const g string
		g = "Test3"
	*/
	fmt.Println("a : ", a, "b : ", b, "c: ", c, "e : ", e, "f : ", f)

}
  • 상수 const는 선언과 동시에 초기화 해줘야함
  • 한 번 선언후 값 변경 금지, 고정된 값 관리용

  • 여러 상수 선언
// 상수2
package main

import "fmt"

func main() {
	const a, b int = 10, 99
	const c, d, e = true, 0.84, "test" //각각 다른 자료형
	const (
		//여러개 선언
		x, y int16 = 50, 90
		i, k       = "Data", 7776
	)
	fmt.Println(a, b, c, d, e)
	fmt.Println(x, y, i, k)

}
  • const()로 묶어서 상수 여러개 선언 가능.
  • 각각 다른 자료형 한번에 선언 가능

열거형

  • iota
// 열거형 
package main

import "fmt"

func main() {
	//열거형
	//상수를 사용하는 일정한 규칙에 따라 숫자를 계산 및 증가시키는 묶음
	const (
		Jan = iota + 1
		Feb
		Mar
		Apr
		May
		Jun
	)

	fmt.Println(Jan)
	fmt.Println(Feb)
	fmt.Println(Mar)
	fmt.Println(Apr)
	fmt.Println(May)
	fmt.Println(Jun)
}
// 열거형
package main

import "fmt"

func main() {
	const (
		_ = iota + 0.75*2
		DEFAULT
		SILVER
		GOLD
		PLATINUM
	)

	fmt.Println("D : ", DEFAULT)
	fmt.Println("S : ", SILVER)
	fmt.Println("G : ", GOLD)
	fmt.Println("P : ", PLATINUM)

}
  • iota는 0부터 1씩 차례로 증가하며 값이 초기화됨.
  • 생략 가능