일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- mongoDB
- 스프링
- 개발자
- 그리디알고리즘
- 클린코드
- spring boot
- 백준
- Elasticsearch
- 애자일프로그래밍
- 프레임워크
- 자바
- 알고리즘
- 코딩
- 코딩테스트
- database
- Baekjoon
- 엘라스틱서치
- 데이터베이스
- 애자일기법
- 그리디
- Java
- 코드
- API
- cleancode
- Spring
- 읽기쉬운코드
- 개발
- JPA
- framework
- ES
- Today
- Total
튼튼발자 개발 성장기🏋️
[Go] 데이터 타입 본문
1. 불
불(Boolean) 타입은 true 또는 false의 두 값만을 가질 수 있는 데이터 타입이다. 주로 조건문, 반복문 등에서 사용된다.
var isTrue bool = true
var isFalse bool = false
if isTrue {
fmt.Println("True condition!")
} else {
fmt.Println("False condition!")
}
2. 숫자
Go 언어는 여러 가지 숫자 타입을 제공한다. 숫자 타입은 크게 정수와 실수로 구분된다.
2-1. 정수
정수 타입은 부호가 있는 int, 부호가 없는 uint와 관련된 타입들이 있다. 정수 타입은 기본적으로 int와 uint로 선언할 수 있다. Go에서는 int8, int16, int32, int64와 같은 다양한 크기를 지정할 수 있다.
var a int = 42 // 기본 정수 타입
var b uint = 42 // 부호 없는 정수 타입
var c int32 = -100000 // 32비트 정수
var d int64 = 12345678901234 // 64비트 정수
2-2. 실수
실수는 부동소수점 숫자를 표현하는데 사용된다. float32와 float64 두 가지 타입이 있으며, float64는 더 높은 정확도를 제공한다.
var pi float32 = 3.14
var e float64 = 2.718281828459
2-3. 복소수
Go에서는 복소수를 complex64, complex128 타입으로 표현한다. 복소수는 실수부와 허수부를 갖는 수다.
var z1 complex64 = 1 + 2i
var z2 complex128 = 3 + 4i
2-4. 숫자 연산
Go에서는 기본적인 산술 연산을 제공하며, 숫자 타입에 따라 연산을 할 수 있다.
var x, y int = 10, 5
fmt.Println(x + y) // 덧셈
fmt.Println(x - y) // 뺄셈
fmt.Println(x * y) // 곱셈
fmt.Println(x / y) // 나눗셈
fmt.Println(x % y) // 나머지
3. 문자열
문자열은 여러 문자가 모여 이루어진 데이터 타입으로, string 타입으로 선언한다. Go에서는 문자열과 문자를 구분해서 사용한다.
3-1. 문자열과 문자
문자는 하나의 문자를 의미하며, Go에서는 rune 타입으로 나타낸다. rune은 유니코드 문자를 나타내기 위한 32비트 타입이다. 반면, 문자열은 여러 문자가 결합된 타입이다.
Go에서는 문자열의 길이를 구하거나, 특정 위치의 문자를 추출할 수 있다. 하지만 문자열은 불변(immutable) 타입이기 때문에 변경할 수 없다.
var str string = "Hello, World!"
var char rune = 'H' // 한 문자
var str = "Hello"
fmt.Println(len(str)) // 문자열 길이 출력
fmt.Println(str[0]) // 첫 번째 문자 출력 (ASCII 값)
fmt.Println(str[:3]) // 부분 문자열 추출
아래 표는 문자열과 문자에서 사용되는 이스케이프에 대한 설명이다.
이스케이프 시퀀스 | 설명 |
\\ | 백슬래시 문자 자체 |
\" | 큰따옴표 문자 |
\' | 작은따옴표 문자 |
\n | 새 줄 (Line Feed) |
\t | 탭 (Tab) |
\r | 캐리지 리턴 (Carriage Return) |
\b | 백스페이스 (Backspace) |
\f | 폼 피드 (Form Feed) |
\v | 수직 탭 (Vertical Tab) |
\uXXXX | 유니코드 문자 (16비트 형식) |
\UXXXXXXXX | 유니코드 문자 (32비트 형식) |
문자열 연산을 하거나 로깅하는 등 문자열을 가지고 자주 사용하는 함수를 알아보자.
함수 | 설명 |
len() | 문자열의 길이를 반환 |
==, != | 두 문자열을 비교하여 같거나 다른지 확인 |
strings.Contains() | 문자열에 특정 부분 문자열이 포함되어 있는지 확인 |
strings.ToUpper() | 문자열을 모두 대문자로 변환 |
strings.ToLower() | 문자열을 모두 소문자로 변환 |
strings.Split() | 구분자를 기준으로 문자열을 분리하여 슬라이스 반환 |
strings.Trim() | 문자열의 앞뒤에서 특정 문자를 제거 |
strings.Replace() | 문자열 내의 특정 부분을 다른 문자열로 대체 |
strings.Index() | 문자열 내에서 첫 번째로 나타나는 부분 문자열의 인덱스를 반환 |
strings.Join() | 슬라이스의 문자열들을 결합하여 하나의 문자열로 만듬 |
strings.TrimSpace() | 문자열 양쪽의 공백을 제거 |
strings.HasPrefix() | 문자열이 특정 접두어로 시작하는지 확인 |
strings.HasSuffix() | 문자열이 특정 접미어로 끝나는지 확인 |
strings.Repeat() | 문자열을 지정된 횟수만큼 반복 |
strings.ToTitle() | 문자열 내 각 단어의 첫 문자를 대문자로 변환 |
unicode 패키지에는 문자를 확인할 수 있는 여러 함수가 있다.
함수 | 설명 |
unicode.Is() | 특정 문자가 주어진 유니코드 속성에 해당하는지 확인 |
unicode.IsLetter() | 문자가 알파벳 문자(대소문자)인지 확인 |
unicode.IsDigit() | 문자가 숫자(0-9)인지 확인 |
unicode.IsSpace() | 문자가 공백 문자(공백, 탭, 새 줄 등)인지 확인 |
unicode.IsPunct() | 문자가 구두점(구분자, 특수 기호 등)인지 확인 |
unicode.IsSymbol() | 문자가 기호(기타 기호)인지 확인 |
unicode.IsUpper() | 문자가 대문자인지 확인 |
unicode.IsLower() | 문자가 소문자인지 확인 |
unicode.IsTitle() | 문자가 타이틀 케이스(각 단어의 첫 글자가 대문자)인지 확인 |
unicode.IsControl() | 문자가 제어 문자(예: 새 줄, 탭 등)인지 확인 |
unicode.IsMark() | 문자가 발음 기호(예: 악센트, 다이어크리틱 문자 등)인지 확인 |
unicode.IsNumber() | 문자가 숫자(유니코드 숫자 포함)인지 확인 |
unicode.IsPrintable() | 문자가 출력 가능한 문자(공백 제외)인지 확인 |
unicode.IsGraphic() | 문자가 그래픽 문자인지 확인 (공백 제외) |
4. 배열과 슬라이스
Go에서 배열은 고정 크기 리스트로 선언되며, 슬라이스는 동적 크기를 가지는 배열처럼 동작한다.
구분 | 배열 | 슬라이스 |
크기 | 고정 크기 (배열의 크기는 컴파일 타임에 정해짐) | 가변 크기 (동적으로 크기가 변할 수 있음) |
길이 | 배열을 선언할 때 길이가 정해짐 | 길이가 동적으로 조정됨 |
메모리 할당 | 선언 시 크기만큼 메모리가 할당됨 | 배열을 참조하는 슬라이스가 메모리를 공유 |
초기화 | 크기가 고정된 배열로 초기화됨 | 슬라이스는 배열을 참조하여 초기화됨 |
참조 타입 | 값 타입 (배열을 다른 변수에 할당하면 복사됨) | 참조 타입 (슬라이스를 다른 변수에 할당하면 참조가 공유됨) |
크기 변경 | 배열 크기는 변경 불가 | 슬라이스 크기는 append로 동적으로 변경 가능 |
용도 | 크기가 고정된 데이터를 처리할 때 유용 | 동적으로 크기를 변화시키는 데이터에 유용 |
4-1. 생성과 초기화
배열은 고정된 크기를 가지며, 슬라이스는 동적으로 크기가 변할 수 있다.
var arr [5]int = [5]int{1, 2, 3, 4, 5} // 배열 선언
var slice []int = []int{1, 2, 3, 4, 5} // 슬라이스 선언
4-2. 내부 요소에 순차적으로 접근
배열과 슬라이스는 for 문을 통해 각 요소에 접근할 수 있다.
for i, v := range arr {
fmt.Println(i, v)
}
4-3. 부분 슬라이스 추출
슬라이스는 부분적으로 추출하여 새로운 슬라이스를 만들 수 있다.
subSlice := slice[1:4] // slice[1]부터 slice[3]까지 추출
fmt.Println(subSlice)
4-4. 슬라이스 변경
슬라이스는 요소를 변경할 수 있으며, 크기를 동적으로 늘릴 수도 있다.
slice[2] = 100 // 세 번째 요소를 100으로 변경
fmt.Println(slice)
Go의 기본 라이브러리 sort 패키지에는 슬라이스 정렬과 관련된 다양한 함수가 있다.
함수 | 설명 |
sort.Ints() | int 타입 슬라이스를 오름차순으로 정렬 |
sort.Sort() | Interface 타입 슬라이스를 정렬 (사용자가 정의한 정렬 기준을 사용) |
sort.Strings() | string 타입 슬라이스를 오름차순으로 정렬 |
sort.Float64s() | float64 타입 슬라이스를 오름차순으로 정렬 |
sort.Reverse() | 슬라이스의 순서를 반대로 정렬 (내림차순 정렬을 위한 함수) |
sort.IsSorted() | 슬라이스가 정렬된 상태인지 확인 |
5. 맵
맵은 키-값 쌍으로 데이터를 저장하는 자료구조다. Go에서 맵은 map 키워드를 사용하여 생성한다.
5-1. 생성과 초기화
맵은 make 함수로 생성할 수 있다.
var m map[string]int = make(map[string]int)
m["apple"] = 5
m["banana"] = 10
5-2. 값 찾기
맵에서 특정 키의 값을 찾을 수 있다. 값이 존재하지 않으면 두 번째 값은 false를 반환한다.
val, ok := m["apple"]
if ok {
fmt.Println(val) // apple의 값 출력
} else {
fmt.Println("Not found!")
}
5-3. 요소 추가, 수정, 삭제
맵에 요소를 추가하거나 수정할 수 있고, delete 함수로 요소를 삭제할 수 있다.
m["grape"] = 20 // 요소 추가
m["apple"] = 15 // 요소 수정
delete(m, "banana") // 요소 삭제
6. 포인터와 참조 타입
Go에서 포인터는 다른 변수의 메모리 주소를 저장하는 데 사용된다. 이는 값 전달 방식인 값에 의한 전달(pass by value)을 변경하고, 메모리 절약 및 효율적인 작업을 가능하게한다.
6-1. 포인터 생성과 초기화
포인터는 & 연산자를 사용해 변수의 메모리 주소를 참조할 수 있다.
var x int = 58
var ptr *int = &x // x의 메모리 주소를 ptr에 저장
fmt.Println(*ptr) // 포인터를 통해 값에 접근
6-2. 값 전달
Go에서는 기본적으로 값에 의한 전달 방식이지만, 포인터를 사용하여 값 자체가 아닌 메모리 주소를 전달할 수 있다. 이를 통해 함수 내에서 원본 데이터를 수정할 수 있다.
func increment(a *int) {
*a++
}
var n int = 5
increment(&n) // n의 메모리 주소를 전달
fmt.Println(n) // n의 값이 6으로 변경됨
'프로그래밍 > GoLang' 카테고리의 다른 글
[Go] 기본 문법 (1) | 2024.12.28 |
---|