지역 변수 — 메서드 또는 블록 본문 내에서 선언되고 존재하며 자동으로 초기화되지 않습니다. 초기화되지 않은 지역 변수를 사용하는 것은 컴파일 오류를 초래합니다.
인스턴스 변수 (static이 아닌 필드) — 각각의 객체에 개별적으로 속하며, 객체 인스턴스가 생성될 때 초기화됩니다.
정적 변수 (static 필드) — 클래스의 모든 인스턴스에 대해 공통적이며, 클래스 전체를 통틀어 단 하나의 인스턴스가 존재합니다. 하나의 객체에서의 변경은 이 클래스의 다른 모든 객체에서 보이게 됩니다.
public class Example { private int instanceVar; // 인스턴스 변수 private static int staticVar; // 정적 변수 public void foo() { int localVar = 0; // 지역 변수 } }
정적 변수는 private일 수 있으며 클래스의 서로 다른 인스턴스 간에 어떻게 보입니까?
답변: 네, 정적 변수는 private일 수 있습니다. 그 변경 사항은 클래스의 모든 인스턴스에 반영됩니다. 왜냐하면 이들은 객체가 아닌 클래스에 속하기 때문입니다.
public class MyClass { private static int counter = 0; public MyClass() { counter++; } public static int getCounter() { return counter; } }
MyClass의 여러 인스턴스를 생성하면 동일한 카운터가 증가합니다.
이야기
엔터프라이즈 애플리케이션에서 개발자는 사용자 상태를 정적 필드에 잘못 넣었습니다. 이로 인해 사용자가 다중 사용자 환경에서 서로의 데이터를 "보게" 되었습니다.
이야기
멀티스레드 애플리케이션을 작성할 때 인스턴스 변수가 적절한 동기화 없이 static 메소드 내에서 사용되었습니다. 이는 데이터 경합 및 예기치 않은 결과를 초래했습니다.
이야기
개발자는 클래스 필드 대신 지역 변수를 사용하여 중간 결과를 저장하기로 결정했습니다. 변수는 메소드 종료 후 사라졌으며 프로그램은 항상 null을 반환했습니다. 이는 테스트 중 즉시 발견되지 않았습니다.