조무위키
조무위키
둘러보기
대문
최근 바뀜
임의의 문서로
미디어위키 도움말
도구
여기를 가리키는 문서
가리키는 글의 최근 바뀜
특수 문서 목록
문서 정보
행위
문서
토론
편집
역사 보기
러스트(프로그래밍 언어)
편집하기 (부분)
경고:
로그인하지 않았습니다. 편집을 하면 IP 주소가 공개되게 됩니다.
로그인
하거나
계정을 생성하면
편집자가 사용자 이름으로 기록되고, 다른 장점도 있습니다.
스팸 방지 검사입니다. 이것을 입력하지
마세요
!
=== 안전성 === 안전성이 가장 큰 특징이며 안전성을 위해 다음과 같은 특징을 가진다. 먼저 변수 선언을 할 때 let이라는 키워드를 쓰는데 이건 불변변수다. 가변변수로 바꾸려면 let mut 다음에 변수명을 써야한다. <source lang="rust"> let x = 42; let mut y = 42; x = 10; // 에러다. y = 10; // 에러가 아니다. </source> 변수가 불변인데 왜 상수가 아니라 변수로 부르냐면 값이 메모리에 저장되기 때문이다. 굳이 이렇게까지 하는 이유는 당연히 안전성 때문인데 let으로만 선언한 x는 불변이므로 이것이 어떻게 변하는지 신경 않쓰고 로직을 짤 수 있다. 두 번째로는 소유권 개념이 있다. 소유권 이동은 타입이 Copy 특성이 없으면 발생한다. 변수는 소유권을 가지며 대입하는 순간 소유권이 이전된다는 것이다. <source lang="rust"> struct A(i32); // Copy 특성이 없는 튜플 구조체 fn main() { let x = 100; // 정수형은 Copy 특성이 있음. let y = x; // 소유권 이동 없이 복사해서 줌. let z = x; // 에러가 아니다. Copy 특성을 가진 타입은 소유권을 절대 안준다. let a = A(200); // Copy 특성이 없는 구조체. let b = a; // 소유권이 a에서 b로 이동. let c = a; // 에러! a는 줄 소유권이 없음. } </source> 소유권이 이동하는 상황은 대입할 때, 함수에 인자로 넘길 때, 피연산자가 될 때 등등 변수가 이름 그대로 사용되는 모든 상황이다. <source lang="rust"> fn main() { let a = String::from("A"); // String타입은 Copy 특성이 없다. a; // a의 소유권이 이동한다. 소유권을 받을 변수가 없으니 값의 주인이 없어진다. // 이제부터 a는 소유권이 없어 사용 불가. let b = String::from("B"); let x = std::ops::Add::add(b, "2"); // b의 소유권이 add 함수로 넘겨진다. // 이제부터 b는 소유권이 없어 사용 불가. let c = String::from("C"); let y = c + "3"; // 위와 마찬가지로 c의 소유권이 더하기연산자함수로 넘겨진다. // 이제부터 c는 소유권이 없어 사용 불가. } </source> 소유권 개념을 요약하면 1. 메모리에 있는 값은 주인을 하나만 가진다. 2. 이름으로 표현되는 변수만이 주인이 된다. 주인 없는 값은 버려진다. 3. 주인이 자기 수명인 스코프 { ... } 를 벗어나면 주인은 없어지고 소유한 값은 버려진다. 소유권 개념이 필요한 이유는 당연히 데이터 레이스을 없애기 위해서다. C/C++에서는 동시에 하나의 변수에 접근하려면 락을 걸어야 하는데 이건 성능 저하가 심하고 이것도 실수하면 데이터 레이스가 발생하는데 이건 한 데이터에 변경을 동시에 해서 하나의 변경만 유효한 상황을 만든다. 물론 데이터 레이스를 없애는 극약 처방도 있는데 모든 변수가 상수인 [[하스켈]]의 방식이다. 근데 이건 시스템 프로그래밍에서는 효율이 나올 수가 없는 방식이라서 러스트는 소유권 개념을 선택한 것. 그래도 극단적인 소유권 중심의 언어 디자인은 아니다. 변수이름 앞에 &를 이용해서 변수이름을 빌리는 방식이 있으며 &variable 같은 것을 참조자라고 한다. 이걸 함수 인자에 집어넣으면 함수는 참조자를 통해 변수가 소유한 값을 읽을 수 있다. <source lang="rust"> let a = String::from("A"); let len = String::len(&a); // a의 이름을 빌려서 참조자를 len함수에게 준다. a의 소유권은 유지된다. let len = a.len(); // 위와 같은 표현이다. let len = String::len(a); // 소유권을 넘기려 하지만, String::len은 인자로 &self를 받으므로 인자 타입 불일치 에러! </source> 소유권이 필요없는 메서드는 대부분 소유권 대신에 참조자를 매개변수로 받으니 쓸데 없이 프로그래머가 함수에 소유권을 넘길 일을 없다.
요약:
조무위키에서의 모든 기여는 CC BY-SA 4.0 라이선스로 배포된다는 점을 유의해 주세요(자세한 내용에 대해서는
조무위키:저작권
문서를 읽어주세요). 만약 여기에 동의하지 않는다면 문서를 저장하지 말아 주세요.
또한, 직접 작성했거나 퍼블릭 도메인과 같은 자유 문서에서 가져왔다는 것을 보증해야 합니다.
저작권이 있는 내용을 허가 없이 저장하지 마세요!
취소
편집 도움말
(새 창에서 열림)