Skip to content

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

@byunghyunkim0

Description

@byunghyunkim0

Chapter : 9. 일반적인 프로그래밍 원칙

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

Assignee : byunghyunkim0


🍑 서론

지역변수의 유효 범위를 최소로 줄이면 코드 가독성과 유지보수성이 높아지고 오류 가능성은 낮아진다.

🍑 본론

지역변수의 범위를 줄이는 기법

1. 가장 처음 쓰일 때 선언하기

  • 지역변수의 범위를 줄이는 가장 강력한 기법이다.
  • 미리 선언부터 해두면 변수를 사용하는 시점에 타입과 초기값이 기억나지 않을 수도 있다.
  • 지역변수의 범위는 선언된 지점부터 그 지점을 포함한 블록이 끝날 때까지 이므로, 실제 사용하는 블록 바깥에 선언된 변수는 블록이 끝난 뒤까지 살아 있게 된다.

2. 거의 모든 지역변수는 선언과 동시에 초기화하기

  • 초기화에 필요한 정보가 충분하지 않다면 충분해질 때까지 선언을 미뤄야 한다.
  • try-catch문은 이규칙에서 예외
    • 변수를 초기화하는 표현식에서 검사 예외를 던질 가능성이 있다면 try 불록 안에서 초기화해야 한다.
    • 변수 값을 try 블록 바깥에서도 사용해야 한다면 try블록 앞에서 선언
    // 리플렉션으로 활용한 인스턴스화 데모
    public class ReflectiveInstantiation {
        public static void main(String[] args) {
            // 클래스 이름을 Class 객체로 변환
            Class<? extends Set<String>> cl = null;
            try {
                cl = (Class<? extends Set<String>>)  // 비검사 형변환!
                        Class.forName(args[0]);
            } catch (ClassNotFoundException e) {
                fatalError("클래스를 찾을 수 없습니다.");
            }
    
            // 생성자를 얻는다.
            Constructor<? extends Set<String>> cons = null;
            try {
                cons = cl.getDeclaredConstructor();
            } catch (NoSuchMethodException e) {
                fatalError("매개변수 없는 생성자를 찾을 수 없습니다.");
            }
            ....
    }

3. while 문 보다는 for (for-each)문을 사용하라

  • 반복문은 변수 범위를 최소화해준다.
  • 반복 변수의 값을 반복문이 종료된 뒤에도 써야 하는 상황이 아니라면 while 문보다는 for 문을 쓰는 편이 좋다.
Iterator<Element> i = c.iterator();
while (i.hasNext()) {
    doSomething(i.next());
}
...
Iterator<Element> i2 = c.iterator();
while (i.hasNext()) { // 버그
    doSomething(i2.next());
}
  • i의 유효 범위가 끝나지 않았으므로, 컴파일시 오류가 발생하지 않는다.
for (Iterator<Element> i = c.iterator(); i.hasNext(); ) {
    Element e = i.next();
    ... // e와 i로 무언가를 한다.
}
...
// 다음 코드는 "i를 찾을 수 없다"는 컴파일 오류를 낸다.
for (Iterator<Element> i2 = c2.iterator(); i.hasNext(); ) {
    Element e2 = i2.next();
    ... // e2와 i2로 무언가를 한다.
}
  • 똑같은 이름의 변수를 여러 반복문에서 써도 서로 아무런 영향을 주지 않는다.

4. 메서드를 작게 유지하고 한 가지 기능에 집중하기

  • 메서드에서 여러 가지 기능을 처리한다면 그 중 한 기능과 관련된 지역변수라도 다른 기능을 수행하는 코드에서 접근할 수 있다.
  • 메서드를 기능별로 쪼개면 됨

🍑 결론


Referenced by

Metadata

Metadata

Assignees

Labels

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions