겉에 있는 줄 알았는데, 안에 또 있다?
👇👇🏼👇🏻
그래서 우리는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에서는 this
나 self
같은 키워드는 없고,
스코프(Scope)를 잘 구분해서 변수명을 겹치지 않도록 설계해야 해요.
→ 해결법: 함수 인자명, 지역변수명을 멤버와 겹치지 않게 짓기
🧭 요약 정리 표
언어 | 섀도잉 발생 방식 | 해결 키워드 | 설명 |
---|---|---|---|
Java | 지역변수가 멤버변수 가림 | this |
현재 객체 자기 참조 |
JavaScript | 매개변수가 멤버 가림 | this |
객체의 자신 |
Python | 매개변수 vs 멤버 혼동 | self |
인스턴스 자신 |
C | 전역/지역 변수 충돌 | ❌ 없음 | 변수명 구분으로 해결 |
💡 실무에서는?
- 대부분 의도적으로 섀도잉을 피하려고 노력해요
- IDE 경고 뜨기도 함 (
'변수가 섀도잉되고 있습니다'
) - 명확한 변수 이름이 베스트 습관!
👍 마지막으로~
섀도잉은 변수끼리의 이름 충돌
→this
,self
같은 키워드로 정확하게 내가 원하는 변수를 선택하자! 🎯
'Programming Mechanisms' 카테고리의 다른 글
무한 루프(Infinite Loop)의 위험성 (0) | 2025.04.22 |
---|---|
함수형 프로그래밍 (0) | 2025.04.01 |