변수값을 수정하려면 전역변수로 설정하여 맨 위에 정의하면 나중에 수정할 때 굉장히 편해지지 않겠는가?
깔끔하고 편리할 것 같아서 나는 전역변수로 모두 정의하고 싶은 마음이다.
그러나 깔끔하지도 않고, 수정할 때 해당 변수를 찾으러 메서드까지 내려갔다와야 하는 번거로움이 있음에도
왜 굳이 지역변수를 사용하는 것일까?
// 전역변수
var apple = 0;
function checkFood() {
console.log(apple);
}
// 지역변수
function checkFood() {
var apple = 0;
console.log(apple);
}
전역변수로 정의하여 코드 맨 위에 배치시킨다면 추후 apple 변수의 값을 수정할 때
해당 변수와 관련 된 메서드를 굳이 찾지 않아도 수정할 수 있다.
그러나 지역변수로 변수를 정의한다면, apple 변수의 값을 수정하려면 checkFood()를 찾아야 한다.
변수는 변수끼리 맨 위에 정의되어 있는게 보기에도 예쁘고 수정할 때도 편리한데
지역변수를 써야 할 의미가 특별하게 있을까?
1. 전역변수, 지역변수 정의
전역 변수와 지역 변수는 프로그래밍에서 '변수의 범위(scope)'와 '생명주기'를 정의하는 중요한 개념이다.
전역변수(Global Variable)
프로그램 전체에서 접근할 수 있는 변수이다.
어떤 함수나 블록 내에서 정의되지 않고, 프로그램의 최상위 레벨에서 정의된다.
- 접근성 : 프로그램의 모든 함수와 블록에서 접근 가능
- 생명주기 : 프로그램이 실행되는 동안 존재하며, 언제든지 수정 가능
var apple = 0;
function checkFood() {
console.log(apple);
}
지역변수(Local Variable)
특정 함수, 블록 또는 구문 내에서 정의된 변수로, 그 범위 내에서만 접근 가능하다.
함수가 종료되면 지역 변수는 메모리에서 해제된다.
- 접근성 : 정의된 함수나 블록 내에서만 접근 가능
- 생명주기 : 함수나 블록이 실행되는 동안만 존재
function checkFood() {
var apple = 0;
console.log(apple);
}
2. 장단점
전역변수 | 지역변수 | |
장점 | - 모든 부분에서 접근 가능하여, 여러 함수나 이벤트 핸들러에서 사용하기 용이 - 애플리케이션의 여러 부분에서 동일값을 공유 해야 할 경우 유용 |
- (캡슐화) 함수 내에서만 사용되므로, 다른 코드와의 충돌을 피할 수 있음 - 코드 모듈화, 유지보수성 높음 - 변수가 어디에서 사용되고 변경되는지 명확하게 알 수 있어 디버깅에 용이 - 함수가 종료되면 지역 변수를 자동으로 메모리에서 해제되므로, 메모리 관리에 유리 |
단점 | - 다른 스크립트나 라이브러리와 충돌 가능성 있음 (변수명 중복) - 코드 특정 부분에서 버그 찾기 어려워질 수 있음 - 페이지가 로드되는 동안 메모리에 남아 있으므로, 불필요한 전역 변수를 남기면 메모리 낭비가 발생할 수 있음 |
메모리 관리 및 디버깅에 용이하다는 장점이 있어, 가능한 지역 변수를 사용하는 것이 좋다고 한다.
반드시 전역 변수가 필요한 상황 제외하고는 지역 변수를 사용하는 것을 지향해야 할 듯 싶다.
게다가 지역 변수 사용 시 필요하지 않은 변수의 메모리를 즉시 해제함으로써 시스템의 메모리를 효율적으로 사용할 수 있다.
특히 대규모 애플리케이션에서 메모리 누수 방지는 굉장히 중요하다.
메모리에 쉽게 할당되고 해제되는 지역 변수는 메모리 접근 속도가 빠르다.
또한 프로그램이 사용하지 않는 변수들을 계속 메모리에 남겨두지 않으므로, 전체 메모리 사용량이 줄어든다.
코드를 수정하거나 유지보수할 때 더 유리한 측면도 있다.
나는 한꺼번에 변경하거나 간단히 변경하는 변수의 경우만 생각해서 전역 변수를 사용하고 싶었던 것인데,
메모리 누수 방지 및 디버깅의 관점에서는 지역 변수가 훨씬 용이하다는 장점이 있다는 것을 알았으니 되도록 지역 변수를 사용할 것 같다.
변수를 정의할 때 이 변수가 여러 곳에서 쓰이는지, 아니면 특정 메서드에서만 부분적으로 쓰이는지를
깊이 고민해보고 변수의 범위를 생각하면서 정의해야겠다는 생각이 든다.
'[Project] > 업무일지' 카테고리의 다른 글
회원탈퇴 시 쿠키 삭제하기(JavaScript) (1) | 2024.12.27 |
---|---|
[ES5/SpringBoot/Ajax/JSP] CKEditor 4.16.2 : 한글 깨짐 현상 해결 (인코딩 설정) (0) | 2024.10.25 |
[Oracle] 부모 - 자식 간 관계일 때 컬럼값 수정 (0) | 2024.10.24 |
[Oracle/WEB] 특정 쿠폰 사용완료 고객, 주문, 쿠폰 정보 조회 쿼리 작성 (0) | 2024.10.23 |
Cause: java.sql.SQLSyntaxErrorException: ORA-00911: invalid character (0) | 2024.10.16 |