rust 문법 공부

rust 공부시작!

개요

C, C++, python을 할줄 알지만 뭔가 다른 사람들과의 차별점을 두고 싶어서 하나만 더 배워보고 싶었다. rust는 백준 사이트에서 보면 굉장히 빠르다. 또한 보안에도 좋다고 들었다. 그런것도 있지만 희소성도 있는 것 같아서 공부를 해보려고 한다. 여기서는 출력, 입력, 자료형 등 기본적인 문법을 정리해보겠다. 공부할 때, tour of rust 를 많이 참고했다.

출력(print)

“Hello world”를 출력하는 것은 언제나 기본이다.

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

C와 비슷하게 main함수 안에 있고 ;(세미콜론)으로 문장을 마무리하는 것을 알 수 있다. 그리고 특이한것은 println!, 맨뒤에 !가 붙는다는 것이다. 또한 문자열은 ““로 감쌀 수 있어보인다.

변수(variable)

fn main() {
	let x = 13;
	println!("{}", x);
	
	// 자료형을 지정 float64
	let x: f64 = 3.14159;
	println!("{}", x);
	
	let mut a = 34;
	a = 10;
	println!("{}", a)
}

변수는 let을 이용해 선언한다.

  • 선언과 함께 초기화 할 수 있다.(선언만 하고 나중에 초기화해도 된다…굳이?)
  • 자료형을 지정할 수 있다. (이후 자료형을 나열해보겠다)
  • mut : mutable 변경가능한지 아닌지 설정한다.
    • default가 immutable이라 변수의 값은 변경이 불가능하다.
    • 따라서 mut 명령어를 통해 바꿀 수 있는 변수는 명시적으로 써준다.
  • 똑같은 이름의 변수를 같은 함수에서 또 선언할 수 있다. (이것은 덮어쓰기라고 생각하면 될 듯하다)
    • 이를 변수 숨김(variable shadowing)이라고 부른다.
    • 심지어 이 때 자료형도 변환 할 수 있다.

자료형(data type)

fn main() {
	let a = 1; // default : i32
	let b: i64 = 12345678910;
	let c: u32 = 19;
	let d = 5.1; //default : f64
	let e = 5.1f32; // 이런식으로 뒤에 붙여도 됨
	let f = true; //default : bool
	let tup = (123, true); // tuple : 다른 자료형도 ok
	let sen = "HI deer"; // default :str
}

기본적으로 다른 언어들과 다를게 없다.

  • boolean : bool
  • integer : i8, i16, i32, i64
  • unsigned integer : u8,u16, u32, u64
  • float : f32, f64
  • string : str
  • tuple : (value1, value2, ..)

자료형 변환

fn main() {
	let a = 1; // default : i32
	let c: u32 = 19;
	println!("{}", a as u32 + c);
}

as라는 예약어를 사용하여 쉽게 자료형을 변경할 수 있다.

상수

const PI: f32 = 3.14159;

특징은 상수는 무조건 자료형을 명시해야한다는 것이다.

배열

fn main() {
    let nums: [i32; 3] = [1, 2, 3];
    println!("{:?}", nums);
    println!("{}", nums[1]);
}

배열의 선언방식이 꽤나 신선하다. nums : (자료형) 에서 자료형 자리에 배열 표시를 해주는 것이다. [배열 요소의 자료형; 배열의 크기] 로 깔끔하게 선언할 수 있다.

fn main() {
	let mut nums: [i32; 3];
	nums = [1, 2, 3];
	nums = [4, 5, 6];
	println!("{:?}", nums);
	println!("{}", nums[1]);
}

이 또한 mutable하게 선언해서 사용할 수 있다. mut 명령어가 없다면 [1, 2 , 3] 까지는 되지만 [4, 5, 6]이 안될 것이다.

고정길이 배열이기 때문에 초기화시 맘대로 원소의 수를 줄이거나 늘리기는 힘들다.

함수

fn add(x: i32, y: i32) -> i32 {
	return x + y;
}
  
fn main() {
	println!("{}", add(1, 2));
}
  • fn 함수이름(매개변수 : 자료형 , 매개변수 : 자료형 ) -> 리턴값의 자료형{함수내용}
  • 재밌는 것은 c, c++과 달리 add 함수를 선언을 해주지 않고 main함수 뒤로 보내도 정상 작동한다.

튜플을 리턴하기

fn swap(x: i32, y: i32) -> (i32, i32) {
    return (y, x);
}

fn main() {
    // 리턴 값의 튜플을 리턴
    let result = swap(123, 321);
    println!("{} {}", result.0, result.1);

    // 튜플을 두 변수명으로 분해
    let (a, b) = swap(result.0, result.1);
    println!("{} {}", a, b);
}

튜플의 각 원소에 접근하는 것이 간단하다. (.0, .1로 접근하고 있다.)

let (mut a, mut b) = swap(result.0, result.1);
println!("{} {}", a, b);
(a, b) = swap(a, b);
println!("{} {}", a, b);

이런식으로 편하게 swap함수를 이용해 변수에 있는 값을 뒤바꿀 수도 있다. 튜플에 mut을 적용하는 방법은 위와 같다. (하지만 mut를 남용하는 것은 좋지 않아보인다.)

unit

c++의 void 처럼 아무것도 리턴하지 않으려면 어떻게 해야할까? 정답은 빈 튜플을 리턴하는 것이다. 이를 unit이라고 한다.

fn unit() -> () {
	// 아무것도 리턴 안해도 return ()과 같은 효과
}


fn main() {
	let a = unit();
	println!("The value of a: {:?}", a);
}
// 결과 : The value of a : ()

출력할 내용이 없어서 디버그 문자열을 출력한다.

마무리

rust는 충분히 재밌는 것 같다. 각 언어마다 매력이 넘쳐서 새로운 언어를 배우는 것은 언제나 즐겁다. 애인을 두고 다른 사람과 만나는 것은 현실에서는 안되겠지만 프로그래밍 언어를 배울 때는 괜찮지 않을까 싶다. rust에 관심을 가진 것은 훨씬 전이지만 이번에 노마드코더 유튜브 에서도 C, C++의 메모리 누수에 대한 우려를 보였고 러스트를 추천했다. 러스트는 변수의 default가 immutable이라는 점이 재밌다. 안전에 신경을 썼다고 하니 그런 쪽 위주로 열심히 공부를 해봐야겠다.

정말 오랜만의 블로그 글이다. 블로그를 꾸미기가 넘 힘들어서 부셔버리고 새 사이트를 만들어볼까 고민중이다. 하지만 둘다 귀찮은건 매한가지다. ㅋㅋㅋ 새학기가 시작되었으니 다시 블로그를 관리해보도록 하겠다.

Leave a comment

2024

D&C Optimization

3 minute read

분할정복을 이용한 다이나믹 프로그래밍 최적화

Back to top ↑

2023

Back to top ↑

2022

Greedy

2 minute read

백준 18186번 라면사기(large) 문제풀이

SCC

2 minute read

백준 4196번 도미노 문제풀이

LCA

2 minute read

백준 3176번 도로 네트워크 문제풀이

2-SAT

2 minute read

백준 16367번 TV Show Game 문제풀이

Hashing

2 minute read

백준 21162번 뒤집기 K 문제풀이

Tree DP

1 minute read

백준 1949번 우수 마을 문제풀이

Trie

1 minute read

Trie 자료구조 이해하기

Merge Sort

1 minute read

merge sort를 이용하여 inversion 개수세기

Segment Tree

2 minute read

백준 11505 구간 곱 구하기 문제풀이

BFS

1 minute read

백준 2206 벽 부수고 이동하기 문제풀이

기하

1 minute read

백준 2166 다각형의 면적 문제풀이

이분탐색

1 minute read

백준 12015 가장 긴 증가하는 부분 수열2 문제풀이

누적 합

1 minute read

백준 10986 나머지합 문제풀이

Stack

1 minute read

스택 구현하기 ========== 자료구조의 기본이라고 하면 스택 과 큐가 있다 백준 10828번에서 마주친 스택

정렬1

1 minute read

매우매우 많은 정렬이 있지만 그중 가장 안 어려운 3가지를 공부해보았다.

Back to top ↑