-
클로저(Closure)란?Back-End/Language 2024. 4. 5. 11:33반응형
Go 언어에서의 클로저(Closure)는 JavaScript의 클로저와 유사한 개념을 가지고 있습니다. 둘 다 외부 함수로부터 생성된 내부 함수가 그 외부 함수의 스코프에 있는 변수에 접근할 수 있게 해주는 프로그래밍 기능입니다. 하지만 언어의 특성과 구현 방식에서는 차이가 있을 수 있습니다.
공통점
- 변수의 스코프 유지: 클로저는 내부 함수가 외부 함수의 실행 컨텍스트가 종료된 후에도 외부 함수의 변수에 접근할 수 있게 해줍니다. 이를 통해 특정 함수 호출이 종료된 이후에도 변수의 상태를 유지할 수 있습니다.
- 데이터 은닉과 캡슐화: 클로저는 데이터를 함수 내부에 은닉하고, 특정 함수를 통해서만 데이터에 접근할 수 있게 함으로써 캡슐화를 제공합니다.
차이점
- 언어적 특성: JavaScript는 프로토타입 기반의 객체 지향 언어로, 클로저는 일급 객체(first-class functions)로서의 함수와 함께 중요한 역할을 합니다. 반면, Go는 병렬 처리와 시스템 프로그래밍에 강점을 가진 정적 타입의 컴파일 언어로, 클로저는 주로 함수 리터럴과 익명 함수에서 찾아볼 수 있습니다.
- 구현 방식: Go에서 클로저는 함수 리터럴이 외부 변수에 접근할 때 생성됩니다. 이 변수들은 클로저가 생성될 때의 상태를 캡처하고, 클로저 내에서 사용할 수 있습니다. JavaScript에서는 함수가 정의될 때의 렉시컬 환경(Lexical Environment)을 참조하여 클로저를 구현합니다.
- 사용 사례: JavaScript의 클로저는 모듈 패턴, 콜백, 비동기 프로그래밍 등에서 널리 사용됩니다. Go에서 클로저는 주로 고루틴(goroutines)과 채널(channels)을 사용한 비동기 프로그래밍, 콜백 패턴 구현 등에 사용됩니다.
예시
JavaScript에서의 클로저 예시:
function makeCounter() { let count = 0; return function() { return count++; // 외부 함수의 변수 `count`에 접근 }; } const counter = makeCounter(); console.log(counter()); // 0 console.log(counter()); // 1
Go에서의 클로저 예시:
package main import "fmt" func makeCounter() func() int { count := 0 return func() int { count++ return count // 외부 변수 `count`에 접근 } } func main() { counter := makeCounter() fmt.Println(counter()) // 1 fmt.Println(counter()) // 2 }
두 언어 모두 클로저를 통해 함수 외부의 변수를 참조하고, 해당 변수의 상태를 함수 호출 사이에 유지할 수 있습니다. 하지만, 각 언어의 특성에 따라 클로저의 사용 방식과 목적에 차이가 있을 수 있습니다.
반응형'Back-End > Language' 카테고리의 다른 글
정규표현식(Regex)이란? (0) 2024.04.16