목차

57. 지역변수의 범위를 최소화하라.


클린코드의 첫 걸음 최소화

[아이템 15](<https://catsbi.notion.site/3-1a9e0c15464d436d806c3713e6c4e224>)에서 소개했던 내용 [클래스와 멤버의 접근 권한을 최소화하라](<https://catsbi.notion.site/3-1a9e0c15464d436d806c3713e6c4e224>)를 다시 연상시킬 수 있는 내용이다. 아이템 57에서 소개하고자 하는 내용은 지역 변수의 유효범위도 최소화하여 코드의 가독성과 유지보수성을 올려서 오류 가능성을 낮추자는 것이다.

사실, 대부분 더 좋은 코드를 짜기 위해 공유되는 학습 자료나 책들, 강의들을 보면 공통적으로 나오는 얘기들도 결국 최소화하는 것이다. 접근범위를 최소화하고, 기능을 최소화하고, 책임도 최소화하면서 각각의 클래스, 메서드, 필드까지 각각이 최소한의 책임과 최소한의 접근 범위를 가지고 맡은 일만 다하도록함으로써 변경이나 추가, 삭제시 그 영향을 최소화하는데 있다.

지역변수는 언제 선언할까?

책에서는 다음과 같이 지역 변수의 범위를 줄이는 방법을 소개한다.

<aside> 🤖 가장 처음 쓰일 때 선언한다.

</aside>

우리가 흔히 사용하던 메서드의 최상단에 변수 선언을 하고 사용하는게 아닌 해당 변수를 사용하기 직전에 선언하라는 말인데, 조금 의아한 생각이 들 수 있다. 왜냐하면 책 클린코드의 챕터5 형식 맞추기에서는 유사성을 가진 군집으로 모아놓기를 바란다. 즉, 개념적 유사성을 가진 군집으로 묶기를 바란다고 생각할 수 있는데, 다시 생각해보면 여기서 말하는 개념적 유사성은 변수나 로직이라는 그룹이 아닌 행위에 집중해야 하지 않나 싶다. 다음 코드를 보자. 전형적으로 변수 선언은 최상단에 작성하고 로직을 작성하는 방식의 요금 계산 메서드다.

public void appendTax(List<Fee> fees, List<Integer> tax) {
	Iterator<Fee> it = fees.iterator();
	Iterator<Integer> taxIt = tax.iterator();
	List<Integer> taxPercents = null;
	List<Integer> resultFees = null;

	while(it.hasNext()){
		//logic...
	}

	//lgoic...
	while(taxIt.hasNext()){
		taxPercents.add(calculateTax(taxIt.next()));
	}

	return resultFees;
}

이 코드를 책에서 말하는 가장 처음 쓰일 때 선언하도록 리팩토링을 수행하면 어떻게 될까?

Refactoring 1. 변수 선언 위치 변경

public void appendTax(List<Fee> fees, List<Integer> tax) {
	
	Iterator<Fee> it = fees.iterator();
	while(it.hasNext()){
		//logic...
	}

	//lgoic...
	Iterator<Integer> taxIt = tax.iterator();
	List<Integer> taxPercents = new ArrayList();
	while(taxIt.hasNext()){
		taxPercents.add(calculateTax(taxIt.next()));
	}

	List<Integer> resultFees = new ArrayList();
	//logic..

  return fees.stream()
          .reduce(Fee::sum)
          .orElseThrow(RuntimeException::new);;
}

변수의 선언 위치를 최상단이 아닌 실제로 사용되는 위치 직전으로 변경해줬다. 이 리팩터링은 어떤 이점을 가질 수 있을까?

실제로 사용하는 위치에 가깝게 위치하기에 타입과 초기값에 대해 혼동하지 않을 수 있다. 그렇기에 메서드의 로직에서 사용되는 변수들이 어떤 값이였고 어떤 타입이였는지를 알기 위해 코드를 위 아래로 계속 스크롤을 움직일 필요가 없어졌다. 또한 지역변수를 선언과 동시에 초기화해준것도 알 수 있다. 초기화에 필요한 정보가 충분치 않다면 충분해질 때까지 선언을 미뤄야 한다.