Penflip

Penflip - Write better with others

  • Loading...
  • Discover Projects
  • Help
  • Signup
  • Login
  • Welcome back!
    No account? Signup Close
    Ready to write better?
    Have an account? Login Close

sarojaba · Rust Doc Korean

Make Changes
46

5.1. 변수 바인딩 (Variable Bindings) - 100%

사실상 모든 'Hello World’가 아닌 Rust 프로그램은 변수 바인딩을 사용합니다. 다음을 보세요.

fn main() {
    let x = 5;
}

각 예제마다 fn main() {을 넣는것은 쫌 귀찮기 때문에 이후로는 생략할 것입니다. 특별한 언급이 없다면, main() 함수를 수정하시면 됩니다. 그렇지 않는다면, 에러가 날 것입니다.

이것은 많은 언어들에서, 변수(variable)라고 합니다. 그렇지만 Rust의 변수 바인딩은 몇가지 꼼수를 가지고 있습니다. 예를 들어, 변수 이름뿐만 아니라 let 식이 ‘패턴’의 왼쪽에 올 수 있습니다. 다음과 같이 할 수 있다는 뜻입니다.

let (x, y) = (1, 2);

이 식이 평가되고 나면, x는 1이 되고, y는 2가 됩니다. 패턴은 진짜로 강력하고, 이 책에선 자체 섹션도 있습니다. 우리는 아직 이 기능이 필요하지 않기 때문에, 진도를 나아가기 위해 마음 한구석에만 잘 담아둡시다.

Rust는 정적 타입 언어입니다. 그 말은 앞에 타입을 명시해줘야 한다는 것을 의미하고, 컴파일중에 검증됩니다. 하지만 왜 첫번째 예제는 컴파일 될까요? 흠, Rust는 ‘타입 추론(type inference)’ 이라고 하는 기능을 가지고 있습니다. 무언가의 타입을 알아낼 수 있다면, Rust는 타입을 주는 것을 필요로 하지 않습니다.

우리는 원한다면 타입을 추가할 수 있습니다. 타입은 콜론(:) 뒤에 옵니다.

let x: i32 = 5;

제가 여러분께 교실의 다른 친구들에게 큰 소리로 읽어달라고 한다면, "x는 i32 타입과 five 값에 바인딩되었다."라고 할 것입니다.

이 경우, x를 32 비트 부호있는 정수로 선택했습니다. Rust는 서로 다른 많은 기본 정수 타입을 가지고 있습니다. 부호있는 정수는 i로, 부호없는 정수는 u로 시작합니다. 가능한 정수 크기는 8, 16, 32, 64 비트입니다.

이후 예제부터, 타입에 대해 주석을 달지도 모르겠네요. 이렇게요.

fn main() {
    let x = 5; // x: i32
}

이 주석이 문법과 유사한 것은 let과 함께 쓰인다는 정도입니다. 이런 식의 주석을 포함하는 것은 관용적인 Rust 언어는 아니지만, 어떤 타입이 추론되었는지 이해하기 쉽게 해줍니다.

기본적으로, 바인딩은 불변(immutable) 입니다. 이 코드는 컴파일 안됩니다.

let x = 5;
x = 10;

이런 에러를 토해낼 겁니다.

error: re-assignment of immutable variable `x`
     x = 10;
     ^~~~~~~

변할수 있도록 바인딩하길 원한다면, mut를 사용하면 됩니다.

let mut x = 5; // mut x: i32
x = 10;

바인딩이 기본적으로 불변인 것이 하나의 이유만 있는것은 아니지만, 우리는 Rust의 기본적인 관점중 하나에 대해 생각해볼 수 있습니다. 바로 안전성이죠. 만약 mut라고 적는 것을 까먹었다면, 컴파일러는 알아챌 것이고, 여러분이 바꿀 의도가 없었는데 무언갈 바꾸려고 했다고 알려줍니다. 바인딩이 기본적으로 변경 허용이었다면, 컴파일러는 이를 알려줄 수가 없을 것입니다. 여러분이 정말 변경을 의도한다면, 방법은 간단합니다. mut를 적으세요.

다른 좋은 이유는 가능한 변경되는 상태를 피할수 있다는 것이지만, 이 문서의 범위를 벗어나는 내용입니다. 일반적으로, Rust에서는 노골적인 변경을 피하는 것이 더 선호됩니다. 때때로 이 말은, 변경은 필요로 할때만, 그래서 그래서 금지하지는 않습니다.

이제 다시 바인딩으로 돌아가봅시다. Rust의 변수 바인딩은 다른 언어와는 하나 이상의 차이점을 가지고 있습니다. 바인딩은 여러분이 그것을 사용하기 전에 값과 함께 초기화되어야 합니다.

한번 해봅시다. src/main.rs 파일을 다음처럼 수정해 보세요.

fn main() {
    let x: i32;

    println!("Hello world!");
}

빌드하기 위해 커맨드 라인에서 cargo build를 할 수 있습니다. 경고가 표시되겠지만, 여전히 "Hello, world!"를 출력할 것입니다.

   Compiling hello_world v0.0.1 (file:///home/you/projects/hello_world)
src/main.rs:2:9: 2:10 warning: unused variable: `x`, #[warn(unused_variable)] on by default
src/main.rs:2     let x: i32;
                      ^

Rust는 변수 바인딩을 하지 않았다고 경고를 합니다만, 우리는 그것을 사용하지 않기 때문에, 해롭지도, 잘못되지도 않았습니다. 그러나 x를 사용한다면 상황이 다릅니다. 한번 해보죠. 다음과 같이 프로그램을 수정해보세요.

fn main() {
    let x: i32;

    println!("The value of x is: {}", x);
}

그리고 빌드를 시도하면 에러가 표시될 것입니다.

$ cargo build
   Compiling hello_world v0.0.1 (file:///home/you/projects/hello_world)
src/main.rs:4:39: 4:40 error: use of possibly uninitialized variable: `x`
src/main.rs:4     println!("The value of x is: {}", x);
                                                    ^
note: in expansion of format_args!
<std macros>:2:23: 2:77 note: expansion site
<std macros>:1:1: 3:2 note: in expansion of println!
src/main.rs:4:5: 4:42 note: expansion site
error: aborting due to previous error
Could not compile `hello_world`.

Rust는 초기화되지 않은 값을 사용하는 것을 허용하지 않습니다. 다음으로, println!에서 발생한 일에 대해 다뤄봅시다.

출력할 문자열에 두 개의 중괄호({}, 콧수염(moustaches)이라고 부르기도 합니다.)가 포함되어 있다면, Rust는 어떤 종류의 값을 삽입하라는 요청으로 해석할 것입니다. 문자열 삽입(String interpolation)은 컴퓨터 과학 용어로 "문자열 중간에 붙히다(stick in the middle of a string)."라는 의미입니다. 쉼표 뒤의, x는, 삽입할 값을 가리킵니다. 복수개의 인자를 넘긴다면, 쉼표는 함수와 매크로에 넘기는 인자를 구분하는데 쓰입니다.

중괄호를 사용하면, 러스트는 그것의 타입을 확인해서 값을 명확히 드러내도록 해줄 것입니다. 하지만 만약 더 구체적인 정보를 명시하고 싶으면, 많은 종류의 옵션이 존재합니다. 정수는 그다지 복잡하게 출력되지 않기 때문에, 지금부터는 그냥 기본값으로 가도록 하죠:

Updated by djKooks about 3 years (view history)
5. 문법과 의미 (Syntax and Semantics) - 100% 5.2. 함수 (Functions) - 100%

Contents

    Rust 문서 한글화 프로젝트 1. 소개(Introduction) - 1.10.0 2. 시작하기(Getting Started) - 20% 3. Rust 배우기 (Learn Rust) - 100% 3.1. 추리 게임 (Guessing Game) - 100% 3.2. 식사하는 철학자들 (Dining Philosophers) - 100% 3.3. 다른 언어에 Rust 포함하기 (Rust Inside Other Languages) - 100% 4. 효과적인 Rust (Effective Rust) - 100% 4.1. 스택과 힙 (The Stack and the Heap) - 100% 4.2. 테스팅 (Testing) - 100% 4.3. 조건부 컴파일 (Conditional Compilation) - 70% 4.4. 문서화 (Documentation) - 20% 4.5. 반복자 (Iterators) - 100% 4.6. 동시성 (Concurrency) - 90% 4.7. 오류 처리 (Error Handling) - 4% 4.8. Choosing your Guarantees - 0% 4.9. 외부 함수 인터페이스 (Foreign Function Interface) - 50% 4.9. Borrow 와 AsRef 4.11. 배포 채널 (Release Channels) - 100% 5. 문법과 의미 (Syntax and Semantics) - 100% 5.1. 변수 바인딩 (Variable Bindings) - 100% 5.2. 함수 (Functions) - 100% 5.3. 기본형 (Primitive Types) - 100% 5.4. 주석 (Comments) - 100% 5.5. 조건식 (if) - 100% 5.6. 반복 (Loops) - 100% 5.7. 소유권 (Ownership) - 100% 5.8. 참조와 빌림 (References and Borrowing) - 100% 5.9. 수명 (Lifetimes) - 100% 5.10. 가변성 (Mutability) - 100% 5.11. 구조체 (Structs) - 100% 5.12. 열거형 (Enums) - 100% 5.13. 정합 (Match) - 100% 5.14. 패턴 (Patterns) - 80% 5.15. 메소드 문법 (Method Syntax) - 100% 5.16. 벡터 (Vectors) - 100% 5.17. 문자열(Strings) - 100% 5.18. 제너릭 (Generics) - 100% 5.19. 트레잇 (Traits) - 100% 5.20. 드랍 (Drop) - 100% 5.21. if let - 100% 5.22. 트레잇 객체 (Trait Objects) - 75% 5.23. 클로저 (Closures) - 10% 5.24. 전역 함수 사용법 (Universal Function Call Syntax) - 0% 5.25. 크레이트들과(Crate) 모듈들(Module) - 0% 9. 용어 색인 (Concordance) Show all
    Discussions 5 Pending changes 5 Contributors
    Download Share

    Download

    Working...

    Downloading...

    Downloaded!

    Download more

    Error!

    Your download couldn't be processed. Check for abnormalities and incorrect syntax. We've been notified of the issue.

    Back

    Download PDF Download ePub Download HTML Download Word doc Download text Download source (archive)

    Close
667 Words
3,709 Characters

Share

Collaborators make changes on their own versions, and all changes will be approved before merged into the main version.

Close

Penflip is made by Loren Burton
in Los Angeles, California

Tweet

    About

  • Team
  • Pricing
  • Our Story

    Quick Start

  • Markdown
  • Penflip Basics
  • Working Offline

    Support

  • Help
  • Feedback
  • Terms & Privacy

    Connect

  • Email
  • Twitter