Learning Rust #3

TAEJUN KIM·2021년 9월 1일
0

Rust

목록 보기
3/4
post-thumbnail

Function

  • 다음과 같은 코드를 보자
fn main(){
    let x = 5;
    
    let y = {
        let x = 3;
        x+1 // x+1; 이되면 statement로 해석된다. 
    };
    
    println!("The value of y is : {} ", y);
}
  • 출력 결과를 보면 y는 4가 나온다. 기존에 알고있던 언어들 C, C++, JAVA, Python 과는 다른 양상이다.

  • x+1; 처럼 사용하면 Statement로 간주되어 값을 반환하지 않는다.

Function & Return Value

  • 늘 그렇듯 함수는 값을 반환한다. "입력 -> 처리 -> 결과" 니까
fn five() -> i32{
    5
    }
    
fn main(){
    let x = five();
    
    println!("x is : {}", x);
}
  • five 함수를 보면 ->를 통해 반환 타입을 설정해주고 있다. int 32bit 를 반환하는데 반환값인 5에는 세미콜론(;)이 없음을 꼭 짚고 넘어가자.
    타 문법에서 5를 반환하려면 return 5; 처럼 쓰는걸 그냥 5 로 쓰면 된다.
    그럼 만약 내가 x+1 을 반환한다면? return x+1; 처럼 썼으니까 x+1 이라고 하면된다.

  • 내가 만약 세미콜론을 붙인다면 expression 에서 statement로 간주되고 statement는 반환값이 없으니까 에러가난다.

Comments

  • 한 줄 주석 : //
fn main(){
    let lucky_number = 7 ; // I'm feeling lucky 
}

보다

fn main(){
    //I'm feeling lucky
    let lucky_number = 7;
}

같은 방식을 관용적으로 사용한다.

if expression

  • Example code를 보자
fn main(){
    let number =3;
    
    if number <10 {
        println!("true");
    } 
    else{
    println!("false");
    }

과 같다.

  • 한가지 주의할 점은 다른 언어들 처럼 Boolean-expression 으로 자동 캐스팅을 안한다는 점이다.
C++
int a =3;

if(a){
return;
}

rust
let a =3;

if a {
}
  • 이런 코드는 컴파일 에러를 발생시킨다. 왜냐면 if문의 참 거짓 판별 자리에는 Boolean 식이 와야하는데 int 타입이 왔다.

  • 조건 판별자리에 자동으로 boolean 타입 캐스팅을 안해주고, 괄호가 들어가지 않는다는 점을 빼면 기존에 아는 C++ 문법과 동일하다.

  • if 는 expression이다. 이를 구분하는게 중요하다고 했다. expression은 값을 반환한다.
    따라서 다음과 같은 코드가 된다.

fn main(){
    let condition = true;
    let number = if condition {5} else{6} ; // number 에는 i32 타입 5가 들어간다.
	// let number= if condition{5} else{"hello"} 는 안되는 코드이다. 
  • 좀더 자세히 쪼개보면
    let Statement ; 인 구조인데
    Statement 자리에 number = (expression) 이 온것이다.
    그리고 그 expression이 if condtion {5} else {6} 인 것이다.
    따라서 condition 이 true 니까 number에 5가 할당된다.

두번째로 if 문에서 true일때는 i32 5를 할당하고 false이면 String "hello"를 할당한다. 근데 rust는 static type language니까 compile time에 number의 type이 정해져야한다.
하지만 위같은 코드가 돌아가려면 runtime에 확인해야하므로 컴파일 에러가난다.

Loop (반복문)

  • rust는 loop, while, for 세가지의 반복문을 가진다.

loop

  • 명시적으로 stop을 지시하기전까지 계속 돌아가는 무한루프이다. , break가 없으면 안 멈춘다.
fn main(){
    loop{
        println!("hello");
    }
}

"Hello"가 무한정찍힌다.

  • loop 로도 값을 리턴할 수 있다. 근데 이걸 break expression으로 한다.
fn main(){
    let mut counter =0;
    
    let result = loop{
        counter+=1;
        
        if counter == 10{
            break counter*2;
        }
   };
   
   println!(" result : {}",reuslt); // result 는 20이다.
}

얘도 구조를 한번 분석해보자.

let result = expression 인건데
expression이 loop이다. 새로운 스코프를 만드는 {} 또한 expression 이므로 반환값이 있어야한다.
loop expression이 어떻게 구성되는가 하니

counter 를 1씩 추가해가다가 10인 순간 counter*2 값을 반환하고 break로 루프를 종료한다.

  • 조건에 의한 루프의 종료는 loop 로구현시 if , else , break를 통해 조건에 따른 분기를 시켜 종료값을 리턴해주면된다.

-너무 많은 코드의 낭비아닌가, 이를 간단히 하기 위해 while문이 있다

fn main(){
    let mut number = 3;
    
    while number !=0{
        println!("{}", number);
        number -=1;
    }
}

while condtion {} 식으로 이루어지는데 이 condtion 값이 true 이면 {} 안의 코드가 실행된다.

  • for은 collection 내의 item 을꺼내는데 사용할수 있다. 이터레이터 쓰는거처럼~
fn main({
    let a = [10, 20, 30, 40, 50];
    
    for element in a.iter(){
        println!("{}", element);
    }
}
  • 직접인덱스를 지정하는거보다 좋은점은 out of bound같은 기계적 오류나 요소를 빼먹는다던가 하는 휴먼 에러를 발생시키지 않는다는 것이다. 그래서 Rust를 하면 for을 써라 ! Rustacean들은 for을 사랑한다

  • Range를 사용하는 방법

fn main(){
    for number in (1..4).rev(){ // (1..4) = 1, 2, 3 이고
        println!{"{}", number};  // range.rev()는 거꾸로 돌리는거니까 3, 2,1 출력
    }
}
profile
前) 컴퓨터 공학과 학생 現)취준 백수

0개의 댓글