클로저란 함수가 정의된 스코프가 아닌 외부 스코프에서 함수가 실행되더라도, 스코프 밖에 있는 변수를 기억하고 이 외부 변수에 계속 접근할 수 있는 경우를 의미한다.
1. 자바스크립트 코드
function greeting(msg) {
return function product(pro){
console.log(`${pro} ${msg} !`);
};
};
// greeting()이 호출되면서 새로운 인스턴스 생성
var good1 = greeting("입고");
var good2 = greeting("출고");
// 인스턴스에 새로운 msg변수가 사용된다.
good1("콩나물"); // 콩나물 입고!
good1("책"); // 책 입고!
good2("신발"); // 신발 출고!
greeting(msg) 인자에 들어있는 변수 msg가 외부 스코프에서도 greeting함수가 호출되더라도 변수 msg는 끝까지 살아남아서 사용된다. 클로저의 가비지 컬렉션이 적용안되고 존재 혹은 부재가 버그 또는 성능 저하의 원인이 될수있다.
2. 러스트 코드
fn main() {
fn create_fn() -> impl Fn() {
let text = "Fn".to_owned();
// move 클로저를 사용해 text변수를 사용할 수 있다.
move || println!("This is a: {text}")
}
let fn_plain = create_fn();
fn_plain();
}
러스트는 다른언어와 달리 가비지 컬렉션이 없어서 메모리나 성능문제가 전혀 없다.
3. 러스트 클로저 메모리관리
struct City {
name: String,
population: i64,
country: String,
monster_attacks_risk: f64,
}
클로저로 사용될 스트럭트 값들을 조절하여 메모리 관리를 할수있다.
러스트 클로저에 관한 내용
https://devttaemppang.tistory.com/44
'Rust' 카테고리의 다른 글
타입 가드 (0) | 2024.01.28 |
---|---|
Rust Mutex 스레드 (0) | 2024.01.27 |
Rust Closure (0) | 2024.01.24 |
러스트 impl 트레이트 반환타입 (0) | 2024.01.16 |
러스트 제네릭 스트럭트 (0) | 2024.01.15 |