관리 메뉴

밤 늦게까지 여는 카페

[rust 공식 문서 14일 공부] 4일차 본문

For Fun

[rust 공식 문서 14일 공부] 4일차

Jㅐ둥이 2024. 12. 10. 01:55
반응형

4.2. References and Borrowing

3일차에 공부했던 ownership은 안전하고 효율적인 프로그램을 개발할 수 있도록 도와주지만

매번 ownership을 이동시켜줘야 하고, 변수를 재사용할 수 없다는 불편함을 줍니다.

 

이를 개선하기 위해서 rust에는 reference와 borrowing이 있습니다.

 

reference라고 하면 pointer를 생각하시겠지만 rust의 reference는 "안전"합니다.

 

기본적으로 rust의 reference는 immutable합니다. 수정이 불가능한 것이죠.

이를 수정 가능하게 사용하려면 mut 키워드를 사용해야 합니다.

reference를 수정하려면 mut 키워드를 사용해야 한다는 컴파일 에러 메시지

 

위의 예시의 컴파일 에러를 해결하기 위해서는 1) 변수 s가 mutable 해야 하고, 2) change 함수의 파라미터도 mutable 해야 합니다.

조치를 취한 예시는 다음과 같습니다.

컴파일 에러를 해결한 이후

 

사실 mutable, immutable 이외에도 reference의 안전 장치가 더 있습니다.

 

바로 mutable 한 reference는 한 scope에 하나만 존재할 수 있는 것이죠.

저는 이게 reference의 안전에 가장 큰 기여를 하고 있다고 생각합니다.

 

다음과 같이 변수 s의 mutable한 reference를 하나의 scope에 2개 이상 만들면 바로 컴파일 에러가 발생합니다!

컴파일 단계에서 잡히는 2개 이상의 mutable reference

 

이와 비슷하게 immutable한 reference가 있는데 mutable한 reference를 선언하는 것도 컴파일 에러가 발생합니다.

  • immutable한 reference가 immutable하다는 것을 보장할 수 없기 때문이죠!

mutable, immutable reference가 동시에 존재할 수 없다는 컴파일 에러

 

4.3. The Slice Type

ownership, reference 공부하다가 갑자기 slice 타입이 나와서 갸우뚱 했습니다만

slice(array)는 여러 개의 값을 저장하기 위해 메모리 관리를 도와주는 객체이기에 일종의 reference다 라는 설명에 납득이 되었습니다.

 

공식 문서에서는 주어진 문자열에서 띄어쓰기(' ')가 처음으로 나오기 전까지의 문자열의 길이를 찾는 문제를 예시로 듭니다.

단순하게 주어진 문자열의 문자들을 앞에서부터 하나씩 보면서 ' '가 나올 때까지 반복문을 돌면 됩니다.

 

하지만 이렇게 끝날 문제였으면 ownership 챕터에서 다루지 않았겠죠?

rust에서는 해당 길이의 유효성을 고려할 수 있습니다.

 

만약에 위에서 구한 문자열의 길이가 틀리면 안되는 SW라면 어떨까요? 문자열 파싱 프로그램이 좋은 예시가 될 수 있겠네요.

이제는 주어진 문자열이 수정되었는지를 정확히 추적할 수 있는지가 주요 관심사가 됩니다.

이를 추적하지 못하면 결국 문자열의 길이를 잘못 계산하게 되기 때문이죠.

 

이런 측면에서 ownership을 관리해주는 rust는 개발자에게 강력한 안정감을 줄 수 있습니다. reference를 활용하는 것이죠!

 

주어진 문자열에서 ' '가 처음으로 나오기 전까지의 문자열의 길이를 반환하는 대신

' '가 나오기 전까지의 부분 문자열을 반환하는 함수 first_word가 있습니다.

 

이 함수를 통해 얻은 word를 이용해서 문자열의 길이를 계산하면

다음과 같이 컴파일 단계에서 원래 문자열의 유효성 여부를 확인할 수 있습니다.

  • 정확히는 원래 문자열의 변경을 막는 것이긴 합니다만...!

 

공식 문서에서는 어차피 ownership이 rust 전반적으로 다뤄지는 내용이기 때문에 일단 여기까지 마치고 다음 내용인 Struct로 넘어갑니다.

5. Using Structs to Structure Related Data

객체 지향 언어에 익숙하신 분이라면 rust의 struct 사용 방법이 궁금하셨을 겁니다.

소프트웨어의 요구사항을 관리하기 위해서는 struct를 정의하는 것이 효율적이기 때문이죠.

 

rust에서 struct를 어떻게 다루는지 알아보겠습니다.


진도를 별로 못 나간 것 같은데 벌써 시간이 이렇게 되어버렸네요 ㅎㄷㄷ

오늘은 여기까지로 마쳐보겠습니다.

반응형