L5 Ownership

이전 강의인 L4 fn 🔥을 들어야 이 강의를 듣는 것이 수월합니다.

소유권이란 무엇인가?

  • Mojo는 Rust언어의 영향을 받아 소유권 개념이 존재한다.
  • 소유권은 메모리의 안정성을 위해 필요한 개념으로 파이썬보다 변수의 변경을 엄격하게 관리하여 속도와 안정성을 높인다.

1. borrowed (default)

  • immutable(불변) => c++의 const&와 유사
  • 빌려주는 개념으로, 외부의 변수를 복사하지 않고 그대로 읽어오나 함수 내부에서도 변경/수정은 불가능하다.
fn add_num1(borrowed a: Int, b: Int) -> Int:
	# a = a + 1 # error 
	# -> immutable하기 때문에 변경 불가능
	return a + b # 사용은 가능
let a = 1 # let이면 inout을 사용해도 변경 불가능
let b = 2 # inout을 통해 fn 내에서 변경하기 위해 var
let c = add_num1(a, b)

print(a) # 1
print(b) # 2
print(c) # 3

2. inout

  • mutable(가변)
  • 함수에게 변경이 가능하도록 변수를 전달하고 싶을 때 사용한다.
  • 단, 함수 내부에서 inout을 통해 가져온 값을 변경하면, 외부의 원 변수도 변경된다. (복사하지 않기 때문)
fn add_num2(inout a: Int, b: Int) -> Int:
	a = a + 1 # ok
	# 외부의 원 변수도 변경된다.
	return a + b
var a = 1 # inout을 통해 fn 내에서 변경하기 위해 var
let b = 2 # let이면 inout을 사용해도 변경 불가능

let d = add_num2(a, b)
print(a) # 2
print(d) # 4

Swap Variable Example

fn swap(inout a: Int, inout b: Int):
	let temp = a
	a = b
	b = temp
var a : Int = 1 
var b : Int = 2

swap(a, b)
print(a) # 2
  • def를 사용하면 외부의 값을 복사하여 함수 내로 가져오기 때문에, 내부에서 자유롭게 사용 가능하나, 속도가 느리고 값을 바꾸는데서 개발자의 실수가 발생할 가능성이 큼
  • fn을 통해 함수의 설계부터 변경가능/불가능한 외부값을 설정하고 이를 이용하면 더 안정적인 코딩이 가능함. (Rust의 철학)

3. owned

  • transfer argument
  • exclusive ownership(독점 소유권)을 가지는 변수로, 함수에게 변수의 소유권을 넘겨주는 개념이다.
  • 위 개념은 Season2의 Pointer 파트에서 같이 설명될 예정이다.

Copyright © 2023 Junseo Ko. 본 내용은 모두 제가 작성한 도큐먼트입니다. 무단 퍼가기와 재생산을 금지합니다. 문의: piglets.frizzle0v@icloud.com