본문 바로가기
기타 지식들

스코프의 중요성

by 클레어몬트 2024. 8. 4.

[스코프 종류]

전역 스코프 > 함수 스코프 > 블록 스코프

 
 
아래의 C언어 코드를 보자
이 코드는 좋은 코드일까? 나쁜 코드일까?

#include <stdio.h>

int main() {
    int n;
    int tmp;

    n = 1;
    if (n == 1) {
        tmp = n + 1000;
        printf("tmp = %d\n", tmp);
    }
    printf("n = %d\n", n);

    return 0;
}

 
정답은 "나쁜 코드"이며 이유는 2가지이다
 
1. 비효율적인 메모리 사용

tmpif 코드 블록에서만 사용되지만, main() 코드 블록이 종료될 때까지 메모리에 유지하게 된다. 따라서 불필요한 메모리가 낭비된다. 만약 if 코드 블록 안에 tmp를 선언했다면 C언어를 구현하는 곳에서 if 코드 블록의 종료 시점에 이 변수를 메모리에서 제거하여 더 효율적인 메모리 사용이 가능하다.

 
2. 코드 복잡성 증가

좋은 코드는 군더더기 없는 단순한 코드이다. tmpif 코드 블록에서만 필요하고, 여기서만 사용하면 된다. 만약 if 코드 블록 안에 tmp를 선언했다면 if가 끝나고 나면 tmp를 전혀 생각하지 않아도 된다. 머릿속에서 생각할 변수를 하나 줄일 수 있는 것이다. 그런데 지금 작성한 코드는 if 코드 블록이 끝나도 main() 어디서나 tmp를 여전히 접근할 수 있다. 누군가 이 코드를 유지보수할 때 n은 물론이고 tmp까지 계속 신경 써야 한다. 스코프가 불필요하게 넓은 것이다. 지금은 코드가 매우 단순해서 이해하는데 어려움이 없지만 실무에서는 코드가 매우 복잡한 경우가 많다.

 
 
따라서 코드는 아래와 같이 개선돼야 한다

#include <stdio.h>

int main() {
    int n;

    n = 1;
    if (n == 1) {
        int tmp = n + 1000; // tmp를 if 코드 블록 안에 선언
        printf("tmp = %d\n", tmp);
    }
    printf("n = %d\n", n);

    return 0;
}

tmpif 코드 블록 안에서 선언했다. 이제 tmpif 코드 블록 안으로 스코프가 줄어든다. 덕분에 tmp 메모리를 빨리 제거해서 메모리를 효율적으로 사용하고, tmp 변수를 생각해야 하는 범위를 줄여 더 유지보수 하기 쉬워졌다.

변수는 꼭 필요한 범위로 한정해서 사용하는 것이 좋다. 변수의 스코프는 꼭 필요한 곳으로 한정해서 사용하자. 메모리를 효율적으로 사용하고 더 유지보수하기 좋은 코드를 만들 수 있다.
"좋은 프로그램은 무한한 자유가 있는 프로그램이 아니라, 적절한 제약이 있는 프로그램이다"

무한한 자유가 있다면, 무한한 버그도 생긴다

 
 
 
(참고) while문 vs for문
while문은 while문 블록 내에서 증감시킬 변수를 선언하는 것이 불가능하다
하지만 for문은 증감시킬 변수를 선언할 수가 있으므로 메모리 관리와 유지 보수에서 측면에서 더 효과적이다
 
 
 
 
 
출처 및 참고: 김영한의 자바 입문 https://www.inflearn.com/course/%EA%B9%80%EC%98%81%ED%95%9C%EC%9D%98-%EC%9E%90%EB%B0%94-%EC%9E%85%EB%AC%B8