Skip to content

[아이템 57] 지역변수의 범위를 최소화하라 #31

Description

@DongLee99

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

이 말은 #23 의 "클래스와 멤버의 접근권한을 최소화하라" 와 취지가 비슷하다. 지역변수의 유효범위를 최소로 줄이면 코드 가독성과 유지보수성이 높아진다.

지역변수의 범위를 줄이는 가장 강력한 기법은 역시 '가장 처음 쓰일 때 선언하기' 이다.

  • 하지만 지역변수를 선언시 생각없이 선언하게 되면 변수가 쓰이는 범위보다 너무 앞서거나, 사용이 끝난 뒤에도 살아있다.

지역변수는 선언과 동시에 초기화 해야한다.

  • 만약 초기화에 필요한 정보가 부족하다면 최대한 미뤄야 한다.
  • 하지만 try-catch문은 예외이다. 변수를 초기화하는 표현식에서 검사 예외를 던질 가능성이 있다면 try 블록 안에서 초기화해야한다.
  • 변수를 초기화하는 표현식에서 검사 예외를 던질 가능성이 있다면 try 블록 안에서 초기화해야 한다. ( 그렇지 않는 다면 예외가 블록을 넘어 메서드에까지 전파 됨)

반복문에서의 초기화

반복문에서는 반복 변수의 범위가 반복문의 몸체, for 키워드와 몸체 사이의 괄호 안으로 제한된다. 따라서 while보다는 for 문 사용을 권장

Iterator<Element> i = c.iterator();
while (i.hasNext()) {
    doSomething(i.next());
}

Iterator<Element> i2 = c2.iterator();
while ( i.hasNext()) {
    doSomethingElse(i2.next());
}

두번째 while 문에는 오류가 있다. 새로운 반복 변수 i2를 초기화 했지만, 이전 while 문에서 쓴 i를 다시 쓴 것이다. i의 유효 범위는 아직 끝나지 않았기 때문에 이 코드는 컴파일도 잘 되고 실행 시 예외도 던지지 않는다.

하지만 for 문을 사용하게 된다면 이런 오류를 컴파일 타임에 잡아주므로 for문 사용을 권장하는 것 이다.

for (Iterator<Element> i = c.iterator(); i.hasNext(); ) {
    Element e = i.next();
}

// 다음 코드는 i를 찾을 수 없다. 는 컴파일 오류를 낸다.
for (Iterator<Element> i2 = c2.iterator(); i.hasNext(); ) {
     Element e2 = i2.next();
}

메서드를 작게 유지하고 한 가지 기능에 집중하라
이건 객체지향의 단일책임원칙이랑 같은 말이다. 메서드에서도 적용되므로 잘 유의해서 코드를 작성해보자.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions