목록으로
'언젠가 읽기' 컨텐츠는 논문이나 영문 컨텐츠 등 언젠가 읽으려고 즐겨찾기 하고선 읽지 않고 계속 미룰만한 컨텐츠를 읽고 요약하거나 소개합니다.

Rust, C++ 및 Hylo에서의 이동 의미론

언젠가 읽기
2025. 1. 21. PM 2:40:59

Move Semantics in Rust, C++, and Hylo

동기

Hylo의 기본 설계를 소개한 "Borrow Checking Hylo"라는 논문을 읽었다. Hylo는 초기 단계의 프로그래밍 언어로, C++의 대안이면서도 Rust처럼 메모리 안전성을 제공한다. 특히, Rust의 대여 검사(borrow checking) 아이디어를 이동 가능 값 의미론(Movable Value Semantics, MVS)과 선형 타입(Linear Types, LT)의 프레임워크에 통합했다.
C++, Rust, Hylo의 차이점을 하나의 예제를 통해 설명하고자 한다.

예제

다음과 같은 상황을 구성한다:
  1. Person 이라는 이름과 나이 속성을 가진 레코드를 정의한다.
  2. Dave 라는 이름의 사람 객체를 생성한다.
  3. 이 사람 객체를 show 함수에 전달한다.
이때 다음 질문을 고려한다:
  1. Dave show 에 전달할 때, 객체의 복사본이 생성되는가?
  2. 만약 그렇다면, 복사본 생성을 어떻게 피할 수 있는가?
  3. 복사본이 아닌 유일한 Dave show 에 전달한 후에도 Dave 를 사용할 수 있는가?

C++에서의 상황

C++에서는 객체를 함수에 값으로 전달하면 복사본이 생성된다. 이는 큰 객체일 경우 성능에 영향을 줄 수 있다. 복사본 생성 여부를 확인하기 위해 복사 생성자를 정의하여 복사 시 출력하도록 할 수 있다.
복사본 생성을 피하려면 다음과 같은 방법을 사용한다:
  • 참조 전달 : 함수 매개변수를 Person& person 으로 선언하여 객체를 복사하지 않고 참조를 전달한다.
  • 상수 참조 전달 : 수정되지 않는 객체는 const Person& person 으로 선언하여 안전하게 참조를 전달한다.
이렇게 하면 객체의 복사 없이 함수에 전달할 수 있으며, 함수 호출 후에도 원본 객체를 계속 사용할 수 있다.

Rust에서의 상황

Rust에서는 기본적으로 함수에 객체를 전달하면 소유권이 이동(move)된다. 따라서 함수 호출 후 원본 객체를 더 이상 사용할 수 없으며, 사용하려면 컴파일 오류가 발생한다. 이는 메모리 안전성을 보장하기 위한 Rust의 소유권 시스템 때문이다.
복사본 생성 없이 객체를 함수에 전달하면서 원본 객체를 계속 사용하려면:
  • 객체 복제 : clone() 메서드를 사용하여 객체의 복사본을 생성한 뒤 함수에 전달한다.
  • 대여(Borrow) : 함수 매개변수를 참조로 선언하고, 호출 시 & 를 사용하여 객체를 대여한다.
대여를 사용하면 소유권을 이동하지 않고도 객체를 함수에 전달할 수 있으며, 호출 후에도 원본 객체를 사용할 수 있다. Rust의 대여 검사기는 이러한 대여 관계를 추적하여 메모리 안전성을 보장한다.

Hylo에서의 상황

Hylo는 이동 가능 값 의미론과 선형 타입을 결합하여 메모리 안전성을 제공한다. 여기서 중요한 개념은 다음과 같다:
  • sink 매개변수 : 함수 매개변수를 sink 로 선언하면 객체의 소유권이 함수로 이동하며, 함수 호출 후 원본 객체를 사용할 수 없다.
  • 복사 가능성 : 객체를 Copyable 로 선언하여 복사할 수 있도록 한다.
  • 기본 전달 방식 : 매개변수를 특별한 키워드 없이 전달하면 기본적으로 복사가 발생한다.
원본 객체를 함수 호출 후에도 사용하려면:
  • 객체를 Copyable 로 선언하여 복사본을 생성하여 전달한다.
  • 매개변수를 let 으로 전달하여 복사가 일어나도록 한다.
Hylo에서는 개발자가 객체의 소유권과 복사 여부를 명시적으로 관리하여 메모리 안전성을 유지하면서도 효율적인 코드 작성을 가능하게 한다.

결론

C++, Rust, Hylo 모두 함수에 객체를 전달할 때 복사 여부와 소유권 이동에 대한 각기 다른 접근 방식을 취한다. 이는 메모리 안전성과 성능 최적화를 위한 것으로, 개발자는 각 언어의 특성을 이해하고 적절히 활용해야 한다.

참고 자료

  • "Borrow Checking Hylo"
  • "The Rust Programming Language"
  • "Effective Modern C++"

푸딩캠프 뉴스레터를 구독하면 학습과 성장, 기술에 관해 요약된 컨텐츠를 매주 편하게 받아보실 수 있습니다.