IT/Go

Go 변수, 데이터타입

iamhyeon 2024. 12. 26. 11:43

var 키워드 사용한 변수 선언

var 변수이름 타입

 

 

값의 할당

var 변수이름 타입
변수이름 = 값

 

 

선언과 할당의 통합

var 변수이름 타입 = 값

|   := 단축 선언 연산자 사용

- 변수 선언 시 := 를 사용하여 타입을 생략하고 값을 자동으로 추론
- 이 방법은 함수 내부에서만 사용 가능
- 권장X

변수이름 := 값


예시

x := 10 // x는 int 타입으로 자동 추론

|   여러 변수 선언

 

예시

var x, y int

var x, y int = 100, 200

x, y := 10, 20

|   상수 선언

 

const 키워드 사용

const Pi = 3.14

|   전역 변수 선언

 

- 전역 변수는 var 키워드 사용하여 함수 외부에서 선언

- 모든 함수에서 접근 가능


데이터 타입 (C와 많이 비슷)

 

 

  • 기본형 (Primitive Types):  Go에서 제공하는 기본 데이터 타입으로, 숫자, 문자열, 논리형, 복소수 등 포함.
  • 연속형 (Composite Types):  여러 값들을 묶어서 다룰 수 있는 데이터 타입으로, 배열, 슬라이스, 맵, 구조체, 채널 등 포함.

메모리 크기
- int와 uint는 플랫폼에 따라 다르므로 32비트 플랫폼에서는 4바이트, 64비트 플랫폼에서는 8바이트로 할당된다.
- 슬라이스의 크기는 기본적으로 슬라이스 자체가 24바이트로 시작하고, 그 이후 요소들이 추가됨에 따라 크기가 달라진다.
- 배열은 고정된 크기를 가지므로 크기는 요소 수 * 요소 크기로 계산된다. 예를 들어 int 배열은 각 요소가 4바이트이므로, n개의 요소를 가진 배열은 n * 4 바이트가 된다.

 

unsigned int 는 sql에서도 사용할 수 있다. => 프로그램 자료공간을 더 효율적으로 쓸 수 있다.

 


// 동일 폴더 내의 같은 패키지는 하나의 실행 파일로 묶인다.
// 이 때, main함수는 하나만 존재해야 하므로 폴더를 구분하여 main의 중복 선언 문제를 해결한다.
package main

import "fmt"

func main() {
	var unitName string = "Marine"
	var unitHP int = 40
	var unitAttack uint = 6
	var unitArmor uint = 0
	var attackSpeed float32 = 0.86
	var isFlying bool = false

	fmt.Println("유닛 정보:")
	fmt.Println("이름:", unitName)
	fmt.Println("체력:", unitHP)
	fmt.Println("공격력:", unitAttack)
	fmt.Println("방어력:", unitArmor)
	fmt.Println("공격 속도:", attackSpeed)
	fmt.Println("공중 유닛 여부:", isFlying)
}
var marineAttack int8 = 6      // 마린 공격력 (int8)
var marineHP int16 = 40        // 마린 체력 (int16)
var zerglingAttack int8 = 5    // 저글링 공격력 (int8)
var zerglingHP int16 = 35      // 저글링 체력 (int16)
var siegeTankAttack int32 = 70 // 시즈탱크 공격력 (int32)
var siegeTankHP int64 = 150    // 시즈탱크 체력 (int64)

fmt.Println("유닛 기본 속성: ")
fmt.Println("마린 - 공격력: ", marineAttack, "\t체력: ", marineHP)
fmt.Println("저글링 - 공격력:", zerglingAttack, "\t체력:", zerglingHP)
fmt.Println("시즈탱크 - 공격력:", siegeTankAttack, "\t체력:", siegeTankHP)
// 복소수 complex
var marinePosition complex64 = 5 + 2i      // 마린의 위치
var zerglingPosition complex64 = 3 + 4i    // 저글링의 위치
var siegeTankPosition complex128 = 7 + 10i // 시즈탱크의 위치
// 유니코드 아이콘 (문자 데이터 타입)  rune
var marineIcon rune = '⚔'    // 마린 아이콘 (검 모양)
var zerglingIcon rune = '🐜'  // 저글링 아이콘 (개미 모양)
var siegeTankIcon rune = '🚜' // 시즈탱크 아이콘 (탱크 상징)

fmt.Println("\n유닛 아이콘:")
fmt.Println("마린 아이콘:", string(marineIcon))
fmt.Println("저글링 아이콘:", string(zerglingIcon))
fmt.Println("시즈탱크 아이콘:", string(siegeTankIcon))


// 포인터 크기 데이터 타입
var mapIdentifier uintptr = 12345678 // 맵의 고유 식별자

fmt.Println("\n맵 정보:")
fmt.Println("맵 식별자:", mapIdentifier)
// 배열 array : 고정 크기의 배열
var unitHP [3]int = [3]int{40, 35, 150} // 유닛 체력 배열

fmt.Println("유닛 체력 (배열):")
fmt.Println("마린 체력:", unitHP[0])
fmt.Println("저글링 체력:", unitHP[1])
// 슬라이스 slice : 가변 크기의 배열
var unitNames []string = []string{"Marine", "Zergling", "Siege Tank"}

fmt.Println("\n유닛 이름 (슬라이스):")
fmt.Println("첫 번째 유닛:", unitNames[0])
fmt.Println("두 번째 유닛:", unitNames[1])
fmt.Println("세 번째 유닛:", unitNames[2])
// map[키타입][값타입]
var unitAttack map[string]int = map[string]int{
    "Marine":     6,
    "Zergling":   5,
    "Siege Tank": 70,
}

fmt.Println("\n유닛 공격력 ")
fmt.Println("마린 공격력: ", unitAttack["Marine"])
fmt.Println("저글링 공격력:", unitAttack["Zergling"])
fmt.Println("시즈탱크 공격력:", unitAttack["Siege Tank"])

 

// 구조체 struct
type Unit struct {
    Name     string
    HP       int
    Attack   int
    IsFlying bool
}

var marine Unit = Unit{Name: "Marine", HP: 40, Attack: 6, IsFlying: false}
var zergling Unit = Unit{Name: "Zergling", HP: 35, Attack: 5, IsFlying: false}
var siegeTank Unit = Unit{Name: "Siege Tank", HP: 150, Attack: 70, IsFlying: false}

fmt.Println("\n유닛 상세 정보 (구조체):")
fmt.Println("마린 이름:", marine.Name, "체력:", marine.HP, "공격력:", marine.Attack, "공중 여부:", marine.IsFlying)
fmt.Println("저글링 이름:", zergling.Name, "체력:", zergling.HP, "공격력:", zergling.Attack, "공중 여부:", zergling.IsFlying)
fmt.Println("시즈탱크 이름:", siegeTank.Name, "체력:", siegeTank.HP, "공격력:", siegeTank.Attack, "공중 여부:", siegeTank.IsFlying)

 

struct   

- 멤버변수만 있는 클래스

- 구조체는 여러 필드를 그룹화하여 하나의 복합 데이터 타입을 만드는 데 사용된다.

- type 키워드를 사용하여 새로운 타입을 정의한다.

'IT > Go' 카테고리의 다른 글

메서드 리시버  (0) 2025.01.29
Golang Live Reloading command line utility  (0) 2025.01.23
Java Spring Boot 애플리케이션에서 Go REST API 호출  (0) 2025.01.22
Go 언어 개발 환경 구성  (1) 2024.12.26
Go언어란  (0) 2024.12.26