Install and Hello world

Rust 설치하고 Hello world 출력#

Rust 설치#

Rust 공식 사이트에서 설치 프로그램을 다운로드 후 실행하세요.
설치는 간단하게 진행됩니다.

Hello world#

간단한 메시지를 출력하는 프로그램을 만들어 봅시다.
저는 D:\works\rust\practice1 경로에 code1.rs라는 파일을 생성하고, 다음과 같이 코드를 작성했습니다.

fn main() {
    println!("Hello, semonan.com");
}
  • Rust는 main()로부터 시작됩니다.
  • fn이라는 키워드를 통하여 함수를 생성합니다.
  • println!("~~~"); 를 통하여 메시지를 출력할 수 있습니다.
  • println!() 에서 !는 Rust의 Macro를 호출한다는 의미입니다.
  • Rust는 Tab대신 Space 4칸을 사용하므로, println!() 앞에 Space 4칸을 사용했습니다.
  • println!("~~~"); 처럼 코드 한 줄이 끝날때 ; 로 끝납니다. (문법적으로 ;으로 끝나지 않는 경우가 있으므로 상황에 맞게 사용해야 합니다.)
     

다음은 소스코드를 컴파일 해 봅시다.
rust의 컴파일러는 rustc 입니다.
소스코드 파일이 있는 경로에서 rustc code1.rs 명령을 입력하면 컴파일 됩니다.

변수의 가변성

변수의 가변성#

let#

Rust에서 변수를 선언할 때 다음과 같이 let 키워드를 사용합니다.

fn main() {
    let apple = 10;
}

하지만, let 은 기본적으로 불변(immutable)이기 때문에, 다음처럼 apple의 값을 변경하려고 하면 에러가 발생합니다.

fn main() {
    let apple = 10;
    apple = 20;
}
error[E0384]: cannot assign twice to immutable variable `apple`

let mut#

값을 수정하기 위하여 다음과 같이 let mut 키워드를 사용해야 합니다.
여기서, mut는 mutable을 의미합니다.

fn main() {
    let mut apple = 10;
    apple = 20;
}

변수를 사용할 때 가변(mutable)과 불변(immutable)을 명확히 구분하는 이유는 Human error를 줄이고, 가독성 개선, 디버깅 효율성 개선, SW 품질 보장 등의 장점을 가질 수 있습니다.

데이터 타입

데이터 타입#

Rust의 모든 값은 Data type을 가집니다.
Rust는 정적 타입 언어이기 때문에 컴파일 시점에 Data type이 정해져 있어야 합니다.

1. Scalar type#

Scalar type은 값 하나를 표현하며 다음 4종류의 Scalar type이 있습니다.

1.1 integer#

integer는 정수를 사용하는 type이며 소수점은 사용할 수 없습니다.
integer type의 종류는 다음 표와 같습니다.

SizeSignedUnsigned
8-biti8u8
16-biti16u16
32-biti32u32
64-biti64u64
128-biti128u128
archisizeusize

여기서, i는 부호 있는(Signed) 정수로 양수와 음수를 사용할 수 있습니다.
u는 부호 없는(Unsigned) 정수로 양수만 사용할 수 있습니다.
Signed는 1-Bit를 부호로 사용하기 때문에 값의 표현 범위가 Unsigned보다 작습니다.
값의 표현 범위는 다음 수식처럼 계산할 수 있으며, $n$은 사용 비트 수를 의미합니다.

함수

함수 (Function)#

함수 정의#

함수는 다음과 같이 fn 키워드를 통하여 생성합니다.
함수를 정의하는 순서를 고려할 필요가 없으므로 Scope 어딘가에 정의되어 있으면 됩니다.
따라서 다음 예제 코드는 main() 함수 뒤에 hello() 함수가 위치하고 있으며 컴파일 및 실행이 정상적으로 수행됩니다.

fn main() {
    hello();
}

fn hello() {
    println!("hello");
}

매개변수 (Parameter)#

다음 예제 코드와 같이 함수를 호출 할 때 Parameter를 넘길 수 있습니다.
add 함수는 i64 타입의 ab 두 개의 Parameter를 받을 수 있습니다.
i64처럼 함수에서 Parameter를 받을 때 타입을 반드시 선언해야 합니다.
Parameter를 여러 개 전달 할 수 있습니다.

문자열 자르기

문자열 자르기#

문자열 자르기 문법#

Rust는 문자열을 자르기 자르기 위한 편리한 문법을 제공합니다.
다음 코드를 통해서 알아봅시다.

fn main() {
    let s = String::from("hello world");
   
    println!("{}", &s[0..5]);
    println!("{}", &s[6..11]);

    println!("{}", &s[..5]);
    println!("{}", &s[6..]);

    println!("{}", &s[..]);
}

&s[0..5] 처럼 코딩하면 "hello"를 잘라낼 수 있습니다.
여기서 0은 Start index를 의미하고, 5는 End index +1 를 의미합니다.
(End index에 +1 하여 사용한다는 것을 유의하세요.)
&s[6..11] 처럼 코딩하면 "world"를 잘라낼 수 있습니다.

struct

struct#

struct 기본적인 사용법#

Rust의 Struct 사용법을 알아 봅시다.
다음 예제의 struct Person { ~~~ } 부분은 구조체를 정의하고 있습니다.
Person 구조체는 name, age, is_student의 Field를 가지고 있으며, 각 Field 마다 type이 정의 되었습니다.

struct Person {
    name: String,
    age: i32,
    is_student: bool,
}

fn main() {
    let mut person = Person {
        name: String::from("semonan.com"),
        age: 12,
        is_student: true,
    };
    println!("{}, {}, {}", person.name, person.age, person.is_student);

    person.age = 13;
    println!("{}, {}, {}", person.name, person.age, person.is_student);
}

let mut person = Person { ~~~ }과 같이, 구조체는 Instance로 생성되어야 사용할 수 있습니다.
위 예제에서는 각 Field의 값을 변경할 수 있도록 mutable로 Instance를 생성했습니다.
person.name, person.age, person.is_student 처럼 코딩하면 구조체의 값을 읽을 수 있습니다.
person.age = 13; 처럼 코딩하면 값을 변경할 수 있습니다.

struct method

struct method#

Method 란?#

Method는 Struct 안에 포함되어 있는 것이 다를 뿐, Function과 같다고 볼 수 있습니다.
Method를 정의 하는 방법을 알아 봅시다.
다음 예제의 struct Person { ~~~ } 처럼 Person Struct를 정의 했습니다.
impl Person 에서 impl은 implementation의 약어입니다.
impl { ~~~ } 안에 만들어지는 Function이 Method입니다.
fn speak(self) { ~~~ }처럼 Method를 만들었고, 첫번째 Parameter로 self를 전달 받았습니다.
self는 자기 자신인 struct Person을 가르킵니다.
반드시 Method의 첫번째 Parameter로 self를 받아야 합니다. 그렇지 않으면 Compile error가 발생합니다.
println!("hi, {}", self.name);self.name을 print하고 있습니다.
여기서 self.namestruct Person { name: String, } 안의 name: String을 가리키는 것입니다.
let person = Person{ ~~~ }; 처럼 Instance를 생성 후, person.speak() 처럼 Method를 호출 할 수 있습니다.