프로그래밍언어/Go

변수 / Tucker님의 Go 언어 프로그래밍 #4

구구절절2 2021. 5. 7. 18:15
반응형

 

 

 

 

본글은 『Tucker의 Go 언어 프로그래밍』 스터디 요약 노트입니다.

 

변수


 

프로그램이란 데이터를 연산/조작하는 일이다.

비디오,소리,글자는 모두 데이터라고 할 수 있는데 컴퓨터에게는 숫자에 불가하다. 그 숫자들을 저장하는 것이 메모리이다.

 

💡
데이터에 접근하려면 어떻게 해야할까?

 

메모리에는 각각 메모리 주소가 존재한다. 컴퓨터는 메모리 주소를 이용해 데이터에 접근할 수 있다.

 
메모리주소는 0X00A3FC00 이런식으로 우리가 인지하기 어려운 16진수로 되어있다.

따라서 사람이 코드로서 편하게 메모리에 접근하기위해서는 변수가 필요하다.

 

 

변수의 4가지 속성


 

var a int = 10 

다음의 코드로 변수의 속성을 살펴보자면

 

이름 : var a int  = 10 (변수가 a라는 이름을 가진다.)

 

 : a의 메모리 공간에 10이라는 값을 가진다.

 

주소 : 성북구 ... 뭐 뭐뭐  실생활에선 이렇게 주소를 쓰는데 컴퓨터도 변수가 가리키는 곳의 위치가 어딘지 주소를 가진다.

 

타입 : 어떤 형태의 변수인가? 문자타입 숫자타입 등등이 있다. 각타입은 그 크기가 정해져 있다.

 변수의 크기를 알 수 있게된다.

 

 

타입


 

숫자는 정수와 실수로 나뉜다.

 

unsigned int = 부호없는 정수다. (양수) = uint

integer = int = 부호있는 정수다.

float 은 실수다.

 

👌별칭들

byte = uint8 의 별칭이다.

 

rune = 문자 한개 (C언어의 char와 비슷한듯) int32의 별칭이다.

문자 인코드 방식은 UTF-8이고 UTF-8의 문자 한개 길이가 1~ 3byte 이상이다. 1~3byte를 담으려면 3byte이상은 되어야하는데 컴퓨터는 2의 배수로 증가하는 것을 선호한다. 그래서 4byte가 되었다.

 

int : 32비트 컴퓨터면 int32 와 같고 64비트 컴퓨터는 int64이다.

uint : 마찬가지다

 

새로운 타입 만들 수 있다. type myInt int 이렇게 만들 수 있다.

 

 

그 외 타입

 

 

변수 선언법


 

var a int = 10   //data 값의 타입과 같아진다. 지금 같은 경우는 int 가 된다.   

var a int   

var a = 10   

a:=10

 

a:= 10 (많이 사용함)은 var a = 10 과 동일한데 var를 축약한 코드다.

 

 

타입별 기본값


 

complex 복소수다. 허수 진수로이루어지면 허수와 진수는 각각 float타입이다

 

타입 변환


 

고는 최강 타입 언어이다.

연산의 각항목의 타입은 반드시 같아야한다.

 

var a int = 10  
var b int = 20 a+b 가능  

var b float64 = 20  a+b 불가   

var a int =10 
var b int16 = 20  a+b 불가  

 

타입을 다르게 계산하려고 하면 go언어 자체에서 경고를 준다.

 

 

 

따라서 서로다른 타입끼리 계산을 하기 위해서는 타입 변환을 해주어야한다.

다음은 타입변환 예제이다.

 

package main 

import "fmt" 

func main()  { 	
		a := 3   //a는 int타입 변수 설정  	
        var b float64 = 3.5   	
        
        var c int = int(b)  // 3.5 -> 3 로 변한다.  	
        d := float64(a)*b  //d = 3*3.5  	
        
        var e int64 = 7 	 	
        f:= a*int(e)  //int 와 int64 도 연산불가 그냥 타입 다르면 다 안됨   	
        
        fmt.Println(a,b,c,d,e,f) 
        
        }

 

 

 

 

 

값의 범위에 따라 변수를 담을 수 있는 그릇의 크기를 알 수 있다.

 

65535까지는 외워둘만하다고 하셨다.

 

타입 변환 주의 사항


 

 

큰타입에서 작은타입으로 변할 때 데이터가 달라질 수 있다.

tucker님은 비유를 통해서 설명하는데 큰그릇에 있던 내용물이 작은 그릇으로 이동하면

내용물이 넘쳐흐르는 것과 같은 원리이다.

 

예제를 살펴보자

 

package main

import "fmt"

func main()  {

	var a int16 = 3456 // a is int16type -2byte integer 
	var b int8 = int8(a) //int16  -> int8
    
	//int8의 범위는 -128 ~ 127이고  	
    // 3456이 127까지밖에 못담는 int8로 바뀌면서 숫자가 버려짐  	

	fmt.Println(a,b) // 출력값 : 3456 -128 
	
}

 

2진수의 숫자표현


 

 

 

 

 

실수는 부호비트 , 지수부(8비트) , 소수부 (23비트)로 이루어진다.

 

ex)

4.266663e+06 이런 식으로 출력이 된다. 소수부 * 지수부

 

 

소수부가 자리가 23비트로 정해져있기때문에

만약 12345678이 소수부라고 한다면 소수부가 표현할 수 있는 수는 7자리가 한계이니

12345678중 8이 잘린형태로 출력이된다.

 

예제)

package main

import "fmt"

func main()  {
	var a float32 = 1234.523
	var b float32 = 3456.123
	var c float32 = a*b //실제계산값 4,266,663.334329
	var d float32 = c*3 //실제계산값 12,799,990.002987

	fmt.Println(a)
	fmt.Println(b)
	fmt.Println(c)
	fmt.Println(d)
	//c 의 실제값과 d의 실제값은 다르다.  float32는 7개의 숫자만 표현해주기 때문이다. 
	
	go언어 출력값 
	//1234.523
	//3456.123
	//4.266663e+06
	//1.2799989e+07
}

 

전역변수


 

중괄호에 포함 안된 변수들을 패키지 전역변수라고 한다.

 

package main

import "fmt"

var g int = 10  //패키지 전역변수 

func main()  {
	var m int = 20 

	{
		var s int = 50 
		fmt.Println(m,s,g)
	} //중괄호를 벗어나면 s를 인식하지 못한다. 컴퓨터 메모리에서 없어지는 것! 

	m = s+20
	//변수는 그 변수가 속한 중괄호에서만 살아있다. 이 코드에서는 s가 포함된 중괄호를 벗어났으니 
	//오류로 인식
	
}
 

Notion2Tistory

 

boltlessengineer.github.io

반응형