////
Search
Duplicate
🔑

10. 변수 사용 시 고려할 사항

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) 직원의 이름, 주민등록번호, 주소, 전화번호, 나이를 파일에서 읽어들인다면 파일로부터 순차적인 데이터를 읽기 위한 명령문을 작성할 것이다.
선택적 데이터는 프로그램에서 ifcase 명령문으로 변환한다.
선택적 데이터는 특정한 시점에 여러 개의 데이터 중 하나만 사용되는 데이터 집합을 말한다.
이에 해당하는 프로그램 명령문은 실제로 데이터를 선택해야하므로 if-then-elsecase 문으로 구성된다.
⇒ ex) 직원의 급료를 처리해야하는 프로그램은 시급, 월급에 따른 계산 시 선택적으로 동작할 것이다.
반복되는 데이터는 프로그램에서 for, repeat, while 루프 구조로 변환한다.
반복되는 데이터는 여러 번 반복되는 같은 형식의 데이터다.
전형적으로 반복되는 데이터는 컨테이너의 요소나 파일의 레코드, 배열의 요소로 저장된다.
⇒ ex) 파일에서 읽어들이는 주민등록번호 목록이 있을 수 있겠다.
실제 데이터는 순차적, 선택적, 반복적힌 형태의 데이터가 혼합된 형태일 수 있다. 더 복잡한 데이터형을 기술하기 위해서 간단한 코드 블록을 결합할 수 있다.
프로그래밍은 순차, 분기, 반복이므로 딱 셋만 나온 것 같다.

8. 변수를 한 가지 목적으로만 사용하기

각 변수를 한 가지 목적만을 위해서 사용하라.
때때로 사용했던 변수를 다른 위치에서 다른 목적으로 사용하고 싶을 때가 있다. 이는 보통 좋지 않은 경우에 해당한다.
숨은 의미가 있는 변수를 피하라.
숨은 의미가 있는 변수를 기술적인 용어로 하이브리드 커플링이라고 한다. 변수가 두 가지 책임을 가지게 되면 하나의 책임에 대해 잘못된 형태의 값을 가질 수 있다.
선언된 모든 변수를 사용하는지 확인하라.
변수를 둘 이상의 목적으로 사용하는 것만큼 안 좋은 것이 변수를 사용하지 않는 것이다.

요점 정리

데이터 초기화는 오류가 발생하기 쉽기 때문에 예상치 못한 초기 값으로 인해서 발생하는 문제를 피하기 위하여 이장에서 설명한 초기화 기법을 사용한다.
각 변수의 범위를 최소화한다. 변수에 대한 참조를 가까이 두며 메소드나 클래스로 제한하고 전역 데이터는 전혀 사용하지 않는다.
같은 변수를 사용하는 명령문은 가능한 가까이에 둔다.
초기에 결합하면 유연성이 떨어지지만 복잡도가 낮아지고 늦게 결합하면 유연성이 올라가지만 복잡해진다.
변수는 한 가지 목적으로만 사용해야 한다.