Rust란 무엇인가?
Rust(러스트)는 성능과 안정성을 모두 추구하는 시스템 프로그래밍 언어이다.
모질라(Mozilla) - FireFox 개발사에서 개발해 시작되었으며, 현재는 독립적인 커뮤니티,
재단등을 중심으로 활발하게 개발되는 중인 언어.
러스트의 가장 큰 특징은 아래와 같다.
1. 메모리 안정성을 보장한다.
2. C++ 수준의 실행 성능을 유지한다.
3. GC(가비지 컬렉터) 없이도 안정적인 코드 작성이 가능하다.
이런 특성 떄문에 러스트는 시스템 프로그래밍, 네이티브 성능이 중요한 어플리케이션,
웹 백엔드, 임베디드 개발등에서 많이 활용되는 중이다.
Rust는 왜 필요할까?
기존에 널리 사용되고 있던 C,C++의 경우 고성능을 제공하지만,
사용자가 직접 메모리 관리 책임을 져야 한다는 점에서 오류가 발생할 가능성이 매우 크다.
(오죽하면 백악관에서도 C++을 깔정도 일까...ㅋㅋㅋ)
C++의 경우 아래와 같은 버그가 자주 나타난다.
1. Use-after-free
2. Double-free
3. 댕글링 포인터
4. 버퍼 오버플로우
러스트는 이러한 문제를 해결하기 위해서 컴파일 타임에 방지할 수 있는 언어 구조를 가지고 있다.
대표적으로 아래와 같은 개념들이 가능하게 만든다.
1. 소유권(Ownership)
2. 빌림(Borrowing) <- 물건 빌릴때 그 빌림 맞음.
3. 라이프 타임(Lifetime)
때문에 런타임 오류가 아닌 컴파일 타임 오류로 개발중에 사전에 방지 할 수 있다.
Rust vs C++: 어떤 점이 다른가?
Rust는 많은 부분에서 C++의 대안이 되고 있다.
두 언어의 주요 차이점을 표로 비교하면 다음과 같다
항목 | C++ | Rust |
메모리 관리 | 수동 (new/delete, RAII 등) | 소유권 시스템으로 자동 관리 |
안전성 | 수동 관리로 인한 버그 위험 | 컴파일 타임 검사로 안정성 보장 |
Null 참조 | 존재 (nullptr) | Option<T>로 안전하게 처리 |
에러 처리 | 예외(throw/catch) 또는 반환값 | Result<T, E>로 명시적 처리 |
빌드 도구 | Makefile, CMake 등 다양함 | cargo 단일 도구 사용 |
기본 실행 성능 | 매우 우수 | C++과 동급 수준 |
제네릭 시스템 | 템플릿 기반 | 제네릭 + 트레이트 바운드 기반 |
다중 상속 | 지원 | 미지원 (트레이트 조합으로 해결) |
Rust는 다중상속, 예외처리, 가비지 컬렉션을 제거하고도 생산성과 안정성을 확보한 구조이다.
초보자, 입문자 입장에서는 많이 낯설다(나도 낯설다...)
일관되고 예측 가능한 문법을 통해서 점진적으로 익힐 수 있다.
Hello World 라도 쳐보자. -> 일반 함수와 매크로의 차이는?
Rust 프로젝트는 Cargo라는 공식 빌드 도구로 관리한다.
참고로 IDE의 경우 vscode를 사용할 수도 있지만, 개인적으로는
RustRover(jetbrains) IDE를 사용하는 것이 정신건강에 좋을 것이다.
$ cargo new hello_rust
$ cd hello_rust
$ cargo run
fn main() {
println!("Hello, world!");
}
위에 간단한 출력문 예제는 main 함수를 실행해서 "Hello World"를 출력하는 구문이다.
println!은 러스트의 매크로(marco)이며, 뒤에 느낌표가 붙는다.
러스트는 일반 함수와 매크로를 명확히 구분하기 위해서 이런 느낌표를 붙인 문법을 사용한다.
Rust 컴파일과 실행 흐름
러스트는 컴파일 타임에 대부분의 오류를 잡아내는 정적 언어이다.
코드를 작성 하면 다음 과정을 거친다.
1. cargo build : 코드를 컴파일 하여 바이너리를 생성한다.
2. cargo run: 빌드 후에 즉시 실행한다.
3. cargo check : 빌드 없이 컴파일 오류만 확인한다.(생각보다 엄청 빠름.)
러스트 컴파일러는 매우 정교한 에러메시지를 제공하기에 초보자도 오류 원인 파악이 쉽다.
Cargo(카고)의 역할
러스트에서 Cargo(카고)는 아래와 같은 역할을 담당한다.
1. 프로젝트 생성 및 구조 관리
2. 의존성 관리(Cargo.toml)
3. 테스트, 빌드, 실행 통합
4. 외부 라이브러리 crates 관리
[dependencies]
serde = "1.0"
위에와 같이 작성하면 serde라는 라이브러리를 자동으로 다운로드 하고서 프로젝트에 포함시키는 구조.
C++의 CMake나 Makefile보다 더 간편한 편이다.
이제 어쩌면 다음세대의 C++로 대체 될수도 있는 RUST를 본격적으로 알아보도록 하자.
댓글