💻 프로그래밍

변수

Variable

데이터를 저장하는 메모리 공간의 이름. 타입에 따라 숫자, 문자열, 객체 등을 저장.

📖 상세 설명

변수(Variable)는 프로그램에서 데이터를 저장하고 참조하기 위한 이름이 붙은 메모리 공간입니다. 변수를 통해 숫자, 문자열, 객체 등 다양한 값을 저장하고 나중에 사용할 수 있습니다.

변수에는 스코프(범위)가 있습니다. 전역 변수는 프로그램 전체에서 접근 가능하고, 지역 변수는 선언된 블록 내에서만 유효합니다. JavaScript의 var는 함수 스코프, let/const는 블록 스코프를 가집니다.

변수의 불변성(immutability)은 중요한 개념입니다. JavaScript의 const, Python의 관례적 대문자 변수명, Rust의 기본 불변 바인딩은 값이 변경되지 않음을 나타냅니다. 불변 변수는 버그를 줄이고 코드 이해를 쉽게 합니다.

타입 시스템에 따라 변수 선언 방식이 다릅니다. 정적 타입 언어(Java, TypeScript)는 타입을 명시하고, 동적 타입 언어(Python, JavaScript)는 런타임에 타입이 결정됩니다. 타입 추론을 지원하는 언어에서는 컴파일러가 타입을 자동으로 유추합니다.

💻 코드 예제

JavaScript
// 변수 선언 방식
var oldWay = "함수 스코프 (권장하지 않음)";
let mutableVar = "블록 스코프, 재할당 가능";
const immutableRef = "블록 스코프, 재할당 불가";

// 스코프 예시
function scopeExample() {
    let blockScoped = "함수 내부";

    if (true) {
        let innerVar = "블록 내부";
        var functionVar = "함수 스코프";
        console.log(blockScoped);  // 접근 가능
    }

    console.log(functionVar);  // 접근 가능 (var)
    // console.log(innerVar);  // 에러! (let은 블록 스코프)
}

// 호이스팅
console.log(hoisted);  // undefined (var는 호이스팅)
var hoisted = "값";
// console.log(notHoisted);  // 에러! (let/const는 TDZ)
let notHoisted = "값";

// 구조 분해 할당
const user = { name: "김개발", age: 30 };
const { name, age } = user;

const numbers = [1, 2, 3];
const [first, second] = numbers;

// const와 객체 변경
const config = { debug: true };
config.debug = false;  // 가능 (참조는 불변, 내용은 변경 가능)
// config = {};  // 에러! (재할당 불가)

🗣️ 실무 대화 예시

주니어 개발자
"전역 변수를 써도 되나요? 여러 곳에서 필요한 설정값이거든요."
시니어 개발자
"전역 변수는 피하는 게 좋아요. 싱글톤 패턴이나 의존성 주입으로 관리하면 테스트도 쉽고 부작용도 줄어들어요."
주니어 개발자
"환경 변수는 어떻게 관리하는 게 좋을까요?"
면접관
"JavaScript에서 var, let, const의 차이점을 설명해주세요."
지원자
"var는 함수 스코프이고 호이스팅됩니다. let은 블록 스코프이고 재할당 가능합니다. const도 블록 스코프이지만 재할당이 불가능합니다. 현대 코드에서는 const를 기본으로, 필요할 때만 let을 사용합니다."
면접관
"클로저에서 변수 캡처는 어떻게 동작하나요?"
지원자
"클로저는 생성 시점의 스코프를 기억합니다. var는 루프에서 마지막 값만 캡처되는 문제가 있지만, let은 각 반복마다 새 바인딩을 만들어서 이 문제를 해결합니다."
리뷰어
"이 변수 이름이 너무 짧아요. 'x'보다는 'userCount'처럼 의미 있는 이름을 사용하세요."
작성자
"루프 인덱스라서 짧게 썼는데, 의미가 있는 변수는 명확한 이름으로 바꾸겠습니다."
리뷰어
"그리고 let으로 선언했는데 재할당이 없네요. const로 바꾸면 의도가 더 명확해져요."

⚠️ 주의사항

🔗 관련 용어

📚 더 배우기