LFEL1002: Getting Started with Rust 후기

안녕하세요, Surmin입니다.

리눅스 재단에서 무료로 RUST 교육을 진행하고 있습니다. 아래는 RUST에 대해 제가 알아낸 내용을 정리해 보았습니다.

대여 검사기의 핵심 규칙은 간단합니다:

  • 어느 시점에서든, 코드의 한 부분이 데이터를 변경할 수 있거나 여러 부분이 동시에 데이터를 읽을 수 있지만, 절대로 둘 다 동시에 할 수 없습니다.

이렇게 하면 서로 다른 프로그램 부분이 동시에 같은 데이터를 변경하려고 할 때 발생하는 복잡한 버그를 방지할 수 있습니다.

러스트의 소유권 시스템과 대여 검사기가 함께 작동하면 다음과 같은 일반적인 실수를 피할 수 있습니다:

  • 널 포인터 역참조: 러스트는 메모리의 위치를 참조해야 하는 변수가 실제로 유효한 위치를 가리키도록 합니다.
  • 버퍼 오버플로: 러스트는 배열이나 리스트의 경계 내에서만 데이터를 읽거나 쓸 수 있도록 보장합니다.
  • 메모리 안전성 취약점: 댕글링 포인터, 이중 해제, 버퍼 오버플로 등을 방지합니다.
  • 데이터 경쟁: 메모리 손상 및 교착 상태를 포함하여 이를 방지합니다.
  • 정의되지 않은 동작을 방지합니다.

간단히 말해, 러스트는 코드가 컴파일되기 전에 이러한 문제들을 미리 찾아내고 수정하도록 강제하여 더 안전한 프로그램을 만들 수 있도록 도와줍니다.

제로 비용 추상화란?

러스트는 아주 특별한 장점이 있습니다: 코드를 쉽게 작성하면서도 프로그램이 느려지지 않도록 하는 ‘제로 비용 추상화’입니다.

쉬운 예시로 설명하자면:

  1. Option과 Result:
  • 함수가 실패할 수 있을 때, “이 함수는 성공하거나 실패할 수 있어”라고 명확하게 표시할 수 있습니다. 보통 다른 언어에서는 이런 안전장치가 프로그램을 느리게 만들지만, 러스트에서는 속도 저하가 없습니다.
  1. 패턴 매칭:
  • 복잡한 if-else 문 대신 “이 데이터가 A 형태면 이렇게, B 형태면 저렇게 처리해”라고 쉽게 코드를 짤 수 있습니다. 이 또한 실행 속도는 일반 if문과 동일합니다.
  1. 클로저:
  • 작은 함수를 즉석에서 만들어 사용할 수 있습니다. 예를 들어, “이 리스트에서 숫자가 5보다 큰 것만 골라줘”처럼요. 편리하면서도 빠르게 실행됩니다.
  1. 제네릭:
  • “이 함수는 숫자든, 글자든, 어떤 타입이든 다 처리할 수 있어”라고 말할 수 있는 기능입니다. 컴퓨터는 실행 전에 미리 각 타입에 맞는 코드를 만들어두기 때문에 속도 저하가 없습니다.
  1. 반복자와 조합기:
  • 데이터 목록을 처리할 때 “이 목록의 모든 항목에 2를 곱하고, 10보다 큰 것만 골라내”처럼 간결하게 표현할 수 있습니다. 이런 방식이 보통은 느릴 수 있지만, 러스트에서는 빠르게 작동합니다.
  1. RAII (자원 관리):
  • 컴퓨터 메모리나 파일 같은 것들을 자동으로 관리합니다. “이제 이 데이터가 필요 없네? 그럼 알아서 정리할게”라고 러스트가 처리해주는 것입니다.

간단히 말해, 러스트는 프로그래머가 “더 쉽고 안전하게 코드를 짤 수 있도록” 도와주는 기능들이 많습니다. 보통 이런 기능들은 프로그램을 느리게 만듭니다. 하지만 러스트에서는 이 기능들이 “제로 비용”으로 제공됩니다. 즉, 편리함을 얻으면서도 속도는 그대로 유지된다는 의미입니다. 마치 고급 자동차를 운전하면서도 안전 기능이 많아도 속도가 줄어들지 않는 것과 비슷합니다!

“Hello, World!”로 시작하기

간단한 “Hello, World!” 프로그램은 새로운 프로그래밍 언어를 배울 때 전통적으로 가장 먼저 만드는 프로그램입니다. 러스트에서도 이 간단한 프로그램을 통해 언어의 구조, 문법, 규칙을 엿볼 수 있습니다. 코드를 하나씩 살펴보겠습니다.

// main 함수로 시작하고 중괄호로 열기
fn main() {
    // 표준 출력에 메시지를 출력하고 세미콜론으로 끝내기
    println!("Hello, open source world!");
    // main 함수 닫기
}

주요 구성 요소

  • 함수 선언: fn main() – 프로그램 실행이 시작되는 주요 함수를 의미합니다. 여기서 ‘fn’은 ‘함수(function)’를 뜻하고, ‘main’은 함수의 이름입니다.
  • 중괄호 { }: 중괄호는 main 함수의 범위를 정의합니다. 모든 러스트 함수는 시작할 때 ‘{‘와 끝날 때 ‘}’로 경계를 표시합니다.
  • 표준 출력: println!() – 텍스트를 표준 출력(보통 터미널이나 명령 프롬프트)에 출력하는 매크로입니다. 출력할 텍스트는 큰따옴표(” “)로 감싸야 합니다.
  • 세미콜론 ;: 러스트에서 세미콜론은 표현식의 끝을 나타냅니다. 문장 끝에 마침표를 찍는 것과 같은 역할을 합니다.
  • 주석: // 문법은 한 줄 주석을 시작합니다. // 뒤에 오는 같은 줄의 모든 내용은 러스트 컴파일러에 의해 무시됩니다. 코드에 간단한 설명이나 메모를 추가할 때 유용합니다.

그 외에도 다양한 기능들을 알아볼 수 있으니, 관심이 있으시면 아래 링크에 접속하여 학습해 보시기 바랍니다.

https://trainingportal.linuxfoundation.org/courses/getting-started-with-rust-lfel1002

감사합니다.

위로 스크롤