문자열을 결합하는 방법에 대해 알아보겠습니다. + 연산자와 format! 매크로, push_str과 push를 사용해 문자 또는 문자열을 결합할 수 있습니다. 아래에서 하나씩 살펴보겠습니다.
1. + 연산자
- 왼쪽 피연산자는 반드시 String이어야 하고
- 오른쪽 피연산자는 &str이어야 합니다.
fn main() {
let s1 = String::from("Hello");
let s2 = " World";
let s3 = s1 + s2; // s1은 이동(move)되고, s3가 새 String이 됨
println!("{}", s3);
}
⚠️s1은 + 연산 후 사용할 수 없습니다(소유권 이동). 그러나, s2는 s3로 결합된 이후에도 사용할 수 있습니다.
2. format! 매크로 (가장 안전하고 권장)
- 소유권을 이동하지 않으면서 여러 문자열을 결합 가능.
fn main() {
let s1 = String::from("Hello");
let s2 = String::from("World");
let s3 = format!("{} {}", s1, s2);
println!("{}", s3);
println!("{}", s1); // s1, s2 둘 다 여전히 사용 가능
}
3. push_str / push
- String에 직접 이어 붙임.
- push_str의 인수는 String이 아니라 &str여야 합니다.
fn main() {
let mut s = String::from("Hello");
s.push_str(" World"); // 문자열 이어붙이기
s.push('!'); // 문자(char) 추가
println!("{}", s);
}
push_str의 인수로 String을 넣으니 &str이어야 한다고 하면서 에러가 발생합니다.

📌 정리
- 문자열 결합 →
+
연산자(소유권 이동) 또는format!
(안전, 권장) - 문자 추가 →
push
,push_str
- 문자(char) 타입은
'a'
처럼 작은따옴표 사용, 문자열은"abc"
처럼 큰따옴표 사용.
문자열(String
, &str
) 결합 방법을 비교하는 표
구분 | 타입 | 결합 방법 | 소유권 이동 여부 | 예제 |
---|---|---|---|---|
문자열 결합 ① | String + &str | + 연산자 | 왼쪽 String 이동 | let s1 = String::from(“Hi”); let s2 = s1 + ” Rust”; |
문자열 결합 ② | String + String | 불가능(직접은 안 됨) | – | String 둘 다 소유권 문제 → + 사용 시 오른쪽을 &s2 로 변경 필요 |
문자열 결합 ③ | 여러 문자열 | format! 매크로 | 이동 없음 | let s1 = “Hi”; let s2 = “Rust”; let s3 = format!(“{} {}”, s1, s2); |
문자열에 덧붙이기 | String + &str | push_str() | 없음 | let mut s = String::from(“Hi”); s.push_str(” Rust”); |
문자 추가 | String + char | push() | 없음 | let mut s = String::from(“Hi”); s.push(‘!’); |
문자 결합 | char + char | 직접 불가 → String 변환 후 결합 | 변환 후 결합 | let c1 = ‘A’; let c2 = ‘B’; let s = format!(“{}{}”, c1, c2); |
fn main() {
let c1 = 'A';
let c2 = 'B';
let s = c1.to_string() + &c2.to_string(); // char를 String으로 변환 후 이어붙이기
println!("{}", s);
}
💡 포인트
+
연산자는 왼쪽 String을 소비하므로 이후에 사용할 수 없음.format!
은 안전하고 가독성 좋음 → 대부분의 경우 권장.char
끼리는 직접 결합 연산자가 없으니 문자열로 변환해서 결합해야 함.