본문 바로가기
Golang/Study

chapter3(6) primitive type - rune and string

by 윤원용 2022. 2. 1.

rune

Go에는 특이한 자료형이 있다. rune이라는 자료형인데 책에는 문자를 표현하는 자료형이라고 소개하면서 정확하게는 유니코드(unicode)의 코드 포인트를 나타내는 "특수한 정수 자료형"이다.라고 쓰여 있다. 그래서 rune은 int32의 별명으로 정의돼 있어 음수도 표현할 수 있다. byte type처럼 rune type 또한 숫자를 저장하든 문자를 저장하든 타입은 int32이다. 그렇다고 int32와 rune 타입이 다른 부분이 있냐? 물으면 없다...

너무하네...

심지어 함수의 시그니쳐에서 rune이라 명시됐어도 int32를 받아준다....

실..화!?

그냥 rune type은 개발자가 이해하기 편하게 가독성 측면으로 만들어 놓은 것 같다. rune type의 값으로 작은따옴표('A')에 문자 한 개를 넣어 사용할 수도 있지만 역슬래시(\)를 접두사로 값을 시작하면 유니코드 문자가 아닌 코드로도 표현할 수 있다. 영어 대문자 A를 출력하려면 8진수 \101, 10진수 65, 16진수 \x41, 작은 유니코드 포인트 \u0041, 큰 유니코드 포인트 \U00000041과 같이 출력할 수 있고 \n, \t와 같은 이스케이프 문자도 지원한다.

 

rune 타입의 변수에 'A'로 초기화한 후 출력해보면

rune type print

????? A가 아닌 65가 출력된다. rune 타입은 int32의 별명이라 생각하면 당연한 것 같지만 달리 이야기하면 문자를 출력하기 위해서는 귀찮게 다른 방법을 사용해야 한다는 소리와 같다. 정수 65가 아닌 문자 'A'를 출력하기 위해서는 몇 가지 방법이 있는데 첫 번째 방법은 string type으로 형 변환하는 것이다.

rune type string type casting

string(65)도 출력하면 A가 출력되지만 IDE에서 주위 표시를 뿜! 뿜! 한다. 다음 두 번째 방법은 strconv 패키지의 QuoteRune 함수를 사용하는 방법이다.

strconv package에 있는 QuoteRune함수를 사용하는 방법

본인이 찾은 방법은 두 개고 다른 방법이 있으면 공유 부탁드립니다!! ㅎㅎ;;

 

책을 읽으면서 재밌는?? 부분이 있었는데  Go에서 Java와 같이 char라는 타입 명을 사용하지 않은 이유를 간단하게? 설명하고 있다. Java의 char 타입 크기는 2byte로 0~65535까지 표현할 수 있어 유니코드 6.2 버전에서 지원하는 약 11만 개의 문자를 표현할 수 없다. (책에 Java 1.8 버전에서 유니코드 6.2 버전을 지원한다. 고 쓰여있다.) 그래서 Java의 char 타입으로 약 11만 개의 문자를 표현하기 위한 방법으로 서로게이트 쌍이라는 방법을 사용한다고 한다. Go에서 char라는 타입 명을 사용하지 않은 이유는 4byte로 문자를 표현할 수 있어서라고 설명하고 있다.

 

string

string 타입은 초기화 값을 크게 두 종류로 나눌 수 있다. 큰따옴표("")와 역 따옴표(``) 안에 문자들을 나열하는 것과 rune 타입의 배열을 string 타입으로 형 변환하는 방법을 사용하여 초기화할 수 있다.

string type value

첫 번째 방법인 큰따옴표와 역 따옴표로 초기화 값을 설정할 때 주위가 필요한데 큰따옴표는 역슬래시(\)를 접두사로 시작하면 이스케이핑 처리나 유니코드를 사용하여 문자를 표현할 수 있는데 역 따옴표는 문자 그대로 표출한다는 부분이다.

큰따옴표와 역 따옴표의 차이

위와 같이 문자 그대로를 출력하는 역 따옴표를 책에서 RAW문자열 데이터라고 쓰여 있다. RAW문자열 데이터는 문자열과 다른 부분이 있는데 들여 쓰기(\n)를 해도 문제가 발생하지 않는다는 점이다.

raw 문자열의 장점

이런 기능을 응용하면 콘솔에 출력할 때 조금 편하게? 할 수 있다.

RAW문자열 응용

이런 식으로 출력할 수도 있고 변수로 저장할 수도 있다. 그리고 Go를 공부하면서 조금 신기한??? 부분이 있는데 어떻게 보면 프로그래밍 언어가 문자열을 저장하는 방법을 그대로 보이는 부분인 거 같기도 하다. string 타입인 변수를 배열처럼 index를 사용하여 접근할 수 있다는 점인데 index를 통해 접근하면 int 타입의 값이 반환된다. (int가 아니고 rune이라 해야 하나?? ㅎㅎ;;)

신기한 go의 string 타입

index로 접근이 가능하니 호기심이 생겼다. "과연 해당 index의 값을 변경할 수 있을까?"라고 말이다 ㅎㅎ;;

응 안돼~

뚜둔... ㅎㅎ 안된다 ㅋㅋ

 

 

오늘은 여기까지 하고 다음에는 array를 포스트 하겠다. 빠이~