Programming Mechanisms

변수 섀도잉(Shadowing)

yoooCo 2025. 4. 4. 16:21

겉에 있는 줄 알았는데, 안에 또 있다?
👇👇🏼👇🏻
그래서 우리는 this를 써요

🧠 변수 섀도잉이란?

같은 이름의 변수가 중첩된 범위(scope)에 다시 선언되어 바깥 변수를 가리는 현상

즉, 밖에 선언한 변수안쪽(함수나 블럭 등)에 선언한 변수 이름이 같을 때,
가까운(안쪽) 변수가 우선시되어 바깥 변수는 "섀도잉" 당합니다.

⁉️ 왜 섀도잉이 문제일까?

문제 상황 설명
🤯 값이 잘못 들어감 의도한 바깥 변수가 아니라 안쪽 지역 변수에 값이 들어감
🧪 디버깅 어려움 "값을 설정했는데 왜 적용이 안 되지?" 하는 상황 발생
👀 가독성 저하 같은 이름이 중복되면 읽는 사람도 혼란

✨ 섀도잉 in 4개 언어 + 해결 방법 정리

🟨 Java: this 키워드로 해결

public class User {
    String name;

    public void setName(String name) {
        this.name = name;
    }
}
  • name = name → 둘 다 매개변수 → ❌ 멤버 변수에 값이 안 들어감
  • this.name = name → ✅ 멤버 변수와 매개변수를 명확히 구분!

this현재 객체 자신을 가리키는 참조 키워드입니다.

🟦 JavaScript: this + 화살표 함수 조심!

let name = "global";

function greet() {
    let name = "local"; // 전역 name 섀도잉
    console.log(name); // local
}

greet();
console.log(name); // global
그리고 객체 안에서의 섀도잉
const user = {
    name: "Alice",
    setName(name) {
        this.name = name;
    }
};

user.setName("Bob");
console.log(user.name); // Bob

자바스크립트에서도 this현재 객체를 가리킵니다.
다만, 화살표 함수는 this 바인딩이 달라서 주의!

🟪 Python: self 로 해결 (클래스에서)

class User:
    def __init__(self, name):
        self.name = name  # self.name: 멤버 변수, name: 매개변수
  • self.name = name → ✅ 멤버 변수에 접근 가능

  • name = name만 쓰면 그냥 매개변수 = 매개변수 → ❌

self인스턴스 자기 자신을 가리키는 파이썬의 방식

🟥 C: 스코프 구분, this 없음

int x = 100;

int main() {
    int x = 50;  // 전역 변수 x 섀도잉
    printf("%d\n", x);  // 50
    return 0;
}

C에서는 thisself 같은 키워드는 없고,
스코프(Scope)를 잘 구분해서 변수명을 겹치지 않도록 설계해야 해요.

→ 해결법: 함수 인자명, 지역변수명을 멤버와 겹치지 않게 짓기


🧭 요약 정리 표

언어 섀도잉 발생 방식 해결 키워드 설명
Java 지역변수가 멤버변수 가림 this 현재 객체 자기 참조
JavaScript 매개변수가 멤버 가림 this 객체의 자신
Python 매개변수 vs 멤버 혼동 self 인스턴스 자신
C 전역/지역 변수 충돌 ❌ 없음 변수명 구분으로 해결

💡 실무에서는?

  • 대부분 의도적으로 섀도잉을 피하려고 노력해요
  • IDE 경고 뜨기도 함 ('변수가 섀도잉되고 있습니다')
  • 명확한 변수 이름이 베스트 습관!

👍 마지막으로~

섀도잉은 변수끼리의 이름 충돌
this, self 같은 키워드로 정확하게 내가 원하는 변수를 선택하자! 🎯

'Programming Mechanisms' 카테고리의 다른 글

무한 루프(Infinite Loop)의 위험성  (0) 2025.04.22
함수형 프로그래밍  (0) 2025.04.01