10.3 변수의 초기화에 대한 지침
부적절한 초기화와 관련된 문제는 예상치 못한 초기값을 변수가 포함하고 있기 때문이다. 이러한 문제는 다음과 같은 이유로 발생할 수 있다.
- 변수에 값을 할당한 적이 없다. 이 값은 프로그램이 시작했을 때 해당 메모리 공간에 원래 있던 비트 값이 반영된 것이다.
- 변수에 있는 값이 더이상 유효하지 않다. 어떤 위치에 변수의 값을 할당했지만, 그 변수가 더 이상 유효하지 않다.
- 변수의 일부에는 값을 할당하고 나머지 부분에는 값을 할당하지 않았다.
다음과 같은 문제를 해결하기 위한 지침
- 변수가 선언될 때 초기화 한다 : 이는 방어적인 프로그래밍 방법, 초기화 오류를 막을 수 있는 좋은 방법이다.
- 변수가 처음 사용되는 곳과 근접한 위치에서 초기화하고 정의한다.
- 가능하면 final이나 const 를 사용한다 : 이는 변수가 초기화된 후에 다른 값으로 할당되는 것을 막을 수 있다.
- 카운터와 누산기를 주의한다 : 일반적인 오류는 카운터나 누산기를 다음 재사용 전에 초기화 하는 것을 잊기때문에 나타난다
- 클래스의 멤버 데이터를 생성자에서 초기화 한다 : 루틴의 변수를 각 루틴 내에 초기화 하는 것처러 ㅁ클래스의 데이터도 생성자에서 초기화 되어야 한다.
- 다시 초기화 할 필요가 있는지 검사한다
- 일단 명명된 상수를 초기화하고 실행코드로 변수를 초기화 한다. -?
- 모든 변수들을 자동으로 초기화 해주는 컴파일러 설정을 사용한다.
- 컴파일러 경고 메시지 활용
- 입력매개변수의 타당성 검사
- 부적절한 포인터를 검사하기 위해 메모리 접근 도구를 사용한다
- 포르그램 시작시 작업 메모리 초기화한다
10.4 범위
- 변수에 대한 참조를 지역화하라 : 변수에 대한 참조를 가까이 유지하는 것은 프로그램의 가독성을 향상시키는데 좋다. 얼마나 가까이 모여있는지를 측정할 수 있는 방법중 하나는 "폭(span)"을 계산하는 것이다. 즉 폭이 짧을 수록 좋다.
- 변수의 "수명"을 가능한 짧게 유지한다 - 변수의 수명은 변수가 처음 참조되는 명령문에서 시작하고, 변수가 참조되는 마지막 명령문에서 끝난다. "긴 수명"은 변수가 여러 명령들에 걸쳐 살아있다는 것을 의미하고 "짧은 수명"은 변수가 몇 개의 명령문 동안에만 살아 있다는 것을 의미한다. 폭과 같이 수명에 관한 목표는 숫자를 낮추는 것, 변수의 수명을 짧게 유지하는 것이다. 이에 관한 이득은 1) 취약성의 창을 줄일수 있다. 즉 변수의 값을 변경하는 위치 사이에서 변수가 부정확하게 또는 부주의하게 변경되는 가능성을 줄인다. 2)초기화 오류를 줄인다. 3) 가독성을 높인다 4) 큰 루틴을 작은 루틴으로 나눌때 용이하다.
즉 폭과 수명을 최소화 시키는 것이 좋다. 범위를 최소화 하기 위한 일반적인 지침을알아보자.
- 루프에서 사용되는 변수는 루프를 포함하고 있는 루틴의 시작에서가 아니라 루프 바로 앞에서 초기화한다
- 변수를 사용하기 전까지 변수에 값을 할당하지 않는다
- 연관된 명령문들은 그룹화 한다(같은 변수를 사용하는 것 끼리 그룹화...)
- 필요한 경우에만 변수의 범위를 늘린다. - 변수의 범위를 최소화 하는 방법은 변수를 가능한 지역화 하는 것이다. 클래스 변수를 전역변수로 바꾸는 것보다 전역 변수를 클래습 변수로 바꾸는 것이 더 어렵다. 또한 protected 데이터 멤버를 private 멤버로 바꾸는 것이 더 어렵다.
- *의문이 들때는 가능한 가장 작은 범위를 선택하도로고 하고, 특정한 루프로 제한하고, 개별적인 루틴으로 제한하고, 클래스에 대해서 private를 그 다음이 protected를 그 다음이 package를 그리고 최후에 수단에만 전역을 사용한다*
10.5 지속성
지속성은 데이터 수명을 나타내는 다른 말로 변수들은 다음과 같은 지속성을 가질 수 있다.
- 특정한 코드 블록이나 루틴에서만 살아남는 경우 : 지역변수
- 허용한 동안 살아남는 경우 : 자바에서 new로 생성된 변수는 가비지 컬렉션 (garbage collection)이 발생할 때까지 살아남는다
- 프로그램이 종료할 때까지 살아남는 경우 : 대부분의 전역변수, 정적변수(static변수)
- 영원히 살아남는 경우 : 데이타 베이스에 저장한 값.
10.6 바인딩 시간
바인딩 시간 (Binding Time)은 변수와 값이 서로 연결되는 시간을 의미한다.
변수와 값이 코드가 작성될때? 컴파일 될때? 로드될때? 프로그램이 실행될 때 연결 되는가?
가능한 바인딩 시간을 늦추는 것이 복잡성은 늘어나지만 코드의 유연성이 높아지기 때문에 좋다. (반인딩 시간이 이를 수록 유연성과 복잡성은 낮아진다)
10.8 변수를 한 목적으로만 사용하는 방법
- 변수는 한 목적으로만.
- 선언된 변수가 모두 사용되는지 확인.
** 변수 사용시 Check List **
변수초기화
- 각 루틴이 입력 매개변수의 타당성을 검사하는가?
- 변수가 처음 사용된 곳에 가까운 위치에서 선언되었는가?
- 가능하면 변수가 선언될 때 초기화 하고 있는가?
- 3번이 불가하다면 변수가 처음 사용된 곳과 가까운 위치에 변수를 초기화 했나?
- 카운터와 누산기가 적절하게 초기화되고, 필요할 경우 사용될 때마다 다시 초기화되는가?
- 변수가 반복적으로 실행되는 코드에서 적절하게 초기ㅗ하 되는가?
- 코드를 컴파일 할때 컴파일 경고가 발생하지 않는가? 그리고 모든 경고를 활성화 하였는가?
데이터 사용에 대한 일만적인 문제
- 모든 변수가 가능한 작은 범위를 갖는가?
- 변수에 대한 참조가 폭과 전체 수명의 관점에서 가깜께 유지되는가?
- 제어구조가 데이터 형과 일치하는가?
- 선언된 모든 변수가 사용되는가?
- 모든 변수가 적절한 시간에 바인딩 되는가?
- 각 변수가 오직 하나의 목적을 갖고 있ㄴ는가?
- 각 변수의 의미가 명확한가?
[출저:Code Complete, SteveMcConnel]
댓글 없음:
댓글 쓰기