티스토리 뷰
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() 함수로 값을 가져올 수 있음
연산
- 숫자의 연산은 같은 타입끼리만 가능
- 다른 타입끼리 연산을 해주기 위해서는 타입을 변환
- 타입 변환은 타입(변환할 대상이나 값)으로 가능
💡 타입 변환 연산은 오류를 발생시키지 않지만, 값이 소실되어 원래의 값과 달라질 수 있다. 정수의 경우 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 형식으로 변환해 주는 함수이다.
💡 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, 정규식에 유용하게 사용 가능하다
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 타입으로 변환을 하면 제대로 출력되는 것을 확인할 수 있다.
문자열의 문자에 접근할 때는 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
- 확장 함수
- hashcode
- postman tests
- graphql
- python3
- mysql
- go 특징
- 주생성자
- 네이버 2022 공채
- Python
- Basic Type
- java
- squash merge
- downTo
- git
- pm.test
- solidity
- pm.expect
- 코틀린
- 2차 인터뷰
- postman
- github
- Squash and merge
- DGS Framework
- Kotlin In Action
- 코딩테스트
- string
- postman collection
- 1차 인터뷰
- Kotlin
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |