Skip to content

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

@DongLee99

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();
}

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

Metadata

Metadata

Assignees

No one assigned

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions