티스토리 뷰

Programming Language/Go

[Go] 기본 자료형

SdardewValley 2021. 11. 1. 22:00
반응형

Boolean

  • true / false 값을 가짐
  • 논리 연산자, 비교 연산자의 결과
  • short circuit 방식으로 동작
  • implicit conversion을 하지 않음

 

short circuit

첫 번째 연산의 결과만으로도 결과를 특정지을 수 없을 때, 두 번째 연산까지 실행하는 것

식1 && 식2 연산에서 식1이 false라면 식2를 실행하지 않는다. 마찬가지로 식1 || 식2 연산에서 식 1이 true라면 식2를 실행하지 않는다.

 

implicit conversion

다른 타입의 값을 boolean에 맞춰서 변환하는 것

Go에서는 숫자 0이나 nil을 false로 변환하지 않는다.

 

 

Number

  • 정수, 실수, 복소수가 있음
  • 숫자의 범위에 따라 메모리의 크기 선택이 가능
  • unsigned 사용 가능

 

 

정수

타입 크기
int8 1 byte
int16 2 byte
int32 4 byte
uint64 8 byte
int 32 비트 환경: int32
64 비트 환경: int64
uint8 1 byte
uint16 2 byte
uint32 4 byte
uint64 8 byte
uint 32 비트 환경: uint
64 비트 환경: uint64
byte uint8과 같음
rune int32와 같음
uintptr uint와 같음. 포인트에 사용.

 

💡 8진수와 16진수

8진수 앞에는 숫자 0을 붙이고, 16진수 앞에는 0x를 붙인다.
💡 문자 표기

Go는 정수 타입과 문자 타입을 구분하지 않는다. 따라서 문자는 byte 혹은 rune으로 문자를 표기한다.

 

실수

  • float32, float64를 사용하여 표현
  • 소수 표기법이나 지수 표기법으로 표현

 

 

복소수

  • complex64, complex128를 사용하여 표현
  • complex() 함수를 사용하여 표현하거나 리터럴 표기법으로 x + yi와 같은 표현으로 직접 변수에 할당하여  표현
  • 리터럴 표기법에서는 허수부에 접미사 i를 붙임
  • 실수부는 real() 함수로, 허수부는 imag() 함수로 값을 가져올 수 있음

 

 

연산

  • 숫자의 연산은 같은 타입끼리만 가능
  • 다른 타입끼리 연산을 해주기 위해서는 타입을 변환
  • 타입 변환은 타입(변환할 대상이나 값)으로 가능

type mismatch
에러 내역

 

💡 타입 변환 연산은 오류를 발생시키지 않지만, 값이 소실되어 원래의 값과 달라질 수 있다. 정수의 경우 2^0 자리의 비트부터 저장되는 것을 확인할 수 있다.

 

import (
	"fmt"
	"math"
)

func main() {
	fmt.Println(intToUint8(100))
	fmt.Println(intToUint8(1000))
}

func intToUint8(i int) (uint8, error) {
	// uint8로 변경할 수 있는지 확인
	if 0 <= i && i <= math.MaxUint8 {
    	// 변경할 수 있는 경우 변경한 값과 nil 리턴
		return uint8(i), nil
	}
    // 변경할 수 없는 경우 0과 에러내역 리턴
	return 0, fmt.Errorf("%d cannot convert to uint8 type", i)
}

실행결과

intToUint8은 int가 uint8로 변환할 수 있는 값인지 점검하고 uint8 형식으로 변환해 주는 함수이다.

 

Max- 값들은 위와 같이 정의되어 있다. command + B를 통해서 확인할 수 있다. 

💡 fmtError() 함수

파라미터에 받은 문자열로 error를 만들어 리턴

 

 

모든 숫자 타입에 적용 가능한 연산자

+x -x x++
x-- x += y x -= y
x *= y x /= y x + y
x - y x * y x / y

실수의 증감 연산
결과값

특이한 점은 실수에도 증감 연산자 적용이 가능하다.

 

 

가독성을 높이기 위한 증연산자의 특징

  • 전치 연산(++x 혹은 --x) 없고 후치 연산만 존재한다
  • 증감 연산자(x++ 혹은 x--)는 반환값이 없다

 

 

정수 타입에만 적용 가능한 연산자

^x x %= y x &= y
x |= y x ^= y x &^= y
x >>= y x <<= y x % y
x & y x | y x ^ y
x &^ y x << y x >> y

&^는 AND NOT 연산을 한 것이다. 이 결과값은 XOR과 동일한다.

 

 

String

  • 쌍따옴표(") 혹은 backtick(`)으로 생성한다
  • `로 생성을 하면 이스케이프 문자(\)나 줄 바꿈을 무시한다
  • backtick은 HTML, XML, 정규식에 유용하게 사용 가능하다

 

path1은 "를 path2는 `를 사용하여 문자열을 작성하였다
`은 이스케이프문자를 무시한다

 

 

escape character

\\ 역슬래시.
\' 작은 따옴표. 문자열 리터럴에서만 사용 가능.
\" 큰 따옴표. 문자열 리터럴에서만 사용 가능.
\a 콘솔의 벨.
\b 백 스페이스.
\f 쪽 바꿈.
\n 줄 바꿈.
\r 복구.
\t 탭.
\v 수직 탭.
\xhh 유니코드 문자. 8진수 코드 포인트를 2자리로 표현.
\ooo 유니코드 문자. 8진수 코드 포인트를 3자리로 표현.
\uhhhh 유니코드 문자. 16진수 코드 포인트를 4자리로 표현.
\Uhhhhhhhh 유니코드 문자. 16진수 코드 포인트를 8자리로 표현.

문자열 리터럴: 큰 따옴표 사이에 쌓인 문자열

 

문자

  • Go에는 문자 타입이 따로 없다
  • 정수 타입인 rune으로 문자를 표현할 수 있다

 

var c1 int = '\u0041'
var c2 int = '\uAC00'
var c3 int = '\U00101234'

fmt.Printf("%8d - %8d - %8d\n", c1, c2, c3) // 정수
fmt.Printf("%8c - %8c - %8c\n", c1, c2, c3) // 문자
fmt.Printf("%8X - %8X - %8X\n", c1, c2, c3) // UTF-8 바이트 수
fmt.Printf("%8U - %8U - %8U\n", c1, c2, c3) // UTF-8 코드값

실행결과

16진수로 표현할 때는 앞에 \x를, 8진수로 표현할 때는 앞에 \를 붙인다.

 

유니코드 코드 값으로 표현을 하기 위해서는 앞에 \u혹은 \U를 붙인다.

 

 

문자열의 문자에 접근

 

java에서는 charAt으로 문자열의 문자에 접근할 수 있다. Go에서는 문자열[인덱스] 형식으로 문자열의 문자에 접근할 수 있다.

 

문자열의 문자에 접근한 모습

문자 자체가 아닌 문자의 바이트값, 유니코드 값이 출력된다.

 

한글이 제대로 출력되지 못하는 모습

유니코드는 문자에 따라 바이트 수가 달라지기 때문에, 한글을 제대로 출력하지 못한다.

 

문자열을 []rune 타입으로 변환
한글이 제대로 출력된 모습

[]rune 타입으로 변환을 하면 제대로 출력되는 것을 확인할 수 있다.

 

문자열의 문자에 접근할 때는 for ... range 구문을 사용하면 편리하다.

 

 

문자열 변환

  • 유니코드 문자열은 []rune로 변환할 수 있다
  • 아스키코드 문자열은 []byte로 변환할 수 있다.

 

[]rune(문자열) 문자열을 []rune으로 변환
[]byte 문자열을 바이트 배열로 변환
string(문자배열) 문자 배열을 문자로 변환
string(문자의 코드값) 문자를 문자열로 변환 (65를 "A")로

 

문자열 길이

  • len(): 문자열의 바이트 수를 알 수 있다 ⇒ 다른 언어이면 문자수를 제대로 알 수 없다.
  • 문자열의 문자 수를 구하는 방법
    • utf8.RuneCountInString() 함수 사용
    • []rune 타입으로 변경한 뒤 배열의 길이 사용

 

부분 문자열

Go는 파이썬 처럼 슬라이스를 사용하여 문자열의 일부를 추출할 수 있다. 

string[n:m] 문자열 n번째부터 m-1번째 바이트까지 추출
string[n:] 문자열 n번째부터 마지막 바이트까지 추출
string[:m] 문자열 처음부터 m-1번째 바이트까지 추출

 

 

문자열과 비교 연산자

문자열에 비교 연산자를 사용하면 바이트 단위로 비교한다.

 

 

문자열 합치기

  • +=
    • 문자열의 값은 변경할 수 없기 때문에 합칠 때 마다 새로운 문자열이 생성된다
    • 비효율적
  • strings.Join() 함수나 bytesBuffer 타입을 사용
    • 빠르고 효율적이다

 

import (
	"bytes"
	"fmt"
	"math"
	"unicode"
	"strings"
)

func main() {
	var str string
	for i := 0; i < math.MaxUint8; i++ {
		if s, ok := nextString(i); ok {
			str += s
		}
	}
	fmt.Println(str)

	strArr := []string{}
	for i := 0; i < math.MaxUint8; i++ {
		if s, ok := nextString(i); ok {
			strArr = append(strArr, s)
		}
	}
	fmt.Println(strings.Join(strArr, ""))

	var buffer bytes.Buffer
	for i := 0; i < math.MaxUint8; i++ {
		if s, ok := nextString(i); ok {
			buffer.WriteString(s)
		}
	}
	fmt.Println(buffer.String())
}

func nextString(i int) (s string, ok bool) {
	if unicode.IsLetter(rune(i)) {
		return string(i), true
	}
	return "", false
}
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
글 보관함