본문 바로가기
Golang/Study

chapter3(2) primitive type - boolean and int

by 윤원용 2022. 1. 23.

Go는 정적인 자료형을 사용하는 언어라 한다. 정적 자료형은 컴파일 시점에 자료형이 결정되는 것이고 동적 자료형은 코드가 실행될 때 자료형이 결정되는 것이다. 

자신이 사용하는 프로그래밍 언어를 두 가지 기준으로 생각하면 되는데 코드를 실행하는 방법이 컴파일(compile)인지 인터프리터(interpreter)인지 구분만 할 수 있으면 정적인지 동적인지 쉽게 알 수 있을 것이다. 그리고 Go는 meth모듈에서 자료형의 MaxValue와 MinValue를 사용할 수 있다.

math모듈의 상수

 

    • boolean( true / flase )
      boolean type은 명시적으로 변수 선언 시 bool이라는 예약어를 사용하고 묵시적으로도 변수를 선언할 수 있다.
      묵시적으로 변수를 선언 시 무조건 변수의 값을 초기화시켜야 하기 때문에 기본값을 지정해줘야 하는데 명시적으로 변수 선언 시 값을 초기화 안 해도 false로 값이 초기화된다.  
      booelan type variable
    • 부호 있는 정수(signed int)
      java와 달리 go는 int [8, 16, 32, 64]이런 식으로 자료형의 크기를 나타낸다. 부호가 있는 정수 타입은 bit의 왼쪽에서 첫 번째 bit(msb [most significant bit])는 음수, 양수를 표현하기 때문에 1이면 음수, 0이면 양수를 표현한다.
      int keyword
    • 부호 없는 정수(unsigned int)
      부호가 없으니 음수를 표현 못 하지만 부호 있는 정수와 같은 bit지만 더 큰 값을 사용할 수 있다. go에도 java와 같이 byte예약어가 있는데 go에선 부호 없는 정수인 uint8의 다른 이름으로 정의됐다고 한다. go의 byte는 java의 char와 같다. 
      unsigned int keyword
      부호 있는 정수와 부호 없는 정수의 최대 표현할 수 있는 값이 다른데 그 이유는 msb 자리에 부호가 아닌 2의 제곱으로 표현할 수 있어서 이다.
    • 환경(운영체제?)에 의존하는 정수 자료형
      이건 잘 모르겠지만 go로 코딩하면서 int64 int로 묵시적 형 변환을 안 해줘서 짜증 낫던 부분이 있었는데 int int64보다 표현할 수 있는 bit가 작아서 묵시적 형 변환을 안 해줬나? 하고 대충 이해했는데 책을 읽고 이유를 알았다. go언어는 이상하게 int~몇 unint~몇 이렇게 정수를 선언해야 하는데 int unint은 별도로 존재하는 부분이 이해가 안 됐다. 간단하게 설명하자면 64bit 운영체제에서는 int64 uint64를 사용할 수 있는데 32bit 운영체제에선 사용할 수 없기 때문에 int uint 예약어를 지원해서 각각의 운영체제에 맞게 최대 사용할 수 있는 정수를 사용할 수 있도록 지원한다는 것이다. go는 pointer를 지원하는 언어이기 때문에 uintptr 예약어도 있는데 CPU나 OS에 따라 포인터가 사용하는 메모리 주소의 크기가 다르기 때문에 지원한다 하고 "특수한 형태로 포인터 값을 그대로 저장하는 데 충분한 크기의 부호 없는 정수라고 정의"라고 책에 나와있다.
    • 정수 데이터 표현
      Go나 java나 정수를 표현할 때 8, 10, 16진수를 사용할 수 있다. 숫자 0으로 시작하면 8진수 0x로 시작하면 16진수 그 외 10진수이다. 예를 들어 10진수의 158진수의 017이고 16진수는 0xF이다. 16진수를 표현할 때 a부터 f까지 대소문자 상관없이 입력이 가능하다. 
      8, 10, 16진수로 10진수 15를 표현
    • 자료형 변환(casting)
      Go는 java와 달리 묵시적 형 변환을 해주지 않는다. 
      위 사진처럼 Go는 명시적 자료형 변환을 해야 하기 때문에 답답할 수도 있지만 그건 충분히 해결할 수 있는 문제이다. Go는 묵시적 선언을 통해 컴파일 시점에서 타입 추론으로 인해 타입이 정해지기 때문이고 정수형의 기본 타입은 int이기 때문에 운영체제에 따라 최대 표현할 수 있는 정수까지 사용할 수 있다. 굳이 자료형 변환을 할 필요가 없다는 뜻이다. 만약 메모리를 무조건 적게 만들어야 하고 입력값이 정해져 있다면 해야겠지만 ㅎㅎ;;;

오늘은 여기까지 하고 다음 시간에는 unsigned int와 정수 자료형 변환에 의한 문제와 랩어라운드(wrap around)를 포스트 하겠다.

 

'Golang > Study' 카테고리의 다른 글

chapter3(4) primitive type - wrap around  (0) 2022.01.30
chapter3(3) primitive type - uint and casting and overflow  (0) 2022.01.24
chapter3(1) variable  (0) 2022.01.19
chapter2(3) go test  (0) 2022.01.18
chapter2(2)  (0) 2022.01.18