programming

C++ 에서 Rust 로 넘어가기 (c++ vs rust, OOP적 요소들)

Jack4u 2023. 6. 8. 01:21
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의 에러처리에 대해 알아보겠습니다.