🦀 Chapter 3. 일반 프로그래밍 개념
이번 글에서는 러스트(Rust) 언어의 기초 프로그래밍 개념들을 함께 살펴보려 합니다.
변수 선언부터 흐름 제어까지, 간단한 예제와 실용적인 팁을 곁들여 누구나 쉽게 따라올 수 있도록 정리했어요.
📦 변수: 기본 중의 기본
변수 선언과 가변성
러스트에서 변수는 기본적으로 **불변(immutable)**입니다. 즉, 한 번 값을 넣으면 바꿀 수 없어요.
let x = 5;
// x = 6; // ❌ 오류! x는 불변 변수입니다.
값을 바꾸고 싶다면 mut 키워드를 붙여 가변 변수로 만들어야 합니다.
let mut y = 5;
y = 6; // ✅ OK
💡 팁: 가능한 한 불변 변수로 코딩하는 것이 러스트 스타일입니다. 안정성과 예측 가능성이 높아져요!
변수와 상수의 차이
상수는 const 키워드로 선언하며, 타입을 꼭 명시해야 하고 절대 바뀔 수 없습니다.
const PI: f64 = 3.1415;
구분 변수 (let) 상수 (const)
변경 가능성 | 기본 불변 (mut로 변경 가능) | 절대 불변 |
타입 명시 | 선택 사항 | 필수 |
사용 위치 | 함수 안/밖 모두 가능 | 주로 전역 |
변수 가리기 (Shadowing)
같은 이름으로 변수를 다시 선언하면 이전 값을 덮어쓸 수 있어요. 이를 shadowing이라고 합니다.
let x = 5;
let x = x + 1;
println!("x = {}", x); // 6
💡 팁: shadowing을 이용하면 타입을 바꾸면서 재사용할 수도 있어요. mut과는 다르게 안전하게 쓰입니다.
🧮 데이터 타입
러스트의 데이터 타입은 크게 스칼라 타입과 컴파운드 타입으로 나뉩니다.
🔹 스칼라 타입 (Scalar Types)
스칼라 타입은 하나의 값만을 표현하는 가장 기본적인 타입입니다.
수나 참/거짓처럼 단일 값을 다룰 때 사용돼요.
러스트에는 총 4가지 스칼라 타입이 있어요:
타입 설명 예시
정수형 (i32, u8 등) | 정수 값을 표현합니다 | let x: i32 = 10; |
부동소수점 (f32, f64) | 실수(소수) 값을 표현합니다 | let pi: f64 = 3.14; |
불리언 (bool) | 참/거짓을 표현합니다 | let is_ok: bool = true; |
문자형 (char) | 한 글자(유니코드 포함)를 표현합니다 | let heart: char = '❤️'; |
💡 실용 팁: 부동소수점 타입 중에서는 대부분의 경우 f64를 사용하는 것이 더 정확하고 빠릅니다.
f32보다 정밀도도 높고, 현대 CPU에 더 최적화되어 있어요.
🔸 컴파운드 타입 (Compound Types)
컴파운드 타입은 여러 개의 값을 하나로 묶어 표현할 수 있는 타입입니다.
🧺 튜플 (Tuple)
서로 다른 타입의 값을 고정된 순서로 묶을 수 있어요.
let tup: (i32, f64, char) = (1, 3.14, 'a');
let (x, y, z) = tup;
📦 배열 (Array)
동일한 타입의 값을 고정된 크기로 묶습니다.
let arr = [1, 2, 3, 4];
- 크기는 고정
- 컴파일 시점에 길이를 알고 있어야 함
🧱 벡터 (Vector)
배열과 비슷하지만 크기를 동적으로 늘릴 수 있어요.
let mut vec = vec![1, 2, 3];
vec.push(4);
💡 팁: 배열을 써야 할 명확한 이유가 없다면, 일반적으로는 벡터(Vec<T>)를 사용하는 게 더 유연하고 실용적입니다.
🧭 함수: 프로그램의 기본 구성 단위
fn add(a: i32, b: i32) -> i32 {
a + b // 세미콜론이 없으면 이 값이 반환됨
}
- fn으로 함수 정의
- 매개변수는 타입 명시
- 반환 타입은 ->로 작성
- 표현식을 사용하면 자동 반환됨
💡 팁: 마지막 줄에 세미콜론을 붙이지 않으면 해당 표현식이 함수의 반환값이 됩니다.
📝 주석
// 한 줄 주석
/*
여러 줄 주석도 가능합니다.
*/
💡 팁: 로직의 의도나 복잡한 부분엔 아낌없이 주석을 달아주세요. 미래의 나와 동료가 고마워할 거예요!
🔁 흐름 제어
if, else if, else
let score = 85;
if score >= 90 {
println!("수");
} else if score >= 80 {
println!("우");
} else {
println!("그 이하");
}
loop
무한 루프를 만들고 break로 빠져나옵니다.
let mut count = 0;
loop {
if count == 3 {
break;
}
println!("count = {}", count);
count += 1;
}
while
let mut i = 0;
while i < 5 {
println!("{}", i);
i += 1;
}
for
for n in 1..=3 {
println!("{}", n); // 1, 2, 3 출력
}
if let
Option, Result와 같은 열거형의 일부 케이스만 처리하고 싶을 때 유용해요.
let some_value = Some(42);
if let Some(x) = some_value {
println!("값은 {}", x);
}
- match보다 간결하게 조건 추출 가능
let = if (조건 바인딩)
let condition = true;
let result = if condition {
"참입니다"
} else {
"거짓입니다"
};
println!("{}", result);
💡 팁: 조건문 안에서 값을 바로 할당하고 싶을 때 유용합니다. 초기화와 분기처리를 동시에 할 수 있어요.
✅ 마무리하며
이 글에서는 러스트의 가장 기본적인 프로그래밍 개념들을 간단한 예제와 함께 살펴보았습니다.
변수, 데이터 타입, 함수, 흐름 제어는 러스트를 이해하는 데 있어 중요한 기초이니 꼭 손으로 따라 쳐보며 익혀보세요.
'개발 이야기 > [스터디] Rust' 카테고리의 다른 글
[러스트 프로그래밍 공식 가이드] Chapter 6. 열거자와 패턴 매칭 (0) | 2025.06.27 |
---|---|
[러스트 프로그래밍 공식 가이드] Chapter 5. 구조체를 활용한 관련 데이터의 구조화 (1) | 2025.06.26 |
[러스트 프로그래밍 공식 가이드] Chapter 4. 소유권 (1) | 2025.06.25 |
[러스트 프로그래밍 공식 가이드] Chapter 2. 숫자 맞히기 게임의 구현 (1) | 2025.06.19 |
[러스트 프로그래밍 공식 가이드] Chapter 1. 시작하기 (1) | 2025.06.17 |