본문 바로가기
CS/Code Complete

Chapter 10 : General Issue in Using Variables

by 아찌방 2025. 2. 2.

 

 

이 장에서는 "변수"라는 단어를 객체뿐만 아니라 정수나 배열과 같은 기본 데이터 타입을 포함하는 개념으로 사용한다. "데이터 타입"은 일반적으로 기본 데이터 타입을 의미하며, "데이터"는 객체나 기본 타입 모두를 포함하는 개념이다.


10.1 Data Literacy

 

효과적으로 데이터를 만들기 위해서는 어떤 종류의 데이터를 생성할지 파악하는 것임

그렇기에 다양한 데이터 타입을 이해하는 게 중요함.


10.2 Making Variable Declarations Easy

 

암시적 선언 -> 일부 언어에서는 변수를 명시적으로 선언하지 않아도 자동으로 됨.

이는 변수 이름이 유사하면 실수로 다른 변수를 사용할 수 있는 위험한 기능임.

 

1. 암시적 선언 기능을 끄기

2. 모든 변수를 명시적으로 선언하기

3. 일관된 네이밍 규칙 사용

4. 변수명 점검


10.3 Guidelines for Initializing Variables

 

잘못된 데이터 초기화는 프로그램 오류의 주요 원인 중 하나이다. 초기화 문제를 방지하는 효과적인 기술을 개발하면 디버깅 시간을 크게 줄일 수 있음.

 

초기화 오류가 발생하는 원인

  1. 변수가 값을 할당받지 못한 경우 : 프로그램이 시작될 때 메모리에 남아 있던 임의의 값이 변수에 저장될 수 있음.
  2. 변수의 값이 오래된 경우 : 한 번 할당된 값이 더 이상 유효하지 않음에도 그대로 사용될 수 있음
  3. 변수의 일부만 초기화된 경우
    - 객체의 일부 멤버 변수만 초기화되었을 수 있다.
    - 메모리를 할당하지 않은 포인터를 사용하여 임의의 메모리 영역을 변경하는 경우 예상치 못한 동작이 발생할 수 있다.

 

초기화 문제를 방지하는 가이드라인

1. 선언할 때 초기화하기

2. 사용하기 직전에 초기화하기

3. 상수는 final, const 키워드 사용

4. 반복문 및 누적 변수 초기화 주의

5. 클래스 멤버 변수는 생성장에서 초기화

6. 재초기화가 필요한 변수 확인 => 루프 내 변수 등

7. 이름이 있는 상수는 한 번만 초기화 => 프로그램 전체에서 사용할 함수

8. 컴파일러의 자동 초기화 기능 활용

9. 컴파일러 경고 메세지 확인

10. 입력값 유효성 검사 => 입력값을 먼저 확인 후 변수에 할당

11. 메모리 접근 검사 도구 사용 => 포인터 오류 문제 방지

12. 작업 메모리를 프로그램 시작 시 초기화 => 메모리를 일정 값으로 채워 디버깅을 용이하게 함


10.4 Scope

 

스코프(Scope)? 변수의 유명도를 나타내는 개념

=> 즉, 변수가 프로그램 내에서 얼마나 널리 사용될 수 있는지를 의미한다.

ex)

- 좁은 스코프: 특정 코드 블록(예: 반복문)에서만 사용되는 변수

- 넓은 스코프: 프로그램 전반에서 참조되는 변수 (예: 전역 변수)

 

변수 참조를 국소화(Localize References to Variables)

- 변수 참조 간의 간격이 짧을수록 코드의 가독성이 향상됨

- 변수 스팬(Span) :변수의 참조 간 거리를 측정하는 개념

=> 스팬 짧음 : 가독성 좋아짐. 

스팬 길어짐 : 추적 어려움

 

변수를 가능한 한 짧은 시간 동안 유지(Keep Variables “Live” for as Short a Time as Possible)

변수의 Live Time(활성 시간): 변수가 처음 참조된 순간부터 마지막으로 참조될 때까지의 코드 라인 수

 

최적의 스팬과 Live Time? => 

- 연구적으로 정확한 기준값은 없지만, 최소화하는 것이 최선

- 특히 전역 변수(Global Variables)는 매우 긴 Live Time과 Span을 가지므로 지양하는 것이 좋음

 

변수 범위를 최소화하는 주요 원칙:

1. 관련된 문장들 그룹화하기 => 가동성, 명확성 향상

2. 관련된 코드 블록을 별도 루핀(함수)으로 분리하기 => 가독성, 유지보수성 향상

3. 가장 제한적인 가시성부터 시작=>

- 가능하면 로컬에서 사용, 필요시에만 범위 확장

- 전역 > 클래스 > 메서드 내부

 

Comments on Minimizing Scope

변수의 범위를 최소화하는 것은

1. 코드의 가독성과 유지보수성을 향상시킴

2. 실수를 줄이는 데 중요함

즉, 코드 작성 시 편리함을 우선시하는 것이 아니라, 읽기 쉽고 관리 가능한 코드를 작성하는 것이 더 중요함

 


10.5 Persistence

 

지속성 : 데이터가 유효한 기간

종류 : 지역 < 확장(new로 생성된 변수) < 프로그램 전반(전역 변수, static) < 영구(파일, DB에 저장)

 

변수가 예상보다 더 오래 지속되거나, 종료 후 값을 사용할 경우 오류가 발생

 

예방 방법:

1. 디버그 코드나 어설션을 사용하여 값이 정상적인지 확인.

2. 사용 후 변수에 null 등의 비합리적인 값 설정.

3. 데이터가 지속되지 않는다고 가정하고 코드 작성.

4. 변수는 사용 직전에 선언하고 초기화.


10.6 Binding Time

Binding Time : 변수와 값이 결합되는 시점

 

- 이 시점이 빠를수록 코드의 유연성은 낮고, 복잡도는 적습니다.

- 명명된 상수를 사용하면 하드코딩을 피하고, 가독성과 유지보수성이 좋아짐.

- 유연성이 필요할수록 코드가 복잡해지고 오류 발생 가능성이 높아지므로, 필요한 만큼의 유연성만을 제공하는 것이 중요함.

 

Masic Numbers : 프로그램 코드에 하드코딩된 상수 값

 

titleBar.color = 0xFF;

 

이럴 경우 이게 뭘 나타내는 지 알기 어려움

 

private static final int COLOR_BLUE = 0xFF;
titleBar.color = COLOR_BLUE;

 

이렇게 하면 COLOR_BLUE라는 이름이 0xFF의 의미를 설명해주므로 코드의 가독성도 높아짐. 또한 값을 변경할 때 한 곳에서만 수정해도 됨. (유지보수 용이)


10.7 Relationship Between Data Types and Control Structures (데이터 타입과 제어 구조의 관계)

pass

1. 순차적 데이터 -> 순차적 문장

2. 선택적 데이터 -> if, else

3. 반복적 데이터 -> for, repeat, while 루프


10.8 Using Each Variable for Exactly One Purpose(각 변수를 정확히 하나의 용도로만 사용하기)

 

1. 각 변수는 하나의 용도로만 사용

2. 변수의 숨은 의미 피하기 => 다른 사람이 보기에 어려울 수 있음

3. 사용되지 않는 변수 확인 => 안 쓰는 것도 문제임

 

 

 

728x90