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씩 차례로 증가하며 값이 초기화됨.
- 생략 가능