공부해봅시당

[CS 기초] 정적 스코프(Static Scope) vs 동적 스코프(Dynamic Scope) 본문

STUDY/CS

[CS 기초] 정적 스코프(Static Scope) vs 동적 스코프(Dynamic Scope)

tngus 2023. 11. 6. 17:45

정적 스코프와 동적 스코프는 변수가 어떤 값을 참조할지 결정하는 두 가지 다른 규칙

이 두 스코프는 프로그램이 변수 이름을 해석하는 방식에서 근본적으로 다름

 

정적 스코프 (Lexical Scope)

정의

정적 스코프는 프로그램의 텍스트에 따라 변수의 스코프가 결정되는 것을 말함

함수의 스코프는 그 함수가 어디서 호출되었는지가 아니라 어디서 정의되었는지에 의해 결정

특징

함수의 스코프는 함수가 정의된 시점에 고정
코드를 읽으면서 변수가 어디서 오는지 쉽게 파악할 수 있음
대부분의 현대 프로그래밍 언어에서 사용(예: JavaScript, Python, C)

 

예제

var x = 'global';

function outer() {
    var x = 'outer';

    function inner() {
        console.log(x); // 여기서 x는 'outer'를 참조합니다.
    }

    inner();
}

outer();

 

장점

예측 가능하고 이해하기 쉬운 코드를 작성할 수 있음
컴파일 타임에 스코프 결정이 가능하므로 최적화하기가 용이

 

단점

다른 스코프의 변수를 사용하고자 할 때 추가적인 메커니즘(예: 클로저)이 필요할 수 있음

 

 

동적 스코프

정의

동적 스코프에서는 함수의 스코프가 함수가 호출되는 시점의 호출 스택에 의해 결정

특징

함수가 실행되는 시점의 호출 컨텍스트에 따라 변수의 스코프가 결정
함수가 어디서 호출되었는지가 스코프를 결정
일부 오래된 언어나 특수 목적의 스크립트 언어에서 주로 사용 (예: Bash, early versions of Lisp).

 

예제

동적 스코프를 가진 언어의 예는 어려울 수 있으나, 이를 흉내낸 가상의 코드는 다음과 같음

# Bash 스크립트 예제로, Bash는 동적 스코프를 가지고 있다.
x="global"

function outer() {
    local x="outer"

    function inner() {
        echo $x # 함수가 호출되는 컨텍스트에 따라 다른 값 출력
    }

    inner
}

function call_inner() {
    local x="call_inner"
    inner
}

outer # "outer" 출력
call_inner # "call_inner" 출력

 

장점

일부 특정 상황에서 호출 컨텍스트에 따라 다른 동작을 하는 함수를 만들 때 유용할 수 있음

 

단점

코드의 흐름을 따라가기 어렵고, 디버깅이 복잡해질 수 있음
컴파일 타임에 최적화하기 어려워 성능이 저하될 수 있음

 

 

비교분석

가독성

정적 스코프는 가독성이 높고 예측 가능한 반면, 동적 스코프는 코드의 컨텍스트를 따라가야 하기 때문에 복잡할 수 있음


성능

정적 스코프는 컴파일러가 더 많은 최적화를 수행할 수 있기 때문에 성능 면에서 유리

 

유연성

동적 스코프는 런타임에 함수 호출 컨텍스트에 따라 다른 동작을 하도록 할 수 있는 유연성을 제공

하지만 이 유연성은 코드의 복잡성과 예측 불가능성을 증가시키는 단점이 있음


디버깅

정적 스코프의 경우 변수의 스코프가 코드를 통해 명확하기 때문에 디버깅이 더 쉬움

동적 스코프에서는 실행 컨텍스트에 따라 결과가 달라질 수 있어 디버깅이 더 어려울 수 있음


적용 분야

정적 스코프는 일반적인 목적의 프로그래밍 언어에서 널리 사용됨

동적 스코프는 스크립팅 언어나 특정 도메인에 특화된 언어에서 일부 사용됨

 


종합적으로, 정적 스코프는 프로그래머에게 더 많은 이점을 제공하는 경향이 있으며, 현대 프로그래밍에서 가장 널리 사용되는 방식

그에 반해 동적 스코프는 특정 케이스에 유용할 수는 있지만, 전반적인 프로그래밍 실습에서는 피하는 경향이 있음

 

이는 프로그램의 행동을 이해하고 예측하는 것이 더 어렵기 때문에, 코드의 유지보수와 확장이 더 복잡해질 수 있기 때문

'STUDY > CS' 카테고리의 다른 글

[CS 기초] Groovy란?  (0) 2023.11.06
[CS 기초] 고차함수  (2) 2023.11.06
[CS 기초] 렉시컬 스코프, 스코프 체인, 클로저의 관계  (1) 2023.11.06
[CS 기초] 스코프(Scope)  (0) 2023.11.06
[CS기초] 렉시컬(lexical) 환경  (1) 2023.11.03