Golang 기초 (3) : 변수와 자료형에 대하여

vamos_eon·2021년 11월 25일
0

Golang 기초 

목록 보기
3/14
post-thumbnail

안녕하세요, 주니어 개발자 Eon입니다.

이번 포스트는 Golang 변수와 자료형에 대한 내용입니다.
순서는 아래와 같이 진행됩니다.

  1. Golang은 강타입 언어이다.
    • 약타입 언어란
    • 강타입 언어란
  2. Golang의 변수
    • 자료형의 종류와 그 범위
      • rune의 사용처
      • int와 uint에 대하여
      • true와 false에 대하여
    • 변수의 초기 값
      • 변수의 선언
    • 변수의 형변환

Golang은 강타입 언어이다.

Golang은 강타입 중에도 강타입 언어입니다.
약타입이냐, 강타입이냐에 따라 연산을 할 수 있는 방법이 확장될 수도, 제한이 될 수도 있습니다.
먼저 약타입부터 보겠습니다.

약타입 언어란

프로그래밍 언어에는 타입이 존재합니다.
그 타입에 따라 표현할 수 있는 값의 종류나 범위가 달라집니다.
약타입 언어는 정수와 실수 간의 계산을 허용하기도 합니다.
기초 교육 과정의 수학처럼 말입니다.
1 + 0.5 = 1.5 라는 것을 우리는 알고 있습니다.
약타입 언어는 위와 같이 정수와 실수 간의 연산을 허용하기도 합니다.
연산에 있어, 타입이 절대적이지 않게 됩니다.
또한, "1" + 1 = 2가 언어에 따라 2가 아닌 "11"이나 "2"의 결과가 되기도 합니다.
이러한 허용을 하게 되면, 해당 언어의 타입에 따른 연산 결과를 정확하게 예측하지 않으면 실수로 이어지고, 이는 곧 에러나 버그로 이어질 수 있습니다.
물론 이를 자유자재로 사용한다면 쓰기 편하다는 장점은 확실합니다.
하지만 높은 자유도가 오히려 독이 될 수도 있다는 것입니다.

강타입 언어란

강타입 언어는 위의 약타입 언어와는 확연히 다르게, 타입이 다른 변수 간의 연산을 허용하지 않습니다.
물론 강타입 언어 중에서도 숫자에 한해서는 연산을 허용하기도 합니다.
정수 + 실수 연산을 허용하는 c언어처럼 말입니다.
강타입 언어의 장점은 타입을 정확하게 인지하고 사용한다는 점입니다.
사용자의 실수로 서로 다른 타입 간의 연산을 하더라도 컴파일 과정을 거치며 에러를 발생시키기 때문에 의도치 않은 변수 간의 연산으로 애를 먹지 않아도 됩니다.
단점으로는 타입에 병적으로 매달려야 한다는 점입니다.
Golang은 강타입 중에도 강타입 언어라고 말씀드렸습니다.
Golang은 서로 다른 타입 간의 연산을 일절 허용하지 않습니다.
따라서, 사용자가 서로 다른 타입 간의 연산을 하기 위해서는 정확하게 인지한 상태로 형변환을 거쳐 연산을 진행합니다.
불편할 수도 있으나, 타입의 확실한 지정으로 에러 발생을 줄일 수 있다는 장점이 있습니다.


Golang의 변수

저번 포스트에서 Golang으로 Hello World!!를 출력했습니다.
출력하며 기본 틀에 대해서 설명을 같이 작성했습니다.
기본이 되는 틀을 알았으니 본격적으로 프로그래밍을 하기에 앞서, 변수 제어를 위해 변수와 자료형에 대해 알아보도록 합니다.

자료형의 종류와 그 범위

Golang의 기본 타입은 아래와 같습니다.
(signed = 부호가 있는)
(unsigned = 부호가 없는)
(alias type = 별칭 타입; 별명 타입)

TypeSizeRange or Value
bool1true, false
int8signed, 8 bit-128 ~ 127
int16signed, 16 bit-32768 ~ 32767
int32signed, 32 bit-2147483648 ~ 2147483647
int64signed, 64 bit-9223372036854775808 ~ 9223372036854775807
uint8unsigned, 8 bit0 ~ 255
uint16unsigned, 16 bit0 ~ 65535
uint32unsigned, 32 bit0 ~ 4294967295
uint64unsigned, 64 bit0 ~ 18446744073709551615
float32signed, 32 bit
float64signed, 64 bit
intsigned, either 32 or 64 bitscheck int32 and int64
uintunsigned, either 32 or 64 bitscheck uint32 and uint64
uintptrunsigned, same as uintthe bit pattern of any pointer
bytealias type of uint8; unsigned, same as uint80 ~ 255
runealias type of int32; signed, same as int32-2147483648 ~ 2147483647
stringstring is the set of all strings of 8 bit bytesmay be empty, but not nil; e.g: "hello" or "" ...
complex64float 32 bit for real number and another float 32 bit for imaginary numbere.g.: 3 + 5i
complex128float 64 bit for real number and another float 64 bit for imaginary numbere.g.: 3 + 5i

float가 보장하는 소수점

아래의 이미지는 float32에 대한 설명입니다.
float32는 소수점 이하 7자리까지 보장됩니다.
float64는 소수점 이하 15자리까지 보장됩니다.

rune의 사용처

int32의 alias type인 rune은 utf-8의 문자를 표현할 수 있습니다.
물론 int32로도 utf-8 문자 표현이 가능합니다.

var runeInitialized rune = '💕'
fmt.Printf("%c\n", runeInitialized)
// 💕

int와 uint에 대하여

위의 표를 보시면 int와 uint는 32 bit 자료형이 될 수도, 64 bit 자료형이 될 수도 있다고 쓰여있습니다.
C언어를 예로 들자면 int는 항상 4 byte의 크기를 가집니다.
즉, 32 bit의 크기를 가집니다.
C언어는 실행되는 OS의 레지스터가 32 bit인지 64 bit인지를 따지지 않고 int에 32 bit를 할당합니다.
Golang은 OS의 레지스터에 따라 int의 사이즈가 달라집니다.
32 bit OS에서는 int == int32
64 bit OS에서는 int == int64
uint 또한 마찬가지입니다.
32 bit와 64 bit는 표현할 수 있는 값의 범위차가 상당히 큽니다.
그래서 항상 OS의 환경이 다를 수 있음을 염두에 두고 프로그래밍을 해야 합니다.
alias 타입과 int, uint는 사용에 유의해야 합니다.

true와 false에 대하여

C언어에서 stdbool.h 표준 라이브러리를 사용하면 bool type의 value인 true, false를 사용할 수 있습니다.
C언어에서 true는 1, false는 0의 값을 가집니다.

Golang에서는 이 두 가지의 참과 거짓을 나타내는 true, false의 값이 각각 1과 0의 값을 가지지 않습니다.
Golang에서 true와 false는 boolean value일 뿐입니다.

if true == 1 {
	fmt.Println("value of true is 1")
} // error would be occurred

변수의 초기 값

모든 변수는 선언과 동시에 기본 값으로 초기화됩니다.
선언하면서 변수에 값을 대입할 수도 있지만 값을 주지 않으면 default 값을 가집니다.
아래는 각 자료형에 대한 초기 값에 대한 표입니다.

Typedefault value
boolfalse
All numeric types0
complex type(0+0i)
uintptr0
bytealias type of uint8; 0
runealias type of int32; 0
string""

변수의 선언

변수가 어떤 값을 가지게 하고 싶다면 먼저 변수를 선언해야 합니다.
변수의 선언 방법은 아래와 같습니다.

var 변수명 타입명 (= 값, optional) (변수 선언하며 초기화)

var nameOfVariable variableType = value 

타입을 지정하며 선언 후 초기화한다.

var nameOfVariable variableType // let value of nameOfVariable as it's default value 
nameOfVariable = value

타입을 지정없이 선언하며 초기화 : 값에 따라 타입이 자동으로 설정된다. (단, default 값에 유의해야 함. 의도치 않은 결과가 나올 수 있음.)

nameOfVariable := value

var 변수명 타입명 (= 값, optional) (여러 개의 변수 동시 선언 및 초기화)

var c, python, java = true, false, "no!"

변수의 형변환

변수의 형변환은 심심치 않게 필요한 경우들이 생깁니다.
가령 개발을 하다가 A에서 B로 데이터의 이동이 필요한데, B에서는 string 타입이 필요한데 A에서는 해당 데이터를 int 형태로 가공해서 사용한 케이스가 있을 수 있습니다.
그렇게 되면 A에서 string으로 변환해서 B에 전달을 하거나, A가 int 형태로 B에 전달해서 B가 string으로 가공해서 사용하는 방법이 있습니다.
둘 중 어느 케이스든 형변환은 무조건적으로 필요하게 됩니다.

Golang에서의 형변환은 아래와 같은 방법으로 이루어집니다.

TypeThatWannaBe(ValueThatWillBeConverted)
// e.g.: 
var ValueThatWillBeConverted int8
var TypeUint64Variable uint64
... // now ValueThatWillBeConverted has value..
TypeUint64Variable = uint64(ValueThatWillBeConverted)

Numeric Type <---> string 은 strconv 패키지를 import하여 수행할 수 있다.
Golang strconv docs


이번 포스트에서는 Golang의 변수와 자료형에 대한 내용이었습니다.
프로그램을 제어하기 위해서는 변수의 활용이 필수적입니다.
최대한 자세하게 다룬다고 다룬 것인데 충분할지는 모르겠습니다.
기회가 된다면 나중에 보충하거나 새로 다시 포스팅하도록 하겠습니다.
감사합니다.👍

profile
주니어 개발자

0개의 댓글