작성
·
183
0
안녕하세요
강의 4:40 대에 소속된 중괄호가 다르면 같은 변수명을 초기화하더라도 메모리 주소가 다른 곳에 저장된다고 나옵니다.
그리고 강의 7:15에서는 x가 중괄호 밖으로 나온 순간 사용할 수 없다고 합니다.
그런데 강의 8:10에서 초기화를 하지 않고 "안 쪽"의 중괄호의 x=2를 쓰고, 그 떄의 주소를 보면 "바깥 괄호"의 x 주소를 그대로 사용하는 것을 확인할 수 있습니다.
중괄호의 포함관계가 적용되는 것인가요?
포함관계가 없는 중괄호 끼리는 변수를 혼용해서 못쓰는 것인가요?
ex)
int main ()
{
int x = 4;
{
x =5;
int y = 4;
}
{
y=6;
}
}
위 코드는 에러가 납니다.
그 이유를 분석해보면 ,
포함관계가 있는 중괄호라면, 즉 큰 범위에서 정의된 x는 값을 변경하는 게 가능하지만
독립된 범위에서 정의된 y는
포함관계가 없는 중괄호에서의 y는 정의되지 않았기 떄문에 값을 변경하는 게 불가능해서 인가요?
그런데 .. 오로지 포함관계로 볼 수 도 없는 것이 안 쪽 중괄호가 바깥 중괄호에 포함되는 것이라면
int main()
{
int x =4;
{
int x= 5;
}
}
위 코드는 에러가 나야합니다. 큰 범위의 중괄호에서 이미 정의된 x를 두 번 정의하기 떄문에요.
하지만 주소값을 출력해보면 위 x와 아래 x가 다른 메모리 주소값을 갖게 됩니다.
정리를 하자면,
int main()
{
int x = 5;
{
int x= 3;
}
}
이 가능하려면
int main()
{
int x =3;
{
x=5;
}
}
가 가능할 수 없다고 생각합니다.
답변 1
3
바깥 범위를 A 범위라고 하고 그 범위에 속한 안쪽 범위를 B 범위라고 가정해보겠습니다. B 범위 안이 현재 시점이라고 가정해볼게요.
int main()
{
int x =3;
{
x=5;
}
}
- B 범위에서 x 변수를 선언 및 정의 하지 않았을 때 👉 B 범위 안에서 사용하는 x 는 A 범위에서 정의된 x 입니다. x = 5; 에 사용된 저 x 는 A 의 x 인거에요. A 의 x 를 사용한 것입니다. (이건 x 에 5 를 대입하는, 마치 기존의 x 를 "사용"하는 개념이고 x 를 새롭게 정의 하는 개념은 아닙니다! ) A 영역 B 영역 전부 합해서 x 라는 변수는 단 하나입니다. A 의 x !!! 이때 B 는 A 에 속하기도 하기 때문에 B 에서 사용되는 x 는 A 의 x 입니다.
int main()
{
int x =4;
{
int x= 5;
}
}
- B 범위에서 x 변수를 선언 및 정의했을 때 👉 앞으로 B 범위 안에서 사용하는 x 는 B 범위에서 정의된 x 입니다. B 가 포함된 A 범위에도 동일한 이름의 변수가 있기는 하나, 마치 우선순위가 적용되듯, B 범위에서 동일한 이름의 x 변수를 새롭게 정의할 수 있게 됩니다. 중첩된 경우에도 바깥 범위와 이름이 같은 변수 선언 해도 됩니다. 대신 중첩된 안쪽 범위 내에서는 안쪽 범위에서 선언된 변수가 더 우선됩니다. 앞으로 B 영역 안에서 사용되는 x 는 B 의 x 입니다.(더 우선되기 때문에) 동명이인일 뿐 A 에서의 x 와 B 에서의 x 는 서로 다른 존재가 되겠습니다. 영역 및 범위만 다르다면(포함관계 포함) 동일한 이름의 변수 새롭게 정의할 수 있어요!!! 다만 그 영역 내에서만 사용이 되죠.
B 도 A 안에 포함된 범위인데 A 에 이미 동일한 x 가 정의되어 있음에도 불구하고 B 에서도 왜 x 를 새롭게 정의할 수 있는지에 대해서 질문해주신 것 같은데요! 이게 가능한 이유는 B 의 x 는 오로지 B 영역에서만 사용할 수 있기 때문입니다. 변수는 어차피 자신이 선언 및 정의된 영역에서만 수명을 가집니다. 즉, 자신이 출생신고 된 범위에서만 수명을 가진다고 생각하시면 됩니다. B 영역은 A 영역 내에서 금방 끝나 버리기 때문에 어차피 B 의 x 는 A 영역에선 쓰일 수가 없습니다. B의 중괄호가 끝나면 B 의 x 도 없어지는거에요.
- B 영역에서 선언된 x 변수 👉 B 내에서만 쓰임. B 에서 사용하는 x 는 B 의 x 라고 '약속'. (B 의 x 가 A 의 x 보다 우선)
- A 영역에서 선언된 x 변수 👉 B 에서 x 가 선언 안된다면 B 에서 쓰이는 x 는 A 에서 쓰이는 x.
B 의 x 는 A 에선 쓰일 수가 없고, B 에서 x 가 새로 정의되었으니 A 의 x 는 B 에서 안쓰기로 분리를 한거죠! 이러한 분리 덕분에 중첩 되지 않은, 완전히 평등한 "동일한 영역"에서는 동일한 메모리가 두 번 사용되어 혼동이 생기는 일이 어차피 발생하지 못하기 때문에 위와 같이 안쪽 범위에도 동명이인 변수를 만드는게 가능했던 것입니다. 에러가 나야 한다고 말씀 하셨는데 아니에요! 이와 같은 원리로 에러가 나지 않습니다.
B 영역(B의 중괄호)이 끝나게 되면 이젠 x 는 오롯이 A 영역의 x 뿐입니다. 이젠 x 라고 언급하면 A 의 x 를 언급하는 것이빈다.
변수가 본인이 선언 및 정의된 영역에서만 수명을 가지며, 그 영역이 끝나버리면 그 영역에서 선언된 변수 등등 메모리들도 전부 해제가 되어 사라집니다. 이건 <4.1 지역 변수, 범위, 지속기간> 강의에서 자세히 배우게 되는데 아직 이 부분에 대해서 배우지 않으셔서 의문을 가지셨던 것 같아요!
int main ()
{
int x = 4;
{
x =5;
int y = 4;
}
{
y=6;
}
}
이게 에러가 났던 이유는 위에서 설명드린 걸로 설명이 될 것 같습니다.
y 가 선언된 범위는 안쪽 범위였죠? 그러니 y 는 오로지 저 { x = 6; int y = 4; } 이 중괄호 범위에서만 수명을 가지는 것이나 마찬가지입니다. y = 6; 이 속한 범위는 y 가 수명을 가지는 범위와는 완전히 다른 범위에요. y = 6; 하는 시점에는 이미 y 는 더 이상 사용할 수 없는, 죽어버린 변수나 마찬가지입니다. { x = 6; int y = 4; } 이 중괄호 끝나자마자 y 는 죽는거나 마찬가지이기 때문에 이 영역이 끝나버린 후 y =6; 해주신 시점에선 컴파일러가 "y 가 뭔데? y 가 누군데??" 하고 의문을 가지게 되기 때문에 에러가 난거에요.
허걱 정말 감사합니다. 여러번 정독해보겠습니다!