2021. 5. 8. 23:49ㆍ개발/Golang
Go언어를 배우기 위해 tucker님의 책을 구매하였고, tucker님이 직접 2달간 교육을 해주신다고 한다.. 이런 기회가 진짜 오지 않는 기회라고 생각한다... 그리고 이참에 배우고 싶었던 Go언어를 한번 제대로 배우고 스스로 발전을 해보고 싶다는 생각을 하게 되었다. Go언어를 배우기 위해 요약노트도 보는 것도 좋지만 책을 보게 되면 더욱 자세하고 심층적으로 다루니... 한번 보시면 좋을 거 같습니다.
1. 변수란?
- 값을 저장하는 메모리 공간
- 변수를 이용하면 쉽고 효과적으로 메모리에 있는 데이터를 조작할 수 있다.
package main
import "fmt"
func main() {
var a int 10 // a 변수 선언
var msg string = "Hello Variable" // msg 변수 선언
a = 20 // a 값 변경
msg = "Good Moring" // msg 값 변경
fmt.Println(msg, a) // msg와 a 값 출력
}
출력 값 : Good Moring 20
a의 처음 값은 int 10이었지만 a를 20으로 변경하였고, msg의 처음 값도 "Hello Variable" 이였지만, "Good Moring"을 변경하였습니다. 위와 같이 프로그램에서 값을 저장하고, 변경하고 사용할 때 변수를 사용합니다.
2. 변수 선언
예제 ) var a int = 10
- var : variable의 약자로 변수 선언을 알리는 키워드
- a : 변수 이름
- int : 타입
- = : 대입 연산자
- 10 : 초기값
package main
import "fmt"
func main() {
var minimumWage int = 10 // 변수 minimumWage 선언 및 초기화
var workingHour int = 20 // 변수 workingHour 선언 및 초기화
// 변수 income 선언 및 초기화
var income int = minimumWage * workingHour
// 변수 minimumWage, workingHour, income 출력
fmt.Println(minimumWage, workingHour, income)
}
출력 값 : 10 20 200
minimumWage와 workingHour를 선언하고 각각 10과 20을 대입합니다.
컴퓨터는 실행할 때 메모리에 정수 타입 데이터를 만들고 → minimumWage라고 지칭한 뒤 → 값을 10을 복사합니다.
income이라는 변수 값에는 minimumWage와 workingHour의 연산 결과도 대입하였습니다.
변수는 이와 같이 정수형만 사용하는 것이 아니라 수식도 사용이 가능합니다.
3. 변수에 대해 더 알아보기
1) 변수의 4가지 속성
- 이름 : 이름을 통해 값이 저장된 메모리 공간에 손쉽게 접근이 가능
- 값 : 변수가 가리키는 메모리 공간에 저장된 값
- 주소 : 변수가 저장된 메모리 공간의 시작 주소를 말합니다.
- 타입 : 변숫값의 형태. 정수, 실수, 문자 열등 다양한 타입이 있음.
2) 변수는 이름을 가지고 있다.
변수 이름을 변 수명이라고 합니다. 프로그래머는 변수명을 사용해서 변숫값이 저장된 메모리 공간에 접근하고 수정할 수 있다.
Golang의 변수 명의 규칙 ( 반드시 지켜야 하는 규칙 )
- 변수명은 문자, _, 숫자를 사용하지만, 첫 글자는 반드시 문자나 _로 시작해야 됩니다.
(영어뿐 아니라 한글, 한문, 다른 언어 문자도 가능 )
Ex) abc, 123, _abc, 하나, _둘 ( O )
123, 1 abc, % abcd ( X ) - _를 제외한 다른 특수문자 (space 포함)를 포함할 수 없습니다.
Ex) ab_cd, abc_, _abc ( O )
ab! cd, ac$dc, 하나 둘, [[haha]] ( X )
Golang의 권장 사항 ( 반드시 지켜야 하는 것은 아님 )
- 변수명은 영문자를 제외한 다른 언어 문자를 사용하지 않는다. -> 한자나 한글을 쓰지 않습니다.
- 변수명에 여러 단어가 이어지면 두 번째 단어부터는 대문자로 시작합니다. ( camel기법 )
Ex) firstName, tuckerGolsAwesome, doMagic ( 올바른 예 )
first_name, tuckersgoisawesome, do_Magic ( 올바르지 않은 예 ) - 변수명은 되도록 짧게 합니다. 잠시 사용되는 로컬 변수는 한 글자를 권장합니다.
- 밑줄은 일반적으로 사용하지 않습니다. _를 사용하는 경우를 함수와 패키지에서 설명합니다.
3) 변수의 타입
타입은 왜 필요할까요? 첫 번째로는 타입은 공간의 크기를 나타냅니다. 두 번째로는 타입을 알아야 컴퓨터가 데이터를 해석할 수 있습니다.
Go언어는 숫자, 불리언, 문자열, 배열, 슬라이스, 구조체, 포인터, 함수, 인터페이스, 맵, 채널 등의 타입을 제공합니다.
숫자 타입
- uint : 부호 없는 정수
- uint 8 : 1바이트 부호 없는 정수 ( 범위 : 0 ~ 255 )
- uint 16 : 2바이트 부호 없는 정수 ( 범위 : 0 ~ 65535 )
- uint 32 : 4바이트 부호 없는 정수 ( 범위 : 0 ~ 4294967295 ) - init : 부호 있는 정수
- int 8 : 1바이트 부호 있는 정수 ( 범위 : -128 ~ 127 )
- int 16 : 2바이트 부호 있는 정수 ( 범위 : -32768 ~ 32767 )
- int 32 : 4바이트 부호 있는 정수 ( 범위 : -2147483648 ~ 2147483547 )
- int 64 : 8바이트 부호 있는 정수 ( 범위 : -9223372036844775808 ~ 9223372036854775807 ) - float : 실수 ( 소수점 )
- float 32 : 4바이트 실수 ( IEEE -754 32 비트 실수 )
- float 64 : 8바이트 실수 ( IEEE -754 64 비트 실수 ) - byte : unit 8의 별칭 , 1바이트 데이터를 나타낼 때 사용 ( 범위 : 0 ~ 255 )
- rune : int32의 별칭 , UTF-8을 문자 하나를 나타낼 때 사용
( 범위 : -2147483648 ~ -2147483648 ) - int : 32비트 컴퓨터에서는 int32 , 64비트 컴퓨터에선 int 64와 같음
- uint : 32비트 컴퓨터에서는 uint 32 , 64비트 컴퓨터에선 uint 64와 같음
그 외 타입
- bool : 참과 거짓을 가지는 타입 , bool로 선언하고 참은 true, 거짓은 false로 씁니다.
- string : 문자열
- 배열 : 같은 타입의 요소들로 이루어진 연속된 메모리 공간을 나타내는 자료구조
- 슬라이스 : Go 언어에서 제공하는 가변 길이 배열 , 배열은 정해지면 줄이거나 늘일 수는 없지만 슬라이스는 가능
- 구조체 : 필드의 집합 자료구조, 보통 상관관계가 있는 데이터를 묶어놓을 때 사용
- 포인터 : 메모리 주소를 값으로 갖는 타입, 포인터를 이용해 같은 메모리 공간을 가리키는 여러 변수를 만들 수 있음
- 함수 타입 : 함수를 가리키는 타입, 다른 말로 함수 포인터라고 하며 사용할 함수를 동적으로 바꿀 때 유용
- 인터페이스 : 메서드를 정의
- 맵 : 키(key)와 값(value)의 데이터를 저장해둔 자료구조 , 쉽게 전화번호부나 사전을 생각하면 좋음
- 채널 : 멀티스레드 환경에 특화된 큐 형태 자료구조
4. 변수 선언의 다른 형태
package main
import "fmt"
func main() {
var a int = 3 // 기본형태
var b int // 초기값 생략, 초기값은 타입별 기본값으로 대체
var c = 4 // 타입 생략, 변수 타입은 우변 값의 타입이 됨
d := 5 // 선언 대입문 :=을 사용하여 var 키워드와 타입 생략
fmt.Println(a,b,c,d)
}
출력 값 : 3 0 4 5
타입별 기본값
- 모든 정수 타입 : 0
- 모든 실수 타입 : 0.0
- 불리언 ( bool ) : false
- 문자열 ( string ) : ""(빈 문자열)
- 그 외 : nil ( 정의되지 않은 메모리 주소를 나타내는 Go 키워드 )
숫자 값 기본 타입
타입을 생략하게 되면 우변의 타입으로 좌변(변수)의 타입이 지정됩니다. 만약 우변이 숫자이면 기본 타입으로 결정됩니다. 정수는 int 실수는 float64가 기본 타입입니다.
선언 대입문 :=
선언 대입문이란 선언과 대입을 한꺼번에 하는 구문이며 사용하면 var키워드와 타입을 생략해 변수 선언 가능
var b = 3.1415 // b는 float 타입으로 자동지정
c := 365 // c는 int 타입으로 자동지정
s := "hello world" // s는 string 타입으로 자동지정
5. 타입 변환
Go언어는 가장 강하게 타입 검사를 하는 최강 타입 언어입니다. Go언어에서는 타입이 다르면 에러가 발생합니다.
a := 3 // int
var b float 64 = 3.5 // float 64
var c int = b // error - float 64변수에 int 대입불가
d := a * b // error - 다른 타입인 int 변수와 float 64 연산 불가
var e int 64 = 7 // error - a는 int 타입, e는 int 64 타입으로 값은 정수지만 타입이 달라 연산불가
f := a * e
연산을 하기 위해서는 타입을 변환해서 연산을 해줘야 합니다. 이것을 타입 변환이라고 하며, 원하는 타입명을 적고 ( )로 변화시키고 싶은 변수를 묶어줘서 타입을 변환합니다.
첫 번째 유의점 : 실수 타입에서 소수점 이하 숫자가 없어짐.
// 위 코드의 올바른 예
package main
import "fmt"
func main() {
a := 3 // int
var b float64 = 3.5 // float64
var c int = int(b) // float64 b변수를 int로 타입변환
d := float(a * c) // int에서 float64로 변환
var e int64 = 7
f := int64(d) * e // float64 변수인 d를 int 64로 변환하여 계산
var g int = int(b * 3) // () 안에서 계산후 int로 변환
var h int = int(b) * 3 // float64에서 int로 변환 후 계산 g와 값이 달라짐
fmt.Println(g, h, f)
}
출력 값 : 10 9 63
변수 g의 값은 () 안에서 먼저 계산 후 int로 변환되어 g의 값이 10이 되고, h는 b의 변수 3.5가 int로 변환되고 난 다음 9가 됩니다.
두 번째 유의점 : 큰 범위 갖는 타입에서 작은 범위를 갖는 타입으로 변환 시 값이 달라질 수가 있음
package main
import "fmt"
func main() {
var a int16 = 3456
var c int8 = int8(a) // int 16 타입에서 int8 타입으로 변환
fmt.Println(a) // int 8인 타입인 c값 출력
fmt.Println(c)
}
출력 값 : 3456
-128

int16에서 int8로 변환을 했더니 3456에서 -128로 변했습니다. 이유는 2바이트 정수 int16에서 1바이트 정수 int8로 변환할 때 상위 1바이트가 없어지기 때문입니다.
'개발 > Golang' 카테고리의 다른 글
| 『Tucker의 Go 언어 프로그래밍』 스터디 요약 노트 : 8강 상수 (0) | 2021.05.23 |
|---|---|
| 『Tucker의 Go 언어 프로그래밍』 스터디 요약 노트 : 7강 함수 (0) | 2021.05.22 |
| 『Tucker의 Go 언어 프로그래밍』 스터디 요약 노트 : 6강 연산자 (2) (0) | 2021.05.21 |
| 『Tucker의 Go 언어 프로그래밍』 스터디 요약 노트 : 6강 연산자 (1) (0) | 2021.05.16 |
| 『Tucker의 Go 언어 프로그래밍』 스터디 요약 노트 : 5강 fmt 패키지를 이용한 텍스트 입출력 (0) | 2021.05.16 |