Page 25 -
P. 25

a = 3;       // a#1을 할당한다. a#2는 아직 정의되지 않았다.
                           int a;       // a#2를 정의한다.
                           a = 8;       // a#2를 할당한다. a#1은 숨겨진다.
                           {
                               a = 7;   // a#2를 할당한다.
                           }
                       }                // a#2의 범위가 끝난다.
                       a = 11;          // a#1에 할당한다. (a#2는 범위 밖이다.)

                       return 0;
                   }

                   숨기기로 인해 변수들의 수명과 가시성을 구별해야 한다. 예를 들어 a#1의 수명은 변수의 선언 때

                   부터 main 함수가 끝날 때까지다. 그러나 a#1은 a#1의 선언 때부터 a#2의 선언 전까지만 보이고
                   a#2를 포함하는 블록이 닫힌 후에 다시 보이게 된다. 사실, 가시성은 수명에서 숨겨질 때의 시간
                   을 뺀 값이다.

                   동일한 범위에 같은 변수 이름을 두 번 정의하면 오류가 발생한다.

                   범위의 장점은 변수가 범위 바깥 어딘가에 이미 정의되어 있는지에 대한 여부를 걱정하지 않아도
                                                                                     *
                   된다는 것이다. 범위는 단지 숨겨져 있을 뿐이다. 이로 인해 충돌이 발생하지 않는다.  불행하게
                   도 숨기기는 바깥쪽 범위에 있는 같은 이름의 변수에 접근할 수 없게 만든다. 우리는 이름 바꾸기
                   로 이 문제를 어느 정도 극복할 수 있다. 그러나 중첩과 접근성을 관리하는 더 나은 해결책은 바로

                   네임스페이스(Namespace)이다. 이에 대해서는 3.2.1절을 보라.
                   static 변수는 이 규칙을 따르지 않는다. static 변수는 프로그램이 끝날 때까지 살아있지만, 범

                   위 안에서만 보인다. 우리는 이 단계에서 static 변수를 자세히 소개하는 게 도움이 되기보다는
                   더 산만해질 수 있다고 우려했다. 따라서 설명을 A.2.2절로 미루기로 했다.



















                   *    매크로와는 달리 C로부터 내려온 더 이상 쓸모없고 무모한 기존 기능은 어떤 대가를 치르더라도 피해야 한다. 왜냐하면 언어의 모든 구조 및
                      안정성을 저해하기 때문이다.

             036




         모던c++_09.indd   36                                                                     2017-12-11   오전 11:02:55
   20   21   22   23   24   25