변수의 "수명"을 가능한 짧게 유지한다.
Edit me

변수 사용시 고려할 사항

변수의 “수명”을 가능한 짧게 유지한다가 핵심이다

범위를 최소화하기 위한 일반적인 가이드라인

  • 루프에서 사용되는 변수는 루프를 포함하고 있는 루틴의 시작이 아니라 루프 바로앞에서 초기화한다.
  • 변수를 사용하기 바로 전에 값을 할당한다.
  • 사용하는 변수를 기준으로 그룹화한다.

변수 범위의 최소화에 접근하는 방법은 개발자마다 가진 “편리함”과 “한 번에 이해 가능한 수준”에 대한 관점에 따라 다르다. 어떤 개발자는 전역 변수(전역변수지만 최근에는 금기시하므로 멤버변수로 바꿔 표기해보면 어떨까?)가 접근하기 쉽고 매개 변수 목록과 클래스의 범위 규칙을 다룰 필요가 없기 때문에 전역 변수를 사용한다.
반면에 지역으로 범위를 제한하면 훨씬 기억하거나 이해하기 쉽기 때문에 변수의 범위를 가능한 제한하는 방법을 사용한다. 기억해야하는 정보가 적을 수록 오류가 발생할 가능성이 줄어든다.
“편리함” 철학과 “한 번에 이해 가능한 수준” 철학의 차이점은 결국 프로그램을 “작성하는 것”과 “읽는 것” 중 어느 것에 중점을 둘 것인지의 문제로 귀결된다. 변수의 범위에 따라 함께 이해하기 위해 함께 봐야하는 함수가 늘어나기 때문에 범위가 크면 클수록 프로그램은 읽기가 어렵고 디버깅하기도 어려우며 수정하기도 어렵다.

생각: 코드가 읽기 어렵다면 작성자가 편의에 따라 작성한 것일 수 도 있다. 개발자는 본인이 작성할 때 편리하고 수월하게 작성되었다는 것을 느꼈다면 잘 작성된 코드라고 생각하는 경향이 있다.

결합 시점

변수와 그 값이 서로 연결된 시간을 의미하는데 프로그램의 유지 관리와 변경 용이성 면에서 광범위하게 관련된 초기화에 대한 주제에 해당한다

  • 변수와 같이 코드가 작성될때 연결되는가
    • titleBar.color = 0xff;
  • 컴파일될 때 연결되는가
    • titleBar.color = TITLE_BAR_COLOR; //static final int
  • 실행될 때 연결되는가
    • titleBar.color = ReadTitleBarColor(); //from registry

일반적으로 결합 시점이 이를 수록 유연성이 낮아지고 복잡성이 줄어든다. 반대로 늦출수록 코드는 유연해지고 복잡해진다. 코드가 복잡해질 수록 오류를 유발할 가능성이 더 높아지기 때문에 소프트웨어의 요구사항을 충족시키는 데 필요한 만큼의 유연성을 추구하면서도 필요 이상으로 추구하지는 않을 것이다.

변수를 한 가지 목적으로만 사용하라

“임시”변수가 대부분 이런 경우이다. (tmp같은 이름)

숨은 의미가 있는 변수를 피하라

  • pageCount 변수는 출력된 페이지의 수를 나타낸다. 하지만 이 값이 -1이면 오류가 발생했다는 것을 가리킨다.
  • bytesWritten 변수는 출력파일에 기록된 바이트 수이다. 하지만 이 값이 음수이면 출력 파일에 사용된 드라이브의 수를 가리킨다.

이러한 방식으로 변수를 남용하는 것을 기술적인 용어로 "하이브리드 커플링"이라고 한다. 변수가 두 가지 일을 하게 되면 한 가지 일에 대해 잘못된 형태의 값을 가질 수 있다. pageCount는 정수이면서 boolean 타입도 갖고 있는 것이다. 변수를 이중 목적으로 사용하는 것은 자신에게는 명백해 보일지라도 다른 사람에게는 그렇지 않다.

두가지 종류의 정보를 보관하기 위해서 두 개의 변수를 사용했을 때 얼마나 코드를 명확하게 만들 수 있을지 알면 놀랄 것이다. 그리고 아무도 그 때문에 추가적으로 사용한 공간을 아까워하지 않을 것이다.