(→match) |
(→match) |
||
202번째 줄: | 202번째 줄: | ||
5=>println!("{}는 5입니다.",a) | 5=>println!("{}는 5입니다.",a) | ||
_=>println!("{}는 5가 아닙니다.",a), | _=>println!("{}는 5가 아닙니다.",a), | ||
} | |||
} | |||
</source> | |||
이런 것외에도 다양한 방법으로 사용할 수 있습니다. | |||
<source lang="rust"> | |||
use std::io::{self, Read,Write}; | |||
struct Console{ | |||
} | |||
impl Console{ | |||
fn get<T:Sized + std::str::FromStr>()->Option<T>{ | |||
let mut stdout = io::stdout(); | |||
stdout.flush(); | |||
let input = { | |||
let mut stdin = io::stdin(); | |||
let mut input = String::new(); | |||
stdin.read_line(&mut input); | |||
input | |||
}; | |||
let v:T =match input.trim().parse::<T>(){ | |||
Err( e )=>{ | |||
println!("{}",input); | |||
stdout.flush(); | |||
return None; | |||
}, | |||
Ok(v)=>v | |||
}; | |||
return Some(v); | |||
} | |||
} | |||
fn main() { | |||
print!("숫자를 입력하세요>>"); | |||
let a = Console::get::<i32>().unwrap(); | |||
match a{ | |||
1=>println!("{}는 1입니다.",a), | |||
3|6|9=>println!("{}는 3,6,9 중에 하나입니다.",a), | |||
0...10=>println!("0<= {} <= 9입니다.",a), | |||
10...100 if a % 2 == 0=>println!("{}는 10보다 크거나 같고 100보다 작은 짝수입니다.",a), | |||
_ if a >= 100=>println!("{}는 100보다 크거나 같은 수입니다.",a), | |||
_=>{}, | |||
} | } | ||
} | } |
2017년 7월 21일 (금) 10:27 판
개발환경 만들기
러스트 공식 홈페이지에 접속하여 컴파일러를 설치합니다
Hello, world!
프로젝트 만들기
Rust의 경우 기본적인 프로젝트와 라이브러리관리를 Cargo라는 것으로 관리합니다.
윈도우의 경우
에서 Rust (버전) shell을 실행합니다.
리눅스의 경우
터미널을 열니다.
명령어 입력
그리고 열린 터미널/CMD에 다음과 같이 입력합니다.
cargo new (프로젝트 이름) --bin
그러면 연재 터미널/CMD에서 열린 폴더에 프로젝트 이름으로 된 폴더가 생기며, 안에 Rust의 Hello, world를 출력하는 코드파일과 cargo 프로젝트 속성 파일이 생깁니다.
컴파일하기
cargo run
을 할경우 컴파일 한 후, 컴파일 된 프로그램을 실행합니다.
코드 보기
소스파일은 해당 프로젝트 폴더의 src/main.rs에 있습니다. 관습적으로, 러스트는 .rs 확장자를 사용합니다.
fn main() {
println!("Hello, world!");
}
코드 해석
fn main()
은 main이라는 이름의 함수를 선언한다는 문장입니다. fn이 main이라는 것이 함수라는 것을 알려 줍니다. 그 다음의 ()은 main이라는 함수는 매개변수(더 자세한 설명은 다음에...)을 받지 않는 다는 뜻입니다. 그 다음 {}(중괄호)사이에 있는 내용이, main함수가 하는 일이 됩니다.
println!("hello, world!");
은 도스창(터미널)에 "hello, world!"라는 텍스트를 출력합니다.
변수 선언하기
변수(variable)란 프로그래머가 수정할 수 있는 메모리 공간을 말합니다. 실생활에 비유하자면 컵이나 상자에 비유할 수 있습니다. 컵과 상자에는 음료수나 물건을 집어 넣어 보관할 수 있습니다. 변수또한 프로그램안에서 음료수나 물건과 비슷한 데이터(값)을 집어 넣고 보관할 수 있습니다.
Rust에서 변수는 다음과 같이 선언이 가능합니다.
let 변수이름:데이터형 = 데이터(값);
예를 들면 사람의 나이를 저장하는 변수를 만든다고 하면
let age = 17;
이렇게 하면 됩니다. 이 중 :데이터형은 데이터(값)의 데이터형이 명확하다면 생략할 수 있습니다.
변수는 기본적으로 수정이 금지
한번 선언된 변수는 기본적으로 다른 값으로 바꾸는 것이 안됩니다. 따라서 다음과 같은 코드는 컴파일중에 에러가 납니다.
fn main() {
let a = 5;
println!("{}", a);
a = a + 5;
println!("{}", a);
}
어떻게 값을 수정할까?
Rust에서는 다른 값으로 바꿀 변수는 mut이라는 키워드를 사용해야 합니다.
fn main() {
let mut a = 5;
println!("{}", a);
a = a + 5;
println!("{}", a);
}
다른 방법으로는 변수의 재정의가 있습니다. 이럴 경우 다른 값을 지니면서도, mut키워드를 사용하지 않을 수 있습니다.
fn main() {
let a = 5;
println!("{}", a);
let a = a + 5;
println!("{}", a);
}
이 경우 위의 a와 아래의 a는 전혀 다른 변수가 됩니다. 이에 대한 차이점은 나중에 설명하겠습니다.
데이터형
데이터형이란, 그 자료를 어떤 표현으로 얼마나의 크기로 저장할지에 대한 표현입니다. 같은 뜻이라고 한글과 영어로 적으면 단어 길이가 다르 듯이, 같은 값이라도 그 길이가 다를 수 있습니다.
Rust는 아주 실용적인 언어로서 데이터형에 변수의 크기를 유추할 수 있습니다.
정수형(integer)
정수형이란, 간단히 소수점 이하가 없는 데이터라고 생각하면 됩니다. Rust의 정수형 데이터형은 다음과 같습니다.
- u8
- i8
- u16
- i16
- u32
- i32
- i64
- u64
- usize
u는 부호없는(unsigned)의 약자이고 i는 정수(integer)의 약자입니다. 뒤의 있는 수는 해당 데이터형의 크기를 말합니다. u8이면 부호없는(unsigned) 8비트 크기의 데이터형입니다.
실수형(float)
실수형, 더 정확히는 부동소숫점형은 소수점 이하를 표현할 수 있는 데이터라고 생각하면 됩니다. Rust의 실수형 데이터형은 다음과 같습니다.
- f32
- f64
f는 부동(浮動, 움직이는)소수점(float)의 약자입니다.
기타
- bool
- bool은 boolean이라 하여, 참(true)와 거짓(false)를 표현할 수 있는 데이터입니다.
- &str
- &str은 수정할 수 없는 문자열을 가리키는 포인터입니다.
- string
- string은 수정할 수 있는 문자열입니다.
연산자
산술연산자
논리연산자
제어문
제어문이란 프로그램의 실행 중에 어떤 코드를 반복하거나 조건에 따라 실행하거나 실행하지 않도록 하는 구문입니다.
if
if은 조건문으로 조건에 따라 어떤 코드를 실행할 지를 결정할 수 있습니다.
use std::io::{self, Read,Write};
struct Console{
}
impl Console{
fn get<T:Sized + std::str::FromStr>()->Option<T>{
let mut stdout = io::stdout();
stdout.flush();
let input = {
let mut stdin = io::stdin();
let mut input = String::new();
stdin.read_line(&mut input);
input
};
let v:T =match input.trim().parse::<T>(){
Err( e )=>{
println!("{}",input);
stdout.flush();
return None;
},
Ok(v)=>v
};
return Some(v);
}
}
fn main() {
print!("숫자를 입력하세요>>");
let a = Console::get::<i32>().unwrap();
if a != 5{
println!("{}는 5가 아닙니다.",a);
}
else{
println!("{}는 5입니다.",a);
}
}
이렇게 할 경우, 콘솔에서 입력받은 값이 5가 아닐 경우 if { ... }가 실행되고, 그렇지 않을 경우에는 else{ ...}사이의 문장이 실행됩니다.
match
match문은 Rust의 자랑 중 하나로 정말 강력한 조건문입니다. 앞의 if문을 match문으로 바꾸면 다음과 같습니다.
use std::io::{self, Read,Write};
struct Console{
}
impl Console{
fn get<T:Sized + std::str::FromStr>()->Option<T>{
let mut stdout = io::stdout();
stdout.flush();
let input = {
let mut stdin = io::stdin();
let mut input = String::new();
stdin.read_line(&mut input);
input
};
let v:T =match input.trim().parse::<T>(){
Err( e )=>{
println!("{}",input);
stdout.flush();
return None;
},
Ok(v)=>v
};
return Some(v);
}
}
fn main() {
print!("숫자를 입력하세요>>");
let a = Console::get::<i32>().unwrap();
match a{
5=>println!("{}는 5입니다.",a)
_=>println!("{}는 5가 아닙니다.",a),
}
}
이런 것외에도 다양한 방법으로 사용할 수 있습니다.
use std::io::{self, Read,Write};
struct Console{
}
impl Console{
fn get<T:Sized + std::str::FromStr>()->Option<T>{
let mut stdout = io::stdout();
stdout.flush();
let input = {
let mut stdin = io::stdin();
let mut input = String::new();
stdin.read_line(&mut input);
input
};
let v:T =match input.trim().parse::<T>(){
Err( e )=>{
println!("{}",input);
stdout.flush();
return None;
},
Ok(v)=>v
};
return Some(v);
}
}
fn main() {
print!("숫자를 입력하세요>>");
let a = Console::get::<i32>().unwrap();
match a{
1=>println!("{}는 1입니다.",a),
3|6|9=>println!("{}는 3,6,9 중에 하나입니다.",a),
0...10=>println!("0<= {} <= 9입니다.",a),
10...100 if a % 2 == 0=>println!("{}는 10보다 크거나 같고 100보다 작은 짝수입니다.",a),
_ if a >= 100=>println!("{}는 100보다 크거나 같은 수입니다.",a),
_=>{},
}
}