이 글은 Tucker의 Go언어 프로그래밍의 변수,함수,상수를 공부하고 정리한 내용이다.
변수란 값을 저장하는 메모리 상의 공간. 값에 접근해 값을 변경하는데 사용한다. 변수는 이름,값,타입,주소 속성을 갖는다. 변수 간 값의 전달은 항상 복사로 일어난다.
var a int = 10 // a 변수 선언
var msg string = "Hello Variable" // msg 변수 선언
a = 20 // a값 변경
msg = "Good Morning" // msg값 변경
fmt.Println(msg,a) // 출력 : Good Morning,20
변수 선언은 컴퓨터에게 값을 저장할 공간을 마련하고,명령을 내리는 것. 이것을 메모리 할당이라고 한다.
var a int = 10
// var : 키워드
// a : 변수명
// int : 타입
// 10 : 초기값
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) // 출력 : 3 0 4 5
변수 선언시 초기값을 생략하면 다음과 같은 기본값이 자동 대입된다.
타입을 생략하면 우변의 타입으로 변수 타입이 지정된다. 만약 우변이 숫자이면 기본 타입으로 결정된다. 정수는 int, 실수는 float64가 기본타입이다.
선언 대입문이란 말 그대로 선언과 대입을 한꺼번에 하는 구문이다. 선언 대입문을 상용하면 var 키워드와 타입을 생략해 변수를 선언할 수 있다.
Go언어는 강 타입 언어중에서 가장 강하게 타입을 검사하는 최강 타입 언어이다. 그렇기 때문에 연산이나 대입에서 타입이 다르면 에러가 발생한다.
a := 3
var b float64 = 3.5
var c = a * int(b) // b -> 소수점 이하 숫자 버림
fmt.Println(c) // 출력 : 9
var aa int16 = 3456
var cc int8 = int8(aa) // 타입 변환으로 상위 1바이트가 없어짐
fmt.Println(aa,cc) // 출력 : 3456,-128
변수는 자신이 속한 중괄호 {} 범위를 벗어나면 사라진다.
package main
import "fmt"
var g int = 10 // 패키지 전역 변수
func main() {
var m int = 20 // main 지역 변수
{
var s int = 50 // {} 지역 변수
fmt.Println(m, s, g)
}
m = s + 20 // 에러 : s는 {}의 지역변수 이기 때문.
}
정수는 부호를 표현해야 하기 때문에 첫 번째 비트를 부호 비트로 정해서 1이면, 0이면 양수를 나타낸다.
15 : 0 000000000001111
-15 : 1 111111111110001
2의 보수 : 모든 비트의 0을 1로, 1을 0으로 바꾸고, 1을 더한다.
IEEE-754 표준을 따라 실수 표현한다. 예를 들어 1024.235 -> 0.1024234 * 10^4 으로 나타내고, 0.1024234e+04라고 쓴다.
함수란 특별한 목적의 작업을 수행하는 코드 묶음이다. 함수를 사용하게 되면 같은 코드를 여러 번 작성하지 않고 한 번만 작성해 재활용 할수 있다.
함수는 함수 키워드,함수명,매개변수,반환 타입,함수 코드 블록으로 구성된다.
함수를 호출할 때 입력하는 값을 argument 혹은 인수라고한다.
외부로 부터 입력받는 변수를 parameter 혹은 매개변수라고 한다.
함수 호출시 인수는 매개변수로 복사되어 함수의 결과값이 반환된다.
매개 변수와 함수 내에서 선언된 변수는 함수가 종료되면변수 범위를 벗어나 접근할수 없다.
func Divide(a, b int) (int, bool) {
if b == 0 {
return 0, false
} else {
return a / b, true
}
}
func Divide(a, b int) (result int, success bool) {
if b == 0 {
result = 0
success = false
return
}
result = a / b
success = true
return
}
package main
import "fmt"
func printNo(n int) {
if n == 0 {
return
}
fmt.Println(n)
printNo(n - 1)
fmt.Println("After", n)
}
func main() {
printNo(3)
}
자기 자신 함수를 다시 호출하는 함수를 말한다.
탈출 조건을 명확히 해야 한다.
상수는 변하지 않는 값을 표현할때 사용한다. 변수는 프로그램이 실행되면 값이 수시로 변경되는데 상수는 값이 정해지면 변하지 않기때문에 상수로 지정하여 사용하면 편리하고 안전하다.
상수는 변하면 안 되는 값에 사용하거나 , 코드값을 통해서 숫자에 의미를 부여할때 사용한다.
상수로 변하지 않는 값에 이름을 부여하면 매번 값을 쓰지 않고 편하게 사용 가능하다.
어떤 숫자에 의미를 부여하는것을 말한다. 에를 들면 HTTP응답 코드나 ASCII 문자 코드에서의 사용이다.
package main
import "fmt"
const Pig int = 0
const Cow int = 1
const Chicken int = 2
func PrintAnimal(animal int) {
if animal == Pig {
fmt.Println("꿀꿀")
} else if animal == Cow {
fmt.Println("음메")
} else if animal == Chicken {
fmt.Println("꼬끼오")
} else {
fmt.Println("...")
}
}
func main() {
PrintAnimal(Pig)
PrintAnimal(Cow)
PrintAnimal(Chicken)
}
출력 결과
꿀꿀
음메
꼬끼오
const (
Red int = iota // 0
Blue int = iota // 1
Green int = iota // 2
)
코드값으로 사용시 1,2,3 으로 사용할때 iota를 사용하면 편리하다.
상수 선언 시 타입을 명시하지 않을수 있다. 타입이 없기 때문에 타입에러가 발생하지 않는다.
컴퓨터에서 리터럴이란 고정된 값, Go언어 에서 상수는 리터럴과 같이 취급한다. 상수는 컴파일 시 리터럴로 변환된다.
참고