잡학(雜學)

Rust 2장 - 3. 문자열

쪼랩전사 2021. 6. 24. 21:15
728x90

원래는 문자열을 이렇게 빠르게 포스팅할 생각이 없었는데, rust로 알고리즘 문제 풀다가 문자열이 너무 이상해서, 공부 겸 먼저 올립니다.

문자열 타입

Rust에는 두 가지 타입의 문자열이 있다.

String&str이다.

String 특징

  • Vec<char>를 가지는 구조체[각주:1]
  • UTF-8 보장
  • 힙 영역의 데이터
  • 내용 변경 가능
  • null terminated가 아님!

&str 특징

  • &[char] 슬라이스
  • UTF-8 보장
  • 스택 영역의 데이터

문자열 타입 지정


fn main() {
    let s = "ABCD";
    println!("{}", s);
}

위와 같이 "ABCD"를 지정하는 경우, &str 타입으로 취급된다.

String 타입을 지정하고 싶은 경우 아래와 같이 만들면 된다.


fn main() {
    let s = "ABCD".to_string();
    let s = String::from("ABCD");
    let s: String = "ABCD".into();
}

위 3가지 방법은 모두 String 타입을 가지게 된다.

2번째, 3번째 방법은 trait[각주:2]을 이용한 방법이다.

문자열 리터럴

문자열을 표현하는 방식은 아래와 같다.


fn main() {
    let s = "ABCD\nEFG";
    println!("{}", s);
    let s = "ABCD
EFG";
    println!("{}", s);
    let s = r"ABCD\nEFG";
    println!("{}", s);
    let s = r#"AB"CD\nEFG"#;
    println!("{}", s);
}

첫 번째 println!에서는

ABCD

EFG

가 출력된다.

 

두 번째도 첫 번째와 똑같이 출력된다.

 

세 번째는 문자열 앞에 r을 넣었는데 이것은 \n과 같은 문자를 그대로 출력하기 위해서 사용된다.

즉,

ABCD\nEFG

위의 문자열이 그대로 출력된다.

 

네 번째는 r 을 붙이고 문자열 앞뒤로 #을 붙였는데, 이는 문자열 내의 "(따옴표)들을 그대로 출력하기 위해서 사용된다.

즉,

AB"CD\nEFG

가 출력이 된다.

 

다른 언어를 공부하시는 분들은 이미 아시겠지만, 문자열 내에서 "(따옴표)를 표시하기 위해서는 첫 번째 방법에서 \"를 쓰면 "가 출력이 된다.

다만, Rust에서는 사용자 편의를 위해서 3번째와 4번째 방법을 추가로 제공하는 듯 보인다.

문자열 조작

앞서 말했듯, String의 경우 내용을 변경할 수 있다.

내용을 변경하는 방법은 다음과 같다.


fn main() {
    let mut s = String::new();
    s.push('A');
    s.push_str("BCD");
    s.remove(1);
    let ch = s.pop().unwrap();

    println!("{}", s);
    println!("{}", ch);
}

변수 선언할 때, let mut을 사용하고 있음을 주의하라.

Rust는 기본적으로 불변 변수를 가진다.

 

push는 문자를, push_str는 문자열을 현재 문자열의 맨 뒤에 붙이는 역할을 한다.

"ABCD"

remove는 해당하는 인덱스의 문자를 제거하며,

"ACD"

pop은 문자열의 마지막 문자를 문자열에서 제거하며, 해당 문자를 반환한다.

"AC"

unwrap은 지금 단계에서는 무시하자!

 

결과적으로 첫 번째 출력문에서는 "AC"를 출력한다.

두 번째 출력문은 "D"를 출력한다.

  1. 다른 챕터에서 설명한다. [본문으로]
  2. 다른 챕터에서 설명한다. [본문으로]

'잡학(雜學)' 카테고리의 다른 글

소수  (0) 2021.08.12
Centos 7 잡학  (0) 2021.07.20
Rust 2장 - 2. 기본 데이터 타입  (0) 2021.06.17
Rust 2장 - 1. 변수와 상수  (0) 2021.06.15
억지 기법  (0) 2021.06.13