잔글 →Trait와 오버로딩: 예제 살짝 수정 |
태그: 모바일 편집 모바일 웹 편집 |
||
| (사용자 2명의 중간 판 10개는 보이지 않습니다) | |||
| 48번째 줄: | 48번째 줄: | ||
* let mut: 완전히 자유로운 변경이 가능한 변수 선언. 이런 변수에 RAM 메모리 관련 기능을 넣는 것은 unsafe한 경우가 있다. | * let mut: 완전히 자유로운 변경이 가능한 변수 선언. 이런 변수에 RAM 메모리 관련 기능을 넣는 것은 unsafe한 경우가 있다. | ||
mut 접두어는 변수를 다루는 데에 높은 자유도를 보장하지만, Rust의 개발 배경이기도 한 C언어 등의 기존 시스템 프로그래밍용 언어의 환장할 수준의 메모리 관리 난이도를 Rust에도 가져오는 모순적인 문제로 인해 가급적 덜 쓰는 것을 권장한다. 특히 | mut 접두어는 변수를 다루는 데에 높은 자유도를 보장하지만, Rust의 개발 배경이기도 한 C언어 등의 기존 시스템 프로그래밍용 언어의 환장할 수준의 메모리 관리 난이도를 Rust에도 가져오는 모순적인 문제로 인해 가급적 덜 쓰는 것을 권장한다. 특히 RAM에서 동적으로 메모리 영역을 가져오는 Trait를 쓴다면 mut를 최대한 안 쓰려고 하는 것이 매우 중요하다. | ||
사칙연산과 나머지는 C와 동일하게 +, -, *, /, %이다. 또 연산 후 이동인 +=, -=, *=, /=, %=도 있으나, C언어의 1 증감 연산자인 ++, --는 없다. 소괄호 (, ) 안에 연산식을 넣어서 복잡한 연산의 우선 순위를 끌어올릴 수 있다. | 사칙연산과 나머지는 C와 동일하게 +, -, *, /, %이다. 또 연산 후 이동인 +=, -=, *=, /=, %=도 있으나, C언어의 1 증감 연산자인 ++, --는 없다. 소괄호 (, ) 안에 연산식을 넣어서 복잡한 연산의 우선 순위를 끌어올릴 수 있다. | ||
| 201번째 줄: | 201번째 줄: | ||
=== 번외: Closure === | === 번외: Closure === | ||
Closure는 일회용 함수로 람다 표현식 역할을 한다. 다음과 같이 쓴다. | Closure는 일회용 함수로 람다 표현식 같은 곳에 사용하기 좋게 함수의 맥락이 되는 코드 자체를 변수에 저장하는 역할을 한다. 다음과 같이 쓴다. | ||
<syntaxhighlight lang="rust"> | <syntaxhighlight lang="rust"> | ||
let closure1 = | param1:i32 | -> i32 { param1 + 42 }; | let closure1 = | param1:i32 | -> i32 { param1 + 42 }; | ||
| 288번째 줄: | 288번째 줄: | ||
=== enum과 match와의 결합으로 모나드 구현 === | === enum과 match와의 결합으로 모나드 구현 === | ||
enum으로 정의한 열거형에 match를 사용하는 메서드를 정의하고, 그 메서드 내 match 내에 명시된 조건에 따르는 동작들이 enum으로 정의된 열거형 내 값을 반환하는 행위에서 벗어나지 않으면 모나드 개념에 따라 연쇄적으로 열거형의 해당 메서드를 호출하며 프로그래밍할 수 있다. | enum으로 정의한 열거형에 match를 사용하는 메서드를 정의하고, 그 메서드 내 match 내에 명시된 조건에 따르는 동작들이 enum으로 정의된 열거형 내 값을 반환하는 행위에서 벗어나지 않으면 모나드 개념에 따라 연쇄적으로 열거형의 해당 메서드를 호출하며 프로그래밍할 수 있다. | ||
let이 let mut와 다른 부분이 이렇게 변수를 하나 두고 값을 끊임없이 조작하는 것이 아니라, 함수를 연쇄적으로 체이닝할 것을 강요하는 함수형 프로그래밍을 해야 쉽게 적응한다는 부분이다. 절차 지향적으로 프로그램을 짜던 보통의 C 프로그래밍에서 Rust로 넘어가려다 막히는 부분이 이곳이다. 하지만 시스템 프로그래밍에서 변수와 참조의 유효성이 중요하며, 변수와 참조에 대해 최대한 그 개수를 줄이면서 한번 대입한 변수는 다시 쓰려는 생각을 하지 않으려면 가장 좋은 방법은 메서드를 연쇄적으로 사용하는 메서드 체이닝을 통한 Rust의 함수형 프로그래밍 기법에 적응하는 것이다. 병렬 처리를 통한 성능 향상에도 함수형 프로그래밍이 강한 편이라 이왕 입문할 거 Haskell에 비하면 훨씬 양반인 Rust로 시스템 프로그래밍이 필요할 때 함수형 프로그래밍을 하는 것이 낫다. | |||
== 예외 처리 == | == 예외 처리 == | ||
| 303번째 줄: | 305번째 줄: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
== Trait와 | == Trait와 오버라이딩 == | ||
Trait는 부분적인 다형성을 구현한 Rust만 가지고 있는 객체 개념으로 일반적인 OOP(객체 지향 프로그래밍) 방식을 따르지 않고 구조체에 한정적인 다형성을 부여하기 위해 도입되었다. 즉 공통적인 메서드를 구조체마다 부여하는 역할을 한다. | Trait는 부분적인 다형성을 구현한 Rust만 가지고 있는 객체 개념으로 일반적인 OOP(객체 지향 프로그래밍) 방식을 따르지 않고 구조체에 한정적인 다형성을 부여하기 위해 도입되었다. 즉 공통적인 메서드를 구조체마다 부여하는 역할을 한다. | ||
Trait는 제네릭처럼 변수의 타입에 구애받지 않아 | Trait는 제네릭처럼 변수의 타입에 구애받지 않아 오버라이딩을 구현하는 또 다른 방법이 된다. 다만 가능한 데이터 타입에 대한 구현을 모두 메모리 한 곳에 직접 올리는 제네릭과 달리 Trait는 구조체에 함수 포인터를 간접적으로 가져오는 특성 때문에 성능 쪽에서 아주 작은 수준이라도 패널티가 있다. 보통 다음과 같이 트레이트를 정의하고 부여한다. | ||
<syntaxhighlight lang="rust"> | <syntaxhighlight lang="rust"> | ||
| 340번째 줄: | 342번째 줄: | ||
} | } | ||
fn notify<T: Account>(item: T) { // 제네릭 변수처럼 Account Trait가 적용된 구조체라면 전부 item으로 집어넣는 | fn notify<T: Account>(item: T) { // 제네릭 변수처럼 Account Trait가 적용된 구조체라면 전부 item으로 집어넣는 오버라이딩 된다. | ||
println!("Welcome {}", item.get_username()); | println!("Welcome {}", item.get_username()); | ||
} | } | ||
| 354번째 줄: | 356번째 줄: | ||
== 모듈을 사용한 코드 분할 == | == 모듈을 사용한 코드 분할 == | ||
<code>mod (모듈 네임) {...}</code>로 파일 내 mod 스코프({...} 내부) 또는 파일 바깥으로 내보낼 기능들을 선언하고 묶을 수 있다. 이때 내보낼 모듈 내 요소(함수, Trait 등)들은 'pub'를 앞에 붙여줘야 한다. 단순히 mod (모듈 이름);으로만 선언한 경우 해당 모듈이 다른 파일에 있다고 가정하고 해당 모듈을 파일 내로 복붙한다. | |||
모듈은 use (crate)::(모듈 이름)::(하위 모듈 이름)::... 이런 식으로 개별 기능을 가져와 단축된 형태의 호출을 할 수 있다. | |||
== 패키지에서 Crate 가져오기, 네임스페이스 == | == 패키지에서 Crate 가져오기, 네임스페이스 == | ||
=== 주요 Crate === | === 주요 Crate === | ||
* std : 기본적인 기능 라이브러리. 파일 작업 담당 fs, 화면이나 파일 등 입출력 전반을 담당하는 io 등 | * std : 기본적인 기능 라이브러리. 파일 작업 담당 fs, 화면이나 파일 등 입출력 전반을 담당하는 io, 시스템 시간 관련 기능인 time, 멀티스레딩 기능을 가지는 thread 등 다양한 모듈이 있으며 [https://doc.rust-lang.org/std/index.html 여기]서 전체 기능 일람을 볼 수 있다. | ||
* num : 실수 외에 복소수 연산 같은 것도 지원한다. | * num : 실수 외에 복소수 연산 같은 것도 지원한다. | ||
* regex: [[정규 표현식]] 라이브러리 | * regex: [[정규 표현식]] 라이브러리 | ||
* rand: 임의의 숫자를 뽑는 Random Value 관련 기능 | * rand: 임의의 숫자를 뽑는 Random Value 관련 기능 | ||
* | * | ||
== 그 외 == | == 그 외 == | ||
* <code>#[allow(...)]</code> | * <code>#[allow(...)]</code> 문법을 함수 앞에 붙이는 등의 작업으로 특정 기능 구현의 컴파일 시의 경고 완화가 가능하다. unused_variables(사용하지 않고 선언만 된 변수가 있는 경우), dead_code(구현 안 된 부분) 등을 지정 가능하다. 반대로 경고 필수를 지정하려면 <code>#[warn(...)]</code>을 쓴다. | ||
* 전역 변수를 바꾸는 것은 Rust가 보통은 권장하지 않으며, unsafe {...} 안에서 변수 수정 작업을 하게 한다. | * 멀티스레딩 환경 등의 상황에서 전역 변수를 바꾸는 것은 Rust가 보통은 권장하지 않으며, unsafe {...} 안에서 변수 수정 작업을 하게 한다. | ||
[[분류:IT]][[분류:프로그래밍 언어]] | |||