변수
프로그래밍에서 변수는 값을 저장하는 메모리 공간을 가리키는 이름
컴퓨터 입장에서 프로그램은 “메모리에 있는 데이터를 언제 어떻게 변경할지를 나타낸 문서”
package main
import "fmt"
func main() {
var a int = 10
var msg string = "Hello Var"
a = 20
msg = "Good Morning"
fmt.Println(msg, a)
}
Go
복사
1.
텍스트 입출력 하는 내장 패키지 fmt 임포트
2.
a, msg 변수 선언
3.
a=20, msg=Good Mornig 으로 변수 값 변경
변수 선언
변수를 사용하려면 먼저 변수를 선언한다.
변수 선언은 컴퓨터에게 값을 저장할 공간 생성을 위한 명령을 내리는데 이것을 메모리 할당이라고 한다.
var a init = 10
Go
복사
package main
import "fmt"
func main() {
var minimumWage int = 10
var workingHour int = 20
var income int = minimumWage * workingHour
fmt.Println(minimumWage, workingHour, income)
}
Go
복사
./ex4.2 ─╯
10 20 200
Go
복사
변수의 4가지 속성
•
이름 : 프로그래머는 이름을 통해 값이 저장된 메모리 공간에 쉽게 접근할 수 있다.
•
값 : 변수가 가리키는 메모리 공간에 저장된 값이다.
•
주소 : 변수가 저장된 메모리 공간의 시작 주소를 말한다.
•
타입 : 변수값의 형태를 말한다. 정수, 실수, 문자열 등 다양한 타입이 있다. 자료형, 데이터 타입이라고 한다.
변수 이름
변수 이름을 변수명이라고 한다.
변수명을 사용해서 변수값이 저장된 메모리 공간에 접근하고 수정할 수 있다.
Go 언어에서 변수명을 만들때는 아래 규칙을 따라야 한다.
•
변수명은 문자, -, 숫자를 사용해 만들 수 있지만 첫 글자는 반드시 문자나 _로 시작해야 한다 (한글, 한문도 가능)
** abc, a123, abc, 하나, _둘
** 123, 1abc, %abcd
•
_를 제외한 다른 특수문자(space 포함) 를 포함할 수 없다.
** ab_cd, abc_, _abc
** ab!cd, ac$dc, 하나 둘, [[haha]]
반드시 지켜야 하는 건 아니지만, 아래와 같은 권장 사항이 있다.
•
변수명은 영문자를 제외한 다른 언어의 문자를 사용하지 않는다.
** 하나, 둘 같은 한글이나 한자는 쓰지 않는다. ~> ?
•
변수명에 여러 단어가 이어지면 두 번째 단어부터는 대문자로 시작한다.
** firstName, doMagic
** first_name, do_Magic
•
변수명은 되도록 짧게 한다. 로컬 변수는 한 글자를 권장한다.
•
밑줄 _은 일반적으로 사용하지 않는다.
파이썬의 변수
변수 타입
1.
타입은 공간 크기를 나타낸다.
•
변수는 메모리 주소를 가리킨다.
•
메모리 주소는 값이 있는 메모리 시작 주소만 알려준다.
•
크기를 알아야지 해당 메모리 주소에서 얼만큼 읽을지 결정할 수 있다.
•
타입을 알면 크기를 알 수 있다.
2.
타입을 알아야 컴퓨터가 데이터를 해석할 수 있다.
•
컴퓨터에 2진수 1000 0000 값은 uint8 타입으로 128, int8 타입으로 -128. float32 타입으로 1.79366203434e-43 이다.
•
Go 언어는 숫자, 불리언, 문자열, 배열, 슬라이스, 구조체, 포인터, 함수, 인터페잇, 맵, 채널 등의 타입을 제공한다.
변수 선언의 다른 형태
package main
import "fmt"
func main() {
var a int = 3
var b int
var c = 4
d := 5
fmt.Println(a, b, c, d)
}
Go
복사
./ex4.2
10 20 200
Go
복사
타입별 기본값
타입 | 기본값 |
모든 정수 타입 | 0 |
모든 실수 타입 | 0.0 |
불리언 | false |
문자열 | ** (빈 문자열) |
그외 | nil |
선언 대입문 :=
선언 대입문이란 선언과 대입을 한번에 하는 구문이다.
선언 대입문을 사용하면 var 키워드와 타입을 생략해 변수를 선언할 수 있다.
var b = 3.1415 ~> b는 float64 타입으로 자동 지정
Go
복사
c := 365 ~> c는 int 타입으로 자동 지정
Go
복사
s := “hello word” ~> s는 string 타입으로 자동 지정
Go
복사
타입 변환
Go 언어는 강 타입 언어 중에서도 가장 강하게 타입 검사를 한다.
Go 언어에서는 연산이나 대입에서 타입이 다르면 에러가 발생한다.
a := 3 ~> int
Go
복사
var b float64 = 3.5 ~> float64
Go
복사
var c int = b ~> error
Go
복사
d := a * b ~> 다른 타입끼리 연산 불가 error
Go
복사
var e int64 = 7
Go
복사
f := a * e ~> a는 int 타입, e는 int64 타입으로 같은 정수지만 타입이 달라서 error
Go
복사
•
다른 강 타입 언어에서도 자동으로 변환해주는 타입들도 Go 에서는 지원하지 않는다.
•
매번 타입 변환을 해서 귀찮을 수 있지만, 자동 변환으로 발생하는 버그를 미연에 방지하는 장점이 있다.
package main
import "fmt"
func main() {
a := 3
var b float64 = 3.5
var c int = int(b) // 1
d := float64(a * c)
var e int64 = 7
f := int64(d) * e
var g int = int(b * 3) // 2
var h int = int(b) * 3 // 3
fmt.Println(g, h, f)
}
Go
복사
•
실수 타입에서 정수 타입으로 타입 변환하면 소수점 이하 숫자가 없어진다.
•
1의 c 값은 3.5에서 소수점 이하 숫자가 사라진 3이 된다. 소수점 이하 숫자는 반올림되지 않고 버려진다.
•
그래서 2, 3 결과가 서로 달라진다.
•
2에서는 3.5 * 3이 먼저 계산되고, int 타입으로 변환되어 g 값이 10이 되지만, 3에서는 3.5가 먼저 int 타입으로 변환되어 9가 된다.
•
int32 ~> 부호 있는 32비트, 4바이트 정수
•
int8 ~> 부호 있는 8비트, 1바이트 정수 | -128 ~ 127