kakasoo

4. 러스트 프로그래밍 시작 - 함수 작성하기 본문

프로그래밍/Rust

4. 러스트 프로그래밍 시작 - 함수 작성하기

카카수(kakasoo) 2024. 3. 24. 21:32
반응형

Basic Data Types

  • Booleans : true 또는 false를 의미하며 Rust에서는 1byte 크기를 가진다.
  • Character : Rust에선 4바이트의 크기이며, Rust에서는 ASCII를 Char로 저장하면 공간을 낭비하게 된다.
  • Integers : 부호가 없는 경우 u, 부호가 있는 경우 i이며 비트에 따라 뒤의 숫자가 달라진다.
    • u8,i8
    • u16, i16
    • u32, i32
    • u64, i64
    • u128, i128
  • Floats
    • f32
    • f64 : f32 대비 2배의 정밀도를 갖는 타입

화성에서 무게를 재는 프로그램

$ cargo new mars_calc # mars_calc라는 프로젝트 폴더를 생성하낟.
$ cd marcs_clac
$ cargo run # Hello, world! 가 나오는 것을 확인한다.

폴더를 생성한다.

 

// main.rs
fn main() {
	println!("Hello, world!");
}

Rust 프로젝트는 항상 main 함수로부터 시작된다.

러스트 함수에서는 함수명과 변수명을 작성할 때에는 스네이크 케이스를 사용하는 편이다.

 

fn calcuate_weight_on_mars(weight: f32) {
	
}

러스트에서는 항상 파라미터의 데이터 유형을 명시해야 한다.

이는 타입스크립트처럼 타입을 알려준다는 의미 외에도, 러스트에서는 스택 프레임의 크기를 정하는 의미도 된다.

 

fn calcuate_weight_on_mars(weight: f32) -> f32 {
	
} 

러스트에서는 리턴 타입을 명시해야 하며 화살표 기호를 사용한다.

이 시점에서 반환 데이터 유형으로 넣은 f32 부분에 에러 표시가 나오기 시작할 텐데, 컴파일 에러이다.

컴파일 에러는 현재 이 함수가 f32 유형을 반환할 거라 기대하고 있는데 실제 반환이 없기 때문에 발생한다.

 

fn calcuate_weight_on_mars(weight: f32) -> f32 {
	return 50.0;
} 

이렇게 값을 넣어주면 에러가 나지 않는다.

 

fn calcuate_weight_on_mars(weight: f32) -> f32 {
	50.0
} 

러스트에는 신기한 특성이 하나 있는데 한 줄만 작성할 경우 return과 세미콜론을 동시에 생략할 수 있단 것이다.

이러면 딱 한 줄의 코드만 작성할 수 있고 우리는 이런 방식을 사용할 것이다.

 

fn main() {
	println!("weight on Mars: {}kg", calcuate_weight_on_mars(100.0));
}

fn calcuate_weight_on_mars (weight: f32) -> f32 {
	(weight / 9.81) * 3.711 // 화성에서 몸무게를 구하는 공식으로 kg을 9.81로 나누고 3.711을 곱한다.
}

이제 calcuate_weight_on_mars 함수의 사용 부분을 main에서 호출하면 사용할 수 있다.

calcuate_weight_on_mars 부분도 실제 함수의 의미에 맞게 화성에서의 몸무게를 구하는 공식을 대입했다.

단, 이 식은 weight를 대입해야 하는데, 현재는 100kg을 의미하도록 100.0 값을 함수의 파라미터로 대입했다.

이러면 가독성이 나쁘기 때문에 해당 함수를 변수에 대입해서 변수를 넣는 것으로 고치자.

 

fn main() {
	let mars_weight = calcuate_weight_on_mars(100.0); // 변수명 다음 콜론을 넣어 타입을 명시할 수도 있다.
	println!("weight on Mars: {}kg", mars_weight);
}

fn calcuate_weight_on_mars (weight: f32) -> f32 {
	(weight / 9.81) * 3.711 // 화성에서 몸무게를 구하는 공식으로 kg을 9.81로 나누고 3.711을 곱한다.
}

변수의 선언은 let으로 하며 변수에는 똑같이 콜론 기호를 사용해 데이터 유형을 명시할 수 있다.

하지만 러스트 컴파일러도 타입스크립트와 같이 타입추론을 하기 때문에 명시하지 않아도 동작한다.

 

fn main() {
	let mars_weight = calcuate_weight_on_mars(100.0); // 변수명 다음 콜론을 넣어 타입을 명시할 수도 있다.
	mars_weight = mars_weight * 1000.0; // ERROR!
	println!("weight on Mars: {}kg", mars_weight);
}

fn calcuate_weight_on_mars (weight: f32) -> f32 {
	(weight / 9.81) * 3.711 // 화성에서 몸무게를 구하는 공식으로 kg을 9.81로 나누고 3.711을 곱한다.
}

만약 kg이 아니라 g 단위로 알고 싶다면 변수에 다시 할당해야 한다.

위처럼 코드를 작성하면, 러스트의 변수들은 기본적으로 불변 변수기 때문에 에러가 발생한다.

이는 자바스크립트, 타입스크립트에서 let이 재할당 가능한 변수 선언인 것과는 다른 활용이다.

 

cannot assign twice to immutable variable `mars_weight`
cannot assign twice to immutable variablerustcClick for full compiler diagnostic
main.rs(2, 6): first assignment to `mars_weight`
main.rs(2, 6): consider making this binding mutable: `mut mars_weight`

발생한 에러는 위와 같은데, 생각보다 컴파일러가 친절하게 알려주고 있다.

cargo build를 하면 발생하는 에러이지만 IDE에서도 린트 에러를 보여주기 때문에 빠르게 확인할 수 있다.

러스트는 기본적으로 불변변수가 되게끔 동작하기 때문에 ‘mut’ 이라는 키워드를 사용할 것을 고려하라고 한다.

 

fn main() {
	let mut mars_weight = calcuate_weight_on_mars(100.0); // 변수명 다음 콜론을 넣어 타입을 명시할 수도 있다.
	mars_weight = mars_weight * 1000.0; // ERROR!
	println!("weight on Mars: {}kg", mars_weight);
}

fn calcuate_weight_on_mars (weight: f32) -> f32 {
	(weight / 9.81) * 3.711 // 화성에서 몸무게를 구하는 공식으로 kg을 9.81로 나누고 3.711을 곱한다.
}
반응형