룬과 바이트
Go 문자열 내부 구조 이해하기
룬과 바이트은(는) CoddyKit의 무료 Go Academy 강의입니다. 이것은 4개 중 1번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Go Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Go Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
Go 문자열이란 무엇인가요
Go에서 string은 변경할 수 없는 바이트 시퀀스입니다. 바이트에는 대개 UTF-8로 인코딩된 텍스트가 저장되지만, Go가 이를 강제하지는 않습니다.
- 문자열을 제자리에서 변경할 수 없습니다.
len은 문자가 아니라 바이트를 셉니다.
package main
import "fmt"
func main() {
s := "Go"
fmt.Println(s)
fmt.Println(len(s))
}내부적으로 사용되는 바이트
문자열에 s[i]로 인덱싱하면 하나의 바이트(byte 형식이며 uint8의 별칭)를 반환합니다.
일반 ASCII 텍스트에서는 각 문자가 정확히 1바이트입니다.
package main
import "fmt"
func main() {
s := "ABC"
fmt.Println(s[0])
fmt.Println(s[1])
fmt.Println(s[2])
}byte는 숫자입니다
바이트는 단순한 숫자이므로 s[0]을 출력하면 문자가 아니라 A의 ASCII 코드인 65가 표시됩니다.
문자를 확인하려면 바이트를 다시 문자열로 변환하십시오.
package main
import "fmt"
func main() {
s := "ABC"
fmt.Println(string(s[0]))
}rune이란 무엇인가요
rune은 int32의 별칭이며 하나의 유니코드 코드 포인트를 나타냅니다.
- UTF-8로 인코딩할 때 하나의 rune은 여러 바이트를 차지할 수 있습니다.
- 원시 바이트가 아니라 문자에 관심이 있다면 rune을 사용하십시오.
package main
import "fmt"
func main() {
var r rune = 'A'
fmt.Println(r)
fmt.Println(string(r))
}여러 바이트로 인코딩되는 문자
ASCII가 아닌 문자는 UTF-8에서 1바이트보다 많은 공간을 차지합니다. "héllo"와 같은 문자열은 글자 수보다 바이트 수가 많습니다.
len은 바이트 수를 보고하므로 화면에 보이는 길이보다 크게 나온다는 점에 주의하십시오.
package main
import "fmt"
func main() {
s := "héllo"
fmt.Println(len(s))
}문자열 순회하기
문자열을 대상으로 for range 반복문을 사용하면 UTF-8이 자동으로 디코딩됩니다. 각 반복에서 다음 값이 생성됩니다:
- rune이 시작되는 바이트 인덱스,
- 해당 rune 자체.
package main
import "fmt"
func main() {
for i, r := range "héllo" {
fmt.Println(i, string(r))
}
}문자를 올바르게 세기
바이트가 아니라 문자 수를 세려면 문자열을 []rune으로 변환한 다음 길이를 구하십시오.
그러면 코드 포인트 수를 얻을 수 있습니다.
package main
import "fmt"
func main() {
s := "héllo"
runes := []rune(s)
fmt.Println(len(runes))
}rune으로 인덱싱하기
[]rune을 사용하면 여러 바이트로 이루어진 텍스트에서도 안정적으로 N번째 문자를 가져오도록 인덱싱할 수 있습니다.
package main
import "fmt"
func main() {
runes := []rune("héllo")
fmt.Println(string(runes[1]))
}문자열과 바이트 간 변환
문자열과 []byte 사이를 자유롭게 변환할 수 있습니다.
[]byte(s)는 원시 바이트를 제공합니다.string(b)는 텍스트를 다시 구성합니다.
package main
import "fmt"
func main() {
b := []byte("Go")
fmt.Println(b)
fmt.Println(string(b))
}rune으로 문자열 만들기
rune 슬라이스도 같은 방식으로 문자열로 변환할 수 있습니다. 문자를 하나씩 수정한 후에 유용합니다.
package main
import "fmt"
func main() {
runes := []rune{'G', 'o', '!'}
fmt.Println(string(runes))
}바이트와 rune 요약
간단한 개념 모델은 다음과 같습니다:
byte= 하나의 원시 바이트(uint8),len(s)은 이를 셉니다.rune= 하나의 유니코드 코드 포인트(int32),range는 이를 생성합니다.- 문자를 세거나 인덱싱할 때는
[]rune을 사용하십시오.
package main
import "fmt"
func main() {
s := "café"
fmt.Println(len(s))
fmt.Println(len([]rune(s)))
}빠른 확인
rune과 바이트에 대한 이해도를 확인해 보십시오.
복습: rune과 바이트
Go 문자열은 대개 UTF-8로 인코딩된 변경할 수 없는 바이트 시퀀스라는 것을 배웠습니다.
byte는 원시 바이트이며len은 바이트를 셉니다.rune은 유니코드 코드 포인트이며range가 이를 디코딩합니다.- 적절한 수준에서 작업하려면
[]byte(s)와[]rune(s)으로 변환하십시오.
package main
import "fmt"
func main() {
s := "Go語"
fmt.Println("bytes:", len(s))
fmt.Println("runes:", len([]rune(s)))
}자주 묻는 질문
“룬과 바이트” 강의는 무료인가요?
네 — “룬과 바이트” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Go Academy 강의 전체를 잠금 해제할 수 있습니다. Go Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
“룬과 바이트”에서 뭘 배우나요?
Go 문자열 내부 구조 이해하기 브라우저에서 직접 실행하는 실습 코드로 Go Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
Go Academy을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 Go Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 1번째 강의입니다.
“룬과 바이트” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 Go Academy 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 Go Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.