2. 변수 선언을 쉽게 만드는 방법
•
변수 선언 작업을 효율적으로 진행하는 방법을 소개한다.
•
암시적 선언은 사용하지 않는 것이 좋다.
◦
암시적 선언은 변수를 선언하지 않고 사용했을때, 컴파일러가 임의로 변수를 선언해주는 것이다.
•
모든 변수를 선언하는 것이 좋다.
•
이름 규칙을 정하고 사용하자.
◦
Num, No와 같이 자주 사용되는 접미사에 대한 이름 규칙을 일관성있게 결정한다.
•
변수의 이름을 검사한다.
3. 변수 초기화 가이드라인
•
부적절한 초기화는 가장 많이 오류를 발생시키는 원인 중 하나다. 초기화 문제를 해결하기 위한 효과적인 기법을 개발하면 디버깅 시간을 줄일 수 있다.
•
변수를 선언할 때 초기화한다.
◦
변수를 선언할 때 초기화하는 것은 저렴한 비용의 방어적 프로그래밍 기법이며 초기화 오류를 쉽게 막을 수 있는 좋은 방법이다.
•
변수가 처음 사용되는 곳 그처에서 초기화한다.
◦
변수를 사용하는 곳과 초기화하는 곳이 떨어져있다면 우리는 그 값이 무엇이고 어떤 연산을 수행할 지 알수 없게 된다.
•
이상적으로 각 변수가 처음 사용되는 곳 가까이에서 변수를 초기화하고 정의하다.
•
가능하다면 final이나 const를 사용한다.
◦
변수가 초기화된 후, 다른 값으로 변경될 여지를 막는 방법들은 대체로 좋은 오류 방지 기법이다.
◦
카운터와 누산기를 특히 주의한다.
•
클래스의 멤버 데이터를 생성자에서 초기화한다.
•
입력 매개변수의 유효성을 검사한다.
4. 범위
변수에 대한 참조를 지역화하라
•
변수의 초기화와 참조 사이에 있는 코드는 취약한 구간이다.
•
이 구간에서는 새로운 코드가 변수의 값을 변경하거나 코드를 읽는 사람에게 혼동을 줄 수 있는 내용들이 들어갈 수 있다.
•
지역화하라는 의미는 변수에 대한 참조가 가까이 모여있게 하라는 의미다.
변수의 수명을 가능한 짧게 유지한다
•
변수의 범위와 관련된 또 다른 개념 중 하나인 변수가 살아있는 동안의 명령문 수인 변수의 수명이다.
◦
변수의 수명은 변수가 참조되는 첫 번째 명령문에서 시작하고 변수가 참조되는 마지막 명령문에서 종료된다.
•
변수의 수명을 짧게 유지하면 얻는 장점들은 다음과 같다.
◦
취약 구간을 줄일 수 있다. 변수의 값을 변경되려는 요소가 줄어드므로 당연하다.
◦
코드를 쉽게 이해할 수 있다. 변수의 값이 가까이에 위치하므로 변수를 사용한 연산들이 어떻게 처리되는지 이해하기 쉽다.
◦
메소드를 분리해내기 쉽다.
범위를 최소화하기 위한 일반적인 가이드라인
•
다음은 범위를 최소하하기 위해서 사용할 수 있는 몇 가지 구체적인 가이드라인이다.
•
루프에서 사용되는 변수는 루프를 포함하고 있는 메소드의 시작이 아니라 루프 바로 앞에서 초기화한다.
•
변수를 사용하기 바로 전까지 변수에 값을 할당하지 않는다.
◦
할당하는 위치를 일관성있게 유지하라는 의미같다.
•
연관된 명령문을 그룹화하고 별도의 메소드로 나눈다.
•
처음에는 범위를 보수적으로 정하고 필요한 경우 점차 늘려나간다.
5. 지속성
•
지속성은 데이터의 수명을 나타내는 또 다른 단어다. 지속성에는 여러 형태가 존재하며 변수는 다음과 같은 지속성을 가질 수 있다.
◦
특정한 코드 블록이나 메소드에서만 살아있는 경우
◦
특정 기간만 살아있는 경우, 자바의 new 키워드를 사용해 생성된 변수
◦
프로그램과 생명주기를 같이하는 경우
◦
영속성을 가지는 경우
•
지속성의 가장 큰 문제는 변수가 실제보다 더 오랫동안 남아있는 경우 발생한다.
◦
내가 생각했던 수명보다 더 길게 살아있다면 그것이 내가 아는 그것이라고 부를 수 있을까..?
•
다음은 이러한 문제를 피하기 위한 방법이다.
◦
중요한 변수가 적절한 값을 갖는지 검사하기 위해서 프로그램에 디버그 코드나 어설션을 사용한다. 값이 적절하지 않다면 부적절한 초기화 코드를 찾게끔 경고 메시지를 이용해 유도한다.
◦
모든 데이터를 사용하기 바로 직전에 선언하고 초기화하는 습관을 들인다.
6. 결합 시점
•
결합 시점은 변수의 참조와 그 값이 서로 연결된 시간을 의미한다.
◦
참조와 그 값이 서로 연결되는 시점을 늦추는 것이 이로울 것이다. 일반적으로 결합 시점을 늦출수록 코드는 유연해진다.
•
다음은 결합 시점이 가장 이른 예로 코드를 작성할 때 결합되는 예다.
titleBar.color = 0xFF;
TypeScript
복사
◦
0xFF 값은 프로그램에 직접 작성된 리터럴이기 때문에 코드가 작성될 때, titleBar.color와 결합한다.
◦
이처럼 코드를 통해 결합하는 것은 0xFF 값이 변경될 때 다른 곳에서 같은 의미로 사용된 0xFF와의 의미론적 결합이 깨지므로 좋지 않은 방법이다.
•
다음 예제는 이보다 약간 더 늦은 시간에 결합되는 것으로 코드가 컴파일될 때 결합된다.
private static final int COLOR_BLUE = 0xFF;
private static final int TITLE_BAR_COLOR = COLOR_BLUE;
titleBar.color = TITLE_BAR_COLOR;
TypeScript
복사
◦
TITLE_BAR_COLOR는 상수로 컴파일러가 컴파일 시 값으로 대체하기 위한 표현식이다.
◦
이는 0xFF보다 추상적이므로 코드를 읽기 더 쉬워진다.
•
다음은 앞의 예제보다 좀 더 늦은 시간인 실행 시 결합되는 예제다.
titleBar.color = ReadTitleBarColor();
TypeScript
복사
◦
런타임 중에 자바의 속성 파일로부터 값을 읽는 메소드다.
◦
이 코드는 값을 직접 입력한 코드보다 훨씬 읽기 쉽고 유연하다.
•
요약하자면 변수가 값에 결합될 수 있는 시점들은 다음과 같다.
◦
코드 작성 시
◦
컴파일 시
◦
적재 시
◦
객체 생성 시
◦
객체 사용 시
•
일반적으로 결합 시점이 이를수록 유연성이 낮고 복잡성이 줄어든다. 특정 시점이 무조건 좋은 것은 아니며 요구사항을 생각해서 선택하는 것이 좋다.
7. 데이터형과 제어 구조 사이의 관계
•
순차적 데이터는 프로그램의 순차적 명령문으로 변환한다.
◦
순차적 데이터는 특정한 순서로 사용된 데이터의 집합으로 구성된다.
◦
서로 다른 5개의 값을 처리하는 5개의 명령문을 일렬로 작성했다면 그 명령문은 순차적인 명령문이다.
⇒ ex) 직원의 이름, 주민등록번호, 주소, 전화번호, 나이를 파일에서 읽어들인다면 파일로부터 순차적인 데이터를 읽기 위한 명령문을 작성할 것이다.
•
선택적 데이터는 프로그램에서 if와 case 명령문으로 변환한다.
◦
선택적 데이터는 특정한 시점에 여러 개의 데이터 중 하나만 사용되는 데이터 집합을 말한다.
◦
이에 해당하는 프로그램 명령문은 실제로 데이터를 선택해야하므로 if-then-else나 case 문으로 구성된다.
⇒ ex) 직원의 급료를 처리해야하는 프로그램은 시급, 월급에 따른 계산 시 선택적으로 동작할 것이다.
•
반복되는 데이터는 프로그램에서 for, repeat, while 루프 구조로 변환한다.
◦
반복되는 데이터는 여러 번 반복되는 같은 형식의 데이터다.
◦
전형적으로 반복되는 데이터는 컨테이너의 요소나 파일의 레코드, 배열의 요소로 저장된다.
⇒ ex) 파일에서 읽어들이는 주민등록번호 목록이 있을 수 있겠다.
•
실제 데이터는 순차적, 선택적, 반복적힌 형태의 데이터가 혼합된 형태일 수 있다. 더 복잡한 데이터형을 기술하기 위해서 간단한 코드 블록을 결합할 수 있다.
•
프로그래밍은 순차, 분기, 반복이므로 딱 셋만 나온 것 같다.
8. 변수를 한 가지 목적으로만 사용하기
•
각 변수를 한 가지 목적만을 위해서 사용하라.
◦
때때로 사용했던 변수를 다른 위치에서 다른 목적으로 사용하고 싶을 때가 있다. 이는 보통 좋지 않은 경우에 해당한다.
•
숨은 의미가 있는 변수를 피하라.
◦
숨은 의미가 있는 변수를 기술적인 용어로 하이브리드 커플링이라고 한다. 변수가 두 가지 책임을 가지게 되면 하나의 책임에 대해 잘못된 형태의 값을 가질 수 있다.
•
선언된 모든 변수를 사용하는지 확인하라.
◦
변수를 둘 이상의 목적으로 사용하는 것만큼 안 좋은 것이 변수를 사용하지 않는 것이다.
요점 정리
•
데이터 초기화는 오류가 발생하기 쉽기 때문에 예상치 못한 초기 값으로 인해서 발생하는 문제를 피하기 위하여 이장에서 설명한 초기화 기법을 사용한다.
•
각 변수의 범위를 최소화한다. 변수에 대한 참조를 가까이 두며 메소드나 클래스로 제한하고 전역 데이터는 전혀 사용하지 않는다.
•
같은 변수를 사용하는 명령문은 가능한 가까이에 둔다.
•
초기에 결합하면 유연성이 떨어지지만 복잡도가 낮아지고 늦게 결합하면 유연성이 올라가지만 복잡해진다.
•
변수는 한 가지 목적으로만 사용해야 한다.