C++에서 Rust로 넘어가기 위한 C++ 개발자들을 위한 개념들을 설명합니다.
항상 맨처음에 "개념" 하나씩 쓰고 시작하는데 C++에서 Rust로 넘어가는데 알아야할 명제 입니다.
C++의 class ( struct )와 비슷한 개념이 rust의 struct입니다. 이 두개를 비교하면서 Rust로 열심히 넘어가 보겠습니다.
개념 : "C++의 class (struct)의 거의 모든 개념은 Rust의 struct로 구현 가능하다."
일단 바로 예제 코드 갑니다.
아래 예제는
- static function에서 FileWriter를 create하여 instance를 생성합니다.
- create() 함수에서 파일을 엽니다.
- write() 함수로 내용을 씁니다.
- 소멸자에서 파일을 닫습니다.
C++ | Rust |
#include <iostream> using namespace std; struct FileWriter{ FILE * fp; static FileWriter create(); void write(); void read(); ~FileWriter(); }; FileWriter FileWriter::create(){ FILE * fp = fopen("test.txt", "wt"); cout << "file opened" << endl; return FileWriter{ fp = fp }; } void FileWriter::write(){ fprintf(fp, "test data"); cout << "written data" << endl; } FileWriter::~FileWriter(){ fclose(fp); cout << "file closed" << endl; } int main(int argc, const char * argv[]) { auto writer = FileWriter::create(); writer.write(); return 0; } |
use std::ffi::CString; struct FileWriter{ fd: *mut libc::FILE } impl FileWriter { fn create() -> FileWriter{ let fd: *mut libc::FILE = unsafe { let file_name = CString::new("test.txt").unwrap(); let file_attr = CString::new("w").unwrap(); libc::fopen(file_name.as_ptr(), file_attr.as_ptr()) }; FileWriter{ fd } } fn write(&mut self){ unsafe { let data = CString::new("test data").unwrap(); libc::fprintf(self.fd, data.as_ptr()) }; } } impl Drop for FileWriter{ fn drop(&mut self) { unsafe { libc::fclose(self.fd); } } } fn main() { let writer = FileWriter::create(); writer.write(); } |
file opened written data file closed |
file opened written data file closed |
rust예제의 경우 좀 억지감이 있지만 C++과 똑같이 만들기 위해 좀 억지를 부렸습니다.
머 여기서 좋은 점도 알게 되었습니다. "Rust 에서는 왼만한 C/C++ 함수들을 바로 가져다 쓸 수 있구나"
이 예제에서 알 수 있는것들은
- rust struct는 method ( member function ) 이 없다.
- impl를 통하여 method를 구현한다. ( c++의 class::method 패턴과 비슷하지요? )
- rust는 생성자가 없어서 factory pattern을 사용한다.
- rust을 Drop trait를 구현하여 소멸자 동작을 구현 할수있다.
다음번에는 Rust의 에러처리에 대해 알아보겠습니다.
'programming' 카테고리의 다른 글
[Algorithm] C++ 부분 영역 넓이 구하기(Graph, DFS) (0) | 2023.06.09 |
---|---|
IntelliJ에서 Rust 시작하기 (0) | 2023.06.08 |
C++ 에서 Rust 로 넘어가기 (c++ vs rust, Ownership) (2) | 2023.06.08 |
Irrlicht 소개 - C++ 기반 Cross-Platform 3D 물리엔진 (0) | 2023.06.05 |
[Algorithm] C++ 중복문자열 찾기 (0) | 2023.06.04 |