Tucker의 Go 언어 프로그래밍 책과 유튜브를 통해 학습 중입니다.
변수란?
- 프로그래밍에서 변수(Variable)는 값을 저장하는 메모리 공간을 가르키는 이름(수학의 변수와 다름)
- 컴퓨터 입장에서 프로그램은 메모리에 있는 데이터를 언제 어떻게 변경할지를 나타낸 문서
- 값을 저장하는 위치 저장소는 하드디스크와 메모리 두 가지가 있음.
→ 하드디스크는 데이터를 저장하는 공간이고 느리다는 단점이 있음 다만, 컴퓨터가 꺼졌을 때 데이터가 삭제되지 않음
→ 메모리는 속도가 빠른 대신 컴퓨터가 꺼졌을 때 데이터가 삭제 됨
→ 프로그램이 실행될 때 CPU가 메모리에서 값을 가지고(Copy) 와서 실행 함
package main
import "fmt"
func main() {
var a int = 10 // a 변수 선언
var msg string = "Hello Variable" // msg 변수 선언
a = 20 // a 값 변경
msg = "Good Morning" // msg 값 변경
fmt.println(msg, a) // msg와 a 값 출력
}
a 변수 선언
- var=variable의 약자로 변수를 쓰고싶다고 알려주는 것
- a는 변수명으로 영문자 또는 숫자를 사용함
- int는 변수의 타입으로 어떤 형태의 타입을 가지고 있는지를 의미하며, integer(정수)의 약자
- = 는 대입 연산자 우변에 있는 값을 좌변에 넣어라 즉, 10이라는 값을 a에 넣어라. 라는 의미
msg 변수 선언
- msg라는 변수를 쓸거야 라는 의미
- string(타입) 문자열로 문자를 담을 수 있음
- 우변에는 문자를 사용해야하고, 문자열은 따옴표("")를 묶어서 사용함
a 값 변경
- 변수 값 변경 → 아까 위에서 a에 10이라는 값을 넣어둠. 그 값을 변경하는 것
- 대입 연산자(Assignment Operator,=) 우변에 있는 값을 좌변의 값에 넣는다(복사한다)
- 앞에서 선언한 a값의 공간에 20을 넣는 것
msg 값 변경
- msg 변수가 가르키는 공간에 우변의 값을 넣어라
msg와 a 값 출력
- 마지막으로, 변수 값 출력 fmt 패키지가 가지고 있는 println이라는 함수를 쓰겠다라는 의미로 msg와 a 변수의 값을들 출력함
- 변수가 가르키고 있는 메모리에 있는 데이터를 출력
변수의 4가지 속성
1. 이름
- a가 이름이 되는 것 (프로그래머에게 중요한 것)
2. 값
- 변수가 가르키는 메모리 공간, 그 공간에 저장된 값
- a가 가르키는 메모리 공간의 값이 10이라는 의미
3. 주소
- 변수가 저장된 메모리 공간의 시작 주소
→ 메모리 상에 어떤 위치를 나타낼 때 주소가 있어야 함 (컴퓨터 입장에서 이름이 필요 없음)
- 0부터 시작해서 1byte 씩 번호를 매겨 변수의 위치를 나타냄
→ 컴퓨터 입장에서 0/1 밖에 모름, 변수 이름(a)은 의미가 없고 변수를 메모리 주소로 생각함
4. 타입
- 변수가 가르키고 있는 데이터의 형태
- 정수, 실수, 문자열이냐 등
- 사이즈를 가지고 있음
→ 공간은 범위를 나타냄 from과 to가 있음
→ from은 시작점을 나타냄 끝은 시작점에 +size를 더하면 끝(to)이 됨
- 타입의 사이즈는 고정(fixed)되어 있음
숫자 타입
- 부호 없는 정수 숫자는 unit, 부호 있는 정수 숫자는 int, 실수는 float로 나타내며 뒤에 붙는 숫자는 비트 단위를 의미
이름 | 설명 | 값의 범위 |
unit8 | 1바이트 부호 없는 정수 | 0 ~ 255 |
unit16 | 2바이트 부호 없는 정수 | 0 ~ 65535 |
unit32 | 4바이트 부호 없는 정수 | 0 ~ 4294967295 |
unit64 | 8바이트 부호 없는 정수 | 0 ~ 18446744073709551615 |
int8 | 1바이트 부호 있는 정수 | -128 ~ 127 |
int32 | 2바이트 부호 있는 정수 | -32768 ~ 32767 |
int64 | 4바이트 부호 있는 정수 | -2147483647 ~ 2147483647 |
float32 | 4바이트 실수 | IEEE-754 32비트 실수 |
float64 | 8바이트 실수 | IEEE-754 64비트 실수 |
complex64 | 8바이트 복소수(진수, 가수) | 진수와 가수 범위는 float32 범위와 같음 |
complex128 | 16바이트 복소수(진수, 가수) | 진수와 가수 범위는 float64 범위와 같음 |
byte | uint8의 별칭, 1바이트 데이터를 나타낼 때 사용 | 0 ~ 255 |
rune | int32의 별칭, UTF-8로 문자 하나를 나타낼 때 사용 | -2147483648 ~ 2147483647 |
int | 32비트 컴퓨터에서는 int32, 64비트 컴퓨터에서는 int64와 같음 | |
uint | 32비트 컴퓨터에서는 uint32, 64비트 컴퓨터에서는 uint64와 같음 |
그외 타입
- 불리언(boolean): 참(true)과 거짓(false) 두 값만 가지는 타입
- 문자열(string)
- 배열(array): 같은 타입의 요소들로 이루어진 연속된 메모리 공간을 나타내는 자료구조
- 슬라이스: Go 언어에서 제공하는 가변 길이 배열 (슬라이스는 길이를 늘리거나 줄일 수 있음)
- 구조체: 필드(변수)의 집합 자료구조
- 포인터: 메모리 주소를 값으로 갖는 타입
- 함수타입: 함수를 가르키는 타입이며, 다른 말로 함수 포인터라고 함 (사용할 함수를 동적으로 바꿀 때 유용)
- 인터페이스: 메서드 정의의 집합
- 맵: key와 vaule를 갖는 데이터를 저장해둔 자료구조
- 채널(Channel): 멀티스레드 환경에 특화된 큐 형태 자료구조
변수 선언의 다른 형태
- Go에서는 여러 형태의 변수 선언을 지원함
package main
import "fmt"
func main () {
var a int = 3 // 가장 기본 형태
var b int // 초깃값 생략, default 값(0)으로 대체
var c = 4 // 타입 생략, 변수 타입은 우변 값의 타입이 됨
d := 5 // 가장 많이 사용하는 형태로, 선언 대입문 :=을 사용해서 var 키워드와 타입 생략
fmt.Println(a, b, c, d)
}
타입 변환
- 연산의 각 항목의 타입은 반드시 같아야 함.
→ Go 언어는 최강 타입으로, int+int64 같이 다른 타입의 항목을 연산할 수 없음 (타입이 다르면 연산이 불가능)
<타입 변환 전>
package main
import "fmt"
func main() {
a := 3 // int - 64 bit = int 64, Go는 int와 int64는 다른 타입으로 봄
var b float64 = 3.5
var c int = b // error
d := a * b // a를 float64로 바꾸던지, b의 타입을 바꾸던지 해야함.
var e int64 = 7
f := a * e // a는 int, e는 int64 타입으로 같은 정수지만 타입이 달라 연산 불가
fmt.Println(a, b, c, d, e, f)
}
<타입 변환 후>
package main
import "fmt"
func main() {
a := 3 // int
var b float64 = 3.5 // float64
var c int = int(b) // 3.5 -> 3 (실수가 정수가 됨)
d := float64(a) * b // a를 float64로 바꾸던지, b의 타입을 바꾸던지 해야함.
var e int64 = 7
f := a * int(e) // e를 int로 변환
fmt.Println(a, b, c, d, e, f)
}
'Language > Golang' 카테고리의 다른 글
Golang (Go언어) 함수(Function) (2) | 2024.10.30 |
---|---|
Golang (Go언어) 연산자(Operator) (0) | 2024.10.26 |
Golang (Go언어) fmt 패키지 (3) | 2024.10.26 |
Golang (Go 언어) 이란? (5) | 2024.10.22 |
Golang (Go 언어) 설치 (Mac) (0) | 2024.10.22 |